聊天視窗

資料科學實戰:從數據到洞察 - 第 5 章

5. 基礎機器學習模型

發布於 2026-02-27 05:33

# 5. 基礎機器學習模型 本章聚焦於 **監督式** 與 **非監督式** 基礎模型,並說明其評估指標、交叉驗證與實務落地。透過實際案例與 Python 代碼,幫助讀者快速掌握模型構建與評估的關鍵步驟。 --- ## 5.1 監督式學習(Supervised Learning) 監督式學習以「已標註」資料為基礎,學習映射函數 \(f: X \rightarrow y\)。常見任務包括迴歸與分類。 ### 5.1.1 迴歸(Regression) | 模型 | 典型使用情境 | 優缺點 | |------|--------------|--------| | 線性迴歸 | 房價預測、利率預測 | 易解釋,對異常值敏感 | | 決策樹迴歸 | 銷售額預測 | 可處理非線性,容易過擬合 | | 隨機森林迴歸 | 信用評分 | 高準確度,特徵重要性可解釋 | #### 範例:線性迴歸 python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 讀取資料 X = pd.read_csv('data/house_prices.csv').drop(columns=['price']) y = pd.read_csv('data/house_prices.csv')['price'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LinearRegression() model.fit(X_train, y_train) pred = model.predict(X_test) print('MSE:', mean_squared_error(y_test, pred)) print('R2:', r2_score(y_test, pred)) > **注意**:線性迴歸假設特徵與目標之間為線性關係,實務中往往需要先做特徵擴展(多項式)或使用正則化(Ridge/ElasticNet)以提升模型魯棒性。 ### 5.1.2 分類(Classification) | 模型 | 典型使用情境 | 優缺點 | |------|--------------|--------| | 邏輯迴歸 | 試驗金額風險、信貸審批 | 簡單易解釋,對非線性關係不足 | | 支援向量機 | 欺詐偵測、客戶分群 | 高維資料表現好,參數調整較複雜 | | 隨機森林 | 產品推薦、信用分數 | 抗噪聲,特徵重要性可視化 | | 梯度提升樹(XGBoost) | 金融風控、行銷預測 | 高精度,易過擬合,需要正則化 | #### 範例:隨機森林分類 python from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix X = pd.read_csv('data/loan_data.csv').drop(columns=['default']) y = pd.read_csv('data/loan_data.csv')['default'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) clf = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42) clf.fit(X_train, y_train) pred = clf.predict(X_test) print(confusion_matrix(y_test, pred)) print(classification_report(y_test, pred)) > **實務小貼士**:金融資料常呈現類別不平衡,建議使用 **SMOTE**、**類別權重** 或 **Cost‑Sensitive Learning** 來平衡模型。 --- ## 5.2 非監督式學習(Unsupervised Learning) 非監督式學習不依賴標籤,主要目的是發掘資料內在結構,例如聚類、降維與異常偵測。 ### 5.2.1 聚類(Clustering) | 方法 | 典型使用情境 | 優缺點 | |------|--------------|--------| | K‑Means | 客戶分群、商品組合 | 計算快速,對初始中心敏感 | | 層次聚類 | 市場細分、組織結構 | 可視化樹狀圖,計算成本高 | | DBSCAN | 異常偵測、地理熱點 | 不需預先設定 K,能捕捉任意形狀 | #### 範例:K‑Means python from sklearn.cluster import KMeans import matplotlib.pyplot as plt X = pd.read_csv('data/customer_features.csv').drop(columns=['customer_id']) kmeans = KMeans(n_clusters=4, random_state=42) labels = kmeans.fit_predict(X) plt.scatter(X['feature1'], X['feature2'], c=labels, cmap='viridis') plt.title('K‑Means Clustering') plt.show() > **提示**:使用 **Elbow** 或 **Silhouette** 指標來確定最佳 K 值。 ### 5.2.2 降維(Dimensionality Reduction) | 方法 | 典型使用情境 | 優缺點 | |------|--------------|--------| | PCA | 資料可視化、去噪 | 只保留線性關係,解釋性有限 | | t‑SNE / UMAP | 高維資料可視化 | 計算複雜,難以擴充至大型資料集 | #### 範例:PCA 可視化 python from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X) plt.scatter(X_pca[:,0], X_pca[:,1]) plt.title('PCA 2‑D Projection') plt.xlabel('PC1') plt.ylabel('PC2') plt.show() --- ## 5.3 評估指標(Evaluation Metrics) | 任務 | 指標 | 公式 | |------|------|------| | 迴歸 | MSE(平均平方誤差) | \(\frac{1}{n}\sum (y_i-\hat y_i)^2\) | | 迴歸 | RMSE | \(\sqrt{MSE}\) | | 迴歸 | R²(決定係數) | \(1-\frac{SS_{res}}{SS_{tot}}\) | | 分類 | Accuracy | 正確預測數 / 總數 | | 分類 | Precision | TP / (TP+FP) | | 分類 | Recall(召回率) | TP / (TP+FN) | | 分類 | F1‑Score | 2·(Precision·Recall)/(Precision+Recall) | | 分類 | ROC‑AUC | 曲線下的面積 | > **跨領域實務**:在信用風控中,**Recall**(能否捕捉到所有違約客戶)往往比 Accuracy 更重要;在投資組合優化,**R²** 與 **Adjusted R²** 能幫助判斷特徵解釋度。 --- ## 5.4 交叉驗證(Cross‑Validation) 交叉驗證可有效評估模型在未知資料上的泛化能力。常見方法: - **K‑Fold CV**:將資料分成 K 個子集,輪流作為測試集。 - **Stratified K‑Fold**:對分類任務保持類別比例。 - **Repeated CV**:重複多次 CV,降低隨機性。 python from sklearn.model_selection import cross_val_score, StratifiedKFold clf = LogisticRegression(max_iter=1000, random_state=42) cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(clf, X, y, cv=cv, scoring='roc_auc') print('CV ROC‑AUC:', scores.mean(), '\u00B1', scores.std()) --- ## 5.5 實務落地技巧 | 主題 | 建議實踐 | |------|----------| | 資料分割 | 使用 **train_test_split** + **stratify** 以維持類別比例 | | 特徵縮放 | 所有基於距離或正則化的模型(K‑Means, SVM, 線性/邏輯迴歸)均需先做 StandardScaler / MinMaxScaler | | 資料平衡 | 針對類別不平衡資料使用 **SMOTE**、**類別權重** 或 **集成方法** | | 模型持續監測 | 設置 **漂移檢測** (e.g., Kolmogorov‑Smirnov test) 以判斷模型是否失效 | | 版本管理 | 用 **MLflow** 或 **DVC** 跟蹤模型、特徵表與數據版本 | | 可解釋性 | 使用 **SHAP** 或 **Permutation Importance** 進行特徵重要性分析 | --- ## 5.6 小結 - **迴歸**:從線性迴歸到樹基模型,重點是 **特徵選擇** 與 **正則化**。 - **分類**:類別不平衡是金融資料的典型挑戰,需透過重採樣或類別權重來處理。 - **聚類**:K‑Means 與 DBSCAN 是最常用的分群方法,選擇合適的 **距離度量** 與 **核心參數** 直接影響結果。 - **評估**:對於迴歸使用 **MSE / RMSE / R²**;對於分類使用 **Accuracy / Precision / Recall / F1 / ROC‑AUC**;對於聚類使用 **Silhouette** 或 **Calinski‑Harabasz**。 - **交叉驗證**:Stratified K‑Fold 能維持類別分佈,對於不平衡資料特別重要。 - **可持續開發**:將數據前處理、縮放、模型訓練與評估包裝在 **Pipeline** 中,並使用 **MLflow** 或 **DVC** 進行版本管理,確保模型可重複、可追蹤。 --- > **下一章**:模型選擇、超參數優化與可解釋性評估。