聊天視窗

數據科學全能指南:從數據到洞察 - 第 5 章

第五章:機器學習基礎

發布於 2026-02-22 23:12

# 第五章:機器學習基礎 在資料科學的工作流程中,機器學習(Machine Learning)是將資料轉化為預測模型的核心技術。本章將從基礎概念說起,帶你逐步了解監督式與非監督式學習、常見演算法、模型評估與交叉驗證,以及實務中的最佳實踐。內容將以理論與實際 Python 代碼相結合,方便你快速上手並在業務場景中落地。 --- ## 1. 監督式學習(Supervised Learning) 監督式學習是指「輸入 + 目標輸出」的學習過程,模型學習從特徵(features)映射到目標(label)。 | 目標類型 | 典型問題 | 常見演算法 | |---|---|---| | **回歸(Regression)** | 房價預測、股價預測 | 線性回歸、Lasso、Ridge、Decision Tree Regressor、Random Forest Regressor、XGBoost、LightGBM | | **分類(Classification)** | 客戶是否流失、垃圾郵件偵測 | 邏輯迴歸、KNN、SVM、決策樹、隨機森林、Gradient Boosting、神經網路 | > **註記**:雖然許多演算法本身可做分類或回歸,但在實務上往往會根據問題類型調整參數或使用特定損失函數。 ### 1.1 線性回歸 最簡單且解釋性最好的回歸模型: python from sklearn.linear_model import LinearRegression X = df[['sqft', 'bedrooms']] # 特徵 y = df['price'] # 目標 model = LinearRegression().fit(X, y) print(f'係數: {model.coef_}') ### 1.2 邏輯迴歸 用於二元分類問題,輸出 0/1 或概率值。 python from sklearn.linear_model import LogisticRegression X = df[['age', 'income']] y = df['churn'] # 0: 留存 1: 離開 model = LogisticRegression(max_iter=1000).fit(X, y) ### 1.3 決策樹與集成方法 - **決策樹**:易於解釋,但易過擬合。 - **隨機森林**:多棵樹投票,減少過擬合。 - **Gradient Boosting**:逐步修正錯誤,性能優秀(如 XGBoost、LightGBM)。 python from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=200, random_state=42).fit(X, y) ### 1.4 支持向量機(SVM) 適合高維數據,使用核函數可處理非線性關係。 python from sklearn.svm import SVC svc = SVC(kernel='rbf', probability=True).fit(X, y) ### 1.5 k-近鄰(k‑NN) 基於距離度量的懶惰學習,簡單且可解釋。 python from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=5).fit(X, y) ## 2. 非監督式學習(Unsupervised Learning) 無需目標輸出,主要用於結構探索、特徵降維和聚類。 | 目的 | 典型演算法 | |---|---| | **聚類(Clustering)** | K‑Means、DBSCAN、Hierarchical Clustering | | **降維(Dimensionality Reduction)** | PCA、t‑SNE、UMAP | python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, random_state=42).fit(X) > **實務提示**:在聚類前,務必對特徵進行標準化(`StandardScaler`),否則尺度差異會影響距離度量。 ## 3. 模型評估指標 ### 3.1 分類評估 | 指標 | 公式 | 何時使用 | |---|---|---| | **Accuracy** | (TP+TN)/(TP+TN+FP+FN) | 樣本均衡時使用 | | **Precision** | TP/(TP+FP) | 需要抑制假陽性時使用 | | **Recall** | TP/(TP+FN) | 需要抑制假陰性時使用 | | **F1‑Score** | 2·(Precision·Recall)/(Precision+Recall) | Precision & Recall 同等重要 | | **ROC‑AUC** | 曲線下方面積 | 評估概率模型,對類別不均衡友好 | python from sklearn.metrics import classification_report, roc_auc_score print(classification_report(y_true, y_pred)) print('ROC‑AUC:', roc_auc_score(y_true, y_proba)) ### 3.2 回歸評估 | 指標 | 公式 | 何時使用 | |---|---|---| | **MSE** | \(\frac{1}{n}\sum (y_i-\hat y_i)^2\) | 應對大誤差敏感 | | **RMSE** | \(\sqrt{MSE}\) | 直觀解釋誤差 | | **MAE** | \(\frac{1}{n}\sum |y_i-\hat y_i|\) | 對極端值不敏感 | | **R²** | 1 - SS_res/SS_tot | 變異解釋比例 | python from sklearn.metrics import mean_squared_error, r2_score print('RMSE:', mean_squared_error(y_true, y_pred, squared=False)) print('R²:', r2_score(y_true, y_pred)) ## 4. 交叉驗證(Cross‑Validation)與模型選擇 直接用訓練集評估模型易導致過擬合,交叉驗證能更真實評估泛化能力。 python from sklearn.model_selection import KFold, cross_val_score kf = KFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(rf, X, y, cv=kf, scoring='accuracy') print('CV Accuracy:', scores.mean(), '+/-', scores.std()) ### 4.1 Grid Search 與 Random Search python from sklearn.model_selection import GridSearchCV param_grid = {'n_estimators': [100, 200], 'max_depth': [None, 10, 20]} grid = GridSearchCV(rf, param_grid, cv=5, scoring='accuracy').fit(X, y) print('Best params:', grid.best_params_) ### 4.2 交叉驗證策略 - **K‑Fold**:最常用,隨機分層可保證各折樣本比例。 - **StratifiedKFold**:對分類問題保持類別比例。 - **Leave‑One‑Out (LOO)**:適合小樣本,計算量大。 - **TimeSeriesSplit**:時序資料,避免未來信息泄露。 ## 5. 實務技巧與常見陷阱 | 觀察 | 建議 | |---|---| | **資料不平衡** | 重新採樣(SMOTE、undersampling)、使用類別權重、切換評估指標(F1、AUC)。 | | **特徵泄漏(Leakage)** | 檢查目標中是否含有將來信息;在特徵工程中去除或延遲特徵。 | | **過度擬合** | 進行特徵選擇、使用正則化、增加訓練數據、簡化模型、交叉驗證。 | | **模型可解釋性** | 需求業務解釋時,先試簡單模型;若需高精度,搭配 SHAP / LIME 做特徵重要性說明。 | | **計算資源** | 大規模資料時,先做樣本下采樣或使用 GPU 加速的 LightGBM。 | | **重複實驗** | 固定 `random_state`、記錄實驗配置,使用 `MLflow` 或 `Weights & Biases` 做版本管理。 | ## 6. 案例:信用卡欺詐偵測 > **場景說明**:金融機構需要預測交易是否為欺詐,以降低損失。目標類別極度不平衡(欺詐 0.2%)。 python # 1. 資料前處理 from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split, StratifiedKFold from imblearn.over_sampling import SMOTE X = train_df.drop(columns=['is_fraud', 'transaction_id']) y = train_df['is_fraud'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42) scaler = StandardScaler().fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) # 2. 重採樣 smote = SMOTE(random_state=42) X_res, y_res = smote.fit_resample(X_train, y_train) # 3. 模型:XGBoost import xgboost as xgb model = xgb.XGBClassifier(scale_pos_weight=(len(y_res)-y_res.sum())/y_res.sum(), eval_metric='auc').fit(X_res, y_res) # 4. 評估 from sklearn.metrics import roc_auc_score y_proba = model.predict_proba(X_test)[:, 1] print('Test ROC‑AUC:', roc_auc_score(y_test, y_proba)) > **重點**: > 1. `scale_pos_weight` 自動調整類別權重,減少手動重新採樣的風險。 > 2. 使用 `eval_metric='auc'` 直接優化 ROC‑AUC,對不平衡資料友好。 > 3. 結合時間序列拆分可防止未來信息提前洩漏。 --- ## 小結 本章介紹了機器學習的基本框架、核心演算法、評估指標、交叉驗證與調參技巧,以及實務中常見的陷阱與對策。掌握這些知識後,你將能夠: 1. 根據業務需求選擇最合適的模型。 2. 正確處理資料不平衡、特徵尺度、過擬合問題。 3. 透過交叉驗證與網格搜尋得到可靠的性能估計。 4. 產出可解釋且可部署的預測模型。 在下一章,我們將進一步探討深度學習(Deep Learning)與強化學習(Reinforcement Learning),並結合分布式計算與雲端部署,讓你能在大規模實務環境中擴展模型效能。祝學習愉快!