聊天視窗

洞見數據:AI 驅動的全流程商業數據分析 - 第 5 章

5. 機器學習模型構建

發布於 2026-02-26 13:33

# 5. 機器學習模型構建 在前一章已完成資料清洗、特徵工程與維度縮減,現在我們將聚焦於 **模型構建**——將高品質特徵轉化為可解決實務問題的預測器。本章將帶領讀者從基礎模型到先進演算法,並說明如何在商業場景中選擇、實作、驗證與部署。 --- ## 5.1 監督學習 監督學習是最常見的商業模型類型,適用於有明確目標變數(label)的資料。以下介紹四大類模型,並提供實作範例與最佳實務。 ### 5.1.1 線性迴歸(Linear Regression) | 目的 | 典型應用 | 主要假設 | |------|-----------|----------| | 回歸預測 | 房價預測、銷售預測 | 線性關係、殘差正態分佈、無多重共線性 | **核心步驟** 1. 資料分割(train/test) 2. 特徵標準化(尤其是正則化版本) 3. 模型擬合(Ordinary Least Squares, Ridge/Lasso) 4. 評估(MAE、RMSE、R²) 5. 交叉驗證與正則化 **Python 範例** ```python from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.metrics import mean_absolute_error, r2_score X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = Ridge(alpha=1.0) model.fit(X_train, y_train) pred = model.predict(X_test) print('MAE:', mean_absolute_error(y_test, pred)) print('R²:', r2_score(y_test, pred)) ``` **實務小技巧** - **檢查共線性**:使用 VIF(Variance Inflation Factor) - **特徵交互**:手動或利用 PolynomialFeatures - **正則化**:Ridge (L2) 與 Lasso (L1) 可自動特徵選擇 --- ### 5.1.2 決策樹(Decision Tree) | 目的 | 典型應用 | 優點 | |------|-----------|------| | 分類/回歸 | 信用評分、客戶細分 | 易解釋、可處理非線性關係 | **核心步驟** - 設定樹深度、最小樣本分裂數、分裂準則 - 交叉驗證調整 hyper‑parameters - 觀察 feature importance **Python 範例** ```python from sklearn.tree import DecisionTreeClassifier, export_text clf = DecisionTreeClassifier(max_depth=5, min_samples_split=10, random_state=42) clf.fit(X_train, y_train) print('Feature importances:', clf.feature_importances_) print(export_text(clf, feature_names=list(X.columns))) ``` **實務小技巧** - **剪枝(Pruning)**:成本複雜度剪枝(ccp_alpha) - **資料不平衡**:使用 class_weight 或 SMOTE - **可視化**:graphviz、dtreeviz --- ### 5.1.3 XGBoost / LightGBM / CatBoost(集成提升) | 目的 | 典型應用 | 特點 | |------|-----------|------| | 端到端預測 | 電商推薦、詐騙偵測 | 速度快、準確度高、支持缺失值 | **核心概念** - **Boosting**:迭代加權學習,弱模型逐步改進 - **Gradient Boosting**:利用損失函數梯度更新 - **正則化**:L1 / L2 以及學習率調節 **Python 範例** ```python import xgboost as xgb param = { 'objective': 'reg:squarederror', 'max_depth': 6, 'eta': 0.1, 'subsample': 0.8, 'colsample_bytree': 0.8, } dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) bst = xgb.train(param, dtrain, num_boost_round=500, early_stopping_rounds=20, evals=[(dtest, 'eval')]) pred = bst.predict(dtest) print('RMSE:', np.sqrt(mean_squared_error(y_test, pred))) ``` **實務小技巧** - **交叉驗證**:使用 XGBoost 的 built‑in cv 以及 Optuna / Hyperopt - **特徵處理**:不需標準化,但可使用 OneHotEncoder 轉換類別 - **模型解釋**:SHAP、TreeSHAP 進行局部與全局解釋 --- ### 5.1.4 深度學習(Deep Learning) | 目的 | 典型應用 | 框架 | |------|-----------|------| | 高維非線性建模 | 圖像、語音、文本 | TensorFlow、PyTorch、Keras | **核心步驟** - 資料預處理:正規化、數據增強 - 模型設計:全連接、CNN、RNN、Transformer - 訓練:批次、學習率調度、早停 - 評估:混淆矩陣、精度/召回率、AUC **Python 範例(Keras)** ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential([ layers.Dense(128, activation='relu', input_shape=(X_train.shape[1],)), layers.Dropout(0.5), layers.Dense(64, activation='relu'), layers.Dense(1, activation='linear') ]) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), loss='mse', metrics=['mae']) history = model.fit(X_train, y_train, epochs=100, batch_size=256, validation_split=0.2, callbacks=[tf.keras.callbacks.EarlyStopping(patience=10)]) ``` **實務小技巧** - **GPU 加速**:使用 tf.keras.utils.multi_gpu_model 或 PyTorch 的 DataParallel - **小樣本**:採用預訓練模型(Transfer Learning) - **可解釋性**:Grad‑CAM、Integrated Gradients --- ## 5.2 無監督學習 無監督學習解決沒有明確標籤的問題,例如 **客戶細分**、**異常偵測** 或 **主題抽取**。以下涵蓋主要演算法及實作方法。 ### 5.2.1 聚類(Clustering) #### 5.2.1.1 K‑Means | 目的 | 典型應用 | 特點 | |------|-----------|------| | 客戶細分 | 市場細分 | 簡單、可擴展 | ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=5, random_state=42) labels = kmeans.fit_predict(X) print('Silhouette:', silhouette_score(X, labels)) ``` #### 5.2.1.2 DBSCAN | 目的 | 典型應用 | 特點 | |------|-----------|------| | 非球形聚類 | 位置資料 | 無需設定聚類數、對噪聲 robust | ```python from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) labels = dbscan.fit_predict(X) ``` ### 5.2.2 異常偵測(Anomaly Detection) | 目的 | 典型應用 | 方法 | |------|-----------|------| | 異常識別 | 詐騙偵測、設備故障 | Isolation Forest, One-Class SVM, Autoencoder | **Isolation Forest 範例** ```python from sklearn.ensemble import IsolationForest iso = IsolationForest(contamination=0.05, random_state=42) iso.fit(X) anomalies = iso.predict(X) print('Anomaly count:', np.sum(anomalies==-1)) ``` ### 5.2.3 主題模型(Topic Modeling) | 目的 | 典型應用 | 方法 | |------|-----------|------| | 文本聚類 | 客戶反饋分析 | LDA、NMF、BERTopic | **Python 範例(gensim LDA)** ```python from gensim import corpora, models # 建立字典與語料庫 dictionary = corpora.Dictionary(documents) corpus = [dictionary.doc2bow(doc) for doc in documents] lda = models.LdaModel(corpus, num_topics=5, id2word=dictionary, passes=10, random_state=42) print(lda.print_topics(num_words=6)) ``` **實務小技巧** - **文字預處理**:去除停用詞、詞幹化、tf‑idf 或 word2vec - **評估**:Coherence、Perplexity - **可視化**:pyLDAvis、BERTopic dashboard --- ## 5.3 訓練工作流與可重現性 ### 5.3.1 訓練管線(Pipeline) - **sklearn Pipeline**:自動化特徵變換 + 模型 - **tf.keras Sequential / Functional API**:結合 `tf.keras.layers.BatchNormalization` 等 - **Dask / Ray**:分散式訓練 ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler pipe = Pipeline([ ('scaler', StandardScaler()), ('regressor', Ridge(alpha=1.0)) ]) pipe.fit(X_train, y_train) ``` ### 5.3.2 版本控制與追蹤 | 工具 | 功能 | |------|------| | **MLflow** | 參數、模型、指標追蹤,簡易實驗管理 | | **DVC** | 資料版本控制,與 Git 整合 | | **TensorBoard** | 深度學習訓練可視化 | **MLflow 例子** ```python import mlflow import mlflow.sklearn with mlflow.start_run(): mlflow.log_params({'alpha': 1.0, 'model': 'Ridge'}) mlflow.sklearn.log_model(model, 'model') mlflow.log_metric('MAE', mae) ``` ### 5.3.3 模型部署前的確認 1. **驗證穩健性**:確保資料分割不造成資訊洩漏 2. **性能基準**:預先設定業務可接受的門檻(例如 AUC > 0.85) 3. **資源需求**:計算與記憶體評估,決定是否使用 GPU 或分散式 4. **安全性**:模型不含敏感資料、符合隱私法規 --- ## 5.4 小結 | 監督學習 | 無監督學習 | 深度學習 | |----------|------------|----------| | Linear Regression → 決策樹 → XGBoost | K‑Means → DBSCAN | CNN/RNN/Transformer | | 目標回歸/分類 | 資料聚類/異常偵測 | 高維非線性 | > **關鍵 Take‑Away** > 1. **特徵處理**:不論模型,品質特徵是基石,特別是對於提升器與深度學習。 > 2. **正則化與剪枝**:控制過擬合、提高泛化。 > 3. **模型解釋**:使用 SHAP / SHAP / LIME,尤其在金融、醫療等需解釋的場景。 > 4. **自動化調參**:Optuna、Ray Tune 等可顯著縮短迭代時間。 --- > **下一步**:在第六章我們將進一步討論 **模型驗證、評估與部署**,並結合 **MLflow**、**Docker** 及雲端服務(AWS SageMaker、Azure ML、GCP Vertex AI)實作端到端流水線。