聊天視窗

資料科學實戰:從數據到決策的完整流程 - 第 6 章

第六章 機器學習實務

發布於 2026-03-04 21:59

# 第六章 機器學習實務 在資料科學的全流程中,機器學習(Machine Learning, ML)是將資料轉化為可行洞察與預測的核心技術。本章將帶領你從概念到實作,掌握監督式、非監督式演算法、模型評估、交叉驗證與實際案例,幫你在實務中快速落地。 --- ## 6.1 監督式學習概念 | 章節 | 內容 | |------|------| | 何謂監督式 | 透過已標註資料(特徵 + 標籤)來訓練模型,目的是預測未知資料的標籤。 | | 典型應用 | 需求預測、客戶流失、信用評分、影像分類、語音辨識等。 | | 常見演算法 | - 線性回歸 / Logistic 回歸<br>- 決策樹 / 隨機森林<br>- 支援向量機(SVM)<br>- 梯度提升(XGBoost / LightGBM / CatBoost)<br>- 深度神經網路(MLP / CNN / RNN) | | 評估指標 | **回歸**:MSE / RMSE / MAE / R²<br>**分類**:Accuracy / Precision / Recall / F1 / ROC‑AUC | | 交叉驗證 | - KFold<br>- StratifiedKFold(分類) - LeaveOneOut<br>- TimeSeriesSplit(時序資料) | > **實作範例**:線性回歸預測房價。 ```python import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 1. 讀取資料 X = df.drop('price', axis=1) y = df['price'] # 2. 拆分訓練 / 測試 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 3. 建模 model = LinearRegression() model.fit(X_train, y_train) # 4. 評估 pred = model.predict(X_test) print('RMSE:', mean_squared_error(y_test, pred, squared=False)) # 5. 交叉驗證 scores = cross_val_score(model, X, y, cv=5, scoring='neg_root_mean_squared_error') print('CV RMSE:', -scores.mean()) ``` --- ## 6.2 非監督式學習概念 | 類型 | 描述 | 典型演算法 | 評估指標 | |------|------|------------|----------| | 聚類 | 將資料分群,使同群內相似度高、不同群相似度低 | K‑Means、DBSCAN、層次聚類、Gaussian Mixture | Silhouette、Calinski‑Harabasz、Davies‑Bouldin | | 降維 | 將高維特徵投影至低維空間,保留重要結構 | PCA、t‑SNE、UMAP、LLE | 失真度、可視化效果 | | 連續式 | 從資料自學習重建表示 | Autoencoder | 重建誤差 | > **實作範例**:K‑Means 分群客戶細分。 ```python from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 1. 標準化 scaler = StandardScaler() X_scaled = scaler.fit_transform(df[['age', 'annual_income', 'spending_score']]) # 2. Elbow 法尋找 K sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X_scaled) sse.append(kmeans.inertia_) plt.plot(range(1, 11), sse, marker='o'); plt.xlabel('k'); plt.ylabel('SSE'); plt.show() # 3. 取 k=5 kmeans = KMeans(n_clusters=5, random_state=42) clusters = kmeans.fit_predict(X_scaled) df['cluster'] = clusters ``` --- ## 6.3 監督式與非監督式選擇流程 | 步驟 | 需要的資訊 | 典型決策 | |------|------------|----------| | 1. 定義問題 | 是否有標籤 | 有 → 監督式;無 → 非監督式 | | 2. 資料性質 | 量化 vs 類別;數量 | 大量數據可用聚類、降維;少量可用決策樹 | | 3. 商業需求 | 預測準確度 vs 解析度 | 預測 → 監督式;分群 & 發現趨勢 → 非監督式 | | 4. 成熟度 | 演算法成熟度 | 先試最簡單、可解釋的模型 | > **案例表**: | 應用場景 | 是否有標籤 | 推薦演算法 | |-----------|------------|------------| | 信用評分 | 有 | Logistic、Random Forest | | 顧客細分 | 無 | K‑Means、DBSCAN | | 商品需求預測 | 有 | LightGBM、ARIMA | --- ## 6.4 特徵工程在 ML 中的角色 | 步驟 | 目的 | |------|------| | 缺失值處理 | 保持資料完整 | | 特徵縮放 | 讓梯度下降收斂更快 | | 類別編碼 | 轉化非數值資料 | | 特徵交互 | 捕捉非線性關係 | | 特徵重要性 | 省去冗餘特徵 | | 重要性解釋 | 產生 SHAP / LIME | > **Python 範例**:使用 `sklearn` Pipeline ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.ensemble import RandomForestClassifier numeric_features = ['age', 'income'] categorical_features = ['gender', 'region'] numeric_transformer = Pipeline([('scaler', StandardScaler())]) categorical_transformer = Pipeline([('onehot', OneHotEncoder(handle_unknown='ignore'))]) preprocessor = ColumnTransformer([ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features) ]) clf = Pipeline([ ('prep', preprocessor), ('model', RandomForestClassifier(n_estimators=200, random_state=42)) ]) ``` --- ## 6.5 交叉驗證與模型選擇實務 | 方法 | 說明 | |------|------| | GridSearchCV | 全搜尋網格,易過擬合 | | RandomizedSearchCV | 隨機搜尋,搜尋空間大時更有效 | | Bayesian Optimization | 利用先前結果優化搜尋 | | Nested CV | 同時估計模型與參數,避免評估偏差 | | Early Stopping | 在驗證集上監控,預防過擬合 | > **處理不平衡資料**: > > - `class_weight='balanced'` > - `SMOTE`(合成少數類樣本) > - `Focal Loss`(深度學習) --- ## 6.6 超參數調優案例:LightGBM ```python import lightgbm as lgb from sklearn.model_selection import StratifiedKFold, GridSearchCV from sklearn.metrics import roc_auc_score # 1. 建立資料集 X = df.drop('target', axis=1) y = df['target'] # 2. 參數網格 param_grid = { 'num_leaves': [31, 63, 127], 'max_depth': [-1, 10, 20], 'learning_rate': [0.05, 0.1, 0.2], 'n_estimators': [100, 200, 500] } # 3. LightGBM 模型 lgb_clf = lgb.LGBMClassifier(random_state=42) # 4. Stratified KFold skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # 5. GridSearch grid = GridSearchCV(lgb_clf, param_grid, cv=skf, scoring='roc_auc', n_jobs=-1) grid.fit(X, y) print('Best Params:', grid.best_params_) print('Best ROC‑AUC:', grid.best_score_) ``` --- ## 6.7 模型性能監控與漂移 | 指標 | 何時檢查 | 監控工具 | |------|----------|----------| | 準確率 / AUC | 每次推論後 | Prometheus + Grafana | | 概念漂移 | 每週 | Alibi Detect(Drift) | | 資料漂移 | 每天 | Data Version Control (DVC) | | 超參數漂移 | 重大版本變更 | MLflow Tracking | > **示例**:利用 `Alibi Detect` 檢測特徵漂移 ```python from alibi_detect.dataset import generate_data from alibi_detect.cd import ADDrift # 1. 生成舊資料 old_X = generate_data(1000, 10) # 2. 新資料 new_X = generate_data(1000, 10, shift=0.5) # 3. 檢測 drift_detector = ADDrift(old_X) print(drift_detector.predict(new_X)) ``` --- ## 6.8 實作案例:客戶流失預測 | 步驟 | 內容 | |------|------| | 1. 資料收集 | 客戶基本資料、使用紀錄、客服互動、訂閱狀態 | | 2. 特徵工程 | - 取最近 90 天使用頻次 - 交互特徵:使用時長 × 付費金額 - 缺失補齊:KNN Imputer | | 3. 模型 | Gradient Boosting(XGBoost) + 隨機森林交叉驗證 | | 4. 評估 | ROC‑AUC 0.87;Kappa 0.62 | | 5. 部署 | FastAPI + Docker;使用 MLflow 追蹤實驗 | > **Python Pipeline**: ```python # feature engineering X['usage_rate'] = X['daily_usage'] / X['subscription_days'] X['spend_per_use'] = X['monthly_spend'] / X['daily_usage'] # model training from xgboost import XGBClassifier model = XGBClassifier(n_estimators=300, learning_rate=0.05, max_depth=6, subsample=0.8, colsample_bytree=0.8, random_state=42) model.fit(X_train, y_train, eval_set=[(X_val, y_val)], eval_metric='auc', early_stopping_rounds=20) ``` --- ## 6.9 小結 1. **監督式**:依賴標籤,適合預測與分類;常見演算法多樣,評估指標多元。 2. **非監督式**:不需標籤,適合發現結構與模式;聚類與降維是兩大核心。 3. **特徵工程**:是模型成功與否的關鍵,須結合業務知識與數學方法。 4. **交叉驗證與調優**:避免過擬合,確保模型泛化;Nested CV 是最佳做法。 5. **監控與漂移檢測**:模型即時失效風險不可忽視,需構建完整監控機制。 透過本章的理論與實作,你已掌握機器學習在實務中的完整流程,能夠獨立設計、訓練、評估並部署高效、可維護的模型。祝你在資料科學旅程中持續創造商業價值!