返回目錄
A
資料驅動的決策:企業資料科學實務 - 第 4 章
第 4 章:機器學習基礎
發布於 2026-03-03 02:12
# 第 4 章:機器學習基礎
在企業資料科學的實務流程中,**機器學習** 從模型設計、訓練、評估到調優,構成了決策支援系統的核心。本章將從概念講起,循序漸進到實際操作,並結合業界常見案例,協助讀者掌握監督學習與非監督學習的基礎框架,熟悉評估指標與交叉驗證方法,並了解模型選擇與參數調整的實務技巧。
---
## 4.1 監督學習(Supervised Learning)
| 類別 | 目的 | 典型演算法 | 典型應用場景 |
|------|------|------------|---------------|
| 分類(Classification) | 預測離散類別 | Logistic Regression, SVM, Random Forest, XGBoost, Neural Network | 信用評分、疾病診斷、客戶流失預測 |
| 回歸(Regression) | 預測連續值 | Linear Regression, Ridge/Lasso, Gradient Boosting Regressor, Neural Network | 價格預測、需求預測、工時預估 |
### 4.1.1 模型建立流程
1. **定義目標變數**:確定要預測的量(分類標籤或回歸值)。
2. **特徵選擇**:挑選能解釋目標變數的自變量,並處理多重共線性。
3. **資料分割**:`train_test_split` 或時間序列切分,保證訓練與測試資料的獨立性。
4. **模型訓練**:使用 `sklearn` 或 `xgboost` 等套件,調整超參數。
5. **評估與驗證**:計算適合的指標,並進行交叉驗證。
6. **部署與監控**:將模型輸出部署至 API 或批次作業,持續監測性能。
### 4.1.2 評估指標
| 指標 | 適用場景 | 計算方式 |
|------|----------|-----------|
| Accuracy | 分類 | `(TP+TN)/(TP+TN+FP+FN)` |
| Precision | 分類(重視正確預測) | `TP/(TP+FP)` |
| Recall(Sensitivity) | 分類(重視抓住所有正類) | `TP/(TP+FN)` |
| F1‑Score | 分類(平衡 Precision & Recall) | `2 * Precision * Recall / (Precision+Recall)` |
| ROC‑AUC | 二元分類 | 區分曲線下方的面積 |
| MAE | 回歸 | `mean(|y_true - y_pred|)` |
| RMSE | 回歸 | `sqrt(mean((y_true - y_pred)^2))` |
| R² | 回歸 | `1 - SS_res/SS_tot` |
> **小技巧**:對於不平衡類別,請考慮使用 `class_weight` 或過採樣/欠採樣技術;對於回歸,可以使用交叉驗證的 `mean_absolute_error` 來減少對離群值的敏感度。
## 4.2 非監督學習(Unsupervised Learning)
| 類別 | 目的 | 典型演算法 | 典型應用場景 |
|------|------|------------|---------------|
| 聚類(Clustering) | 將資料分群 | K‑Means, DBSCAN, Agglomerative Clustering | 客戶細分、行為模式偵測 |
| 降維(Dimensionality Reduction) | 減少特徵維度、可視化 | PCA, t‑SNE, UMAP | 圖像壓縮、資料探索 |
| 异常偵測(Anomaly Detection) | 辨識異常事件 | Isolation Forest, One‑Class SVM | 欺詐檢測、網路安全 |
### 4.2.1 典型工作流程
1. **特徵工程**:對原始資料做標準化、正規化或二值化。
2. **選擇演算法**:根據資料特性(如點分布、密度)選擇合適模型。
3. **參數設定**:例如 K‑Means 的 K 值、DBSCAN 的 eps/MinPts。
4. **結果評估**:使用內部評估指標(Silhouette, Calinski–Harabasz)或外部指標(若有真實標籤)。
5. **業務解讀**:將聚類結果映射到商業洞察,或將降維後的特徵作為監督學習的輸入。
> **實務建議**:在採用 DBSCAN 前,先透過「k‑distance plot」找出最佳 eps;在 K‑Means 前先確定數據是否呈現簇心分布;對於高維資料,先做 PCA 降維,再進行聚類可提升效果。
## 4.3 交叉驗證(Cross‑Validation)
| 方法 | 特點 | 適用場景 |
|------|------|-----------|
| K‑Fold | 將資料分成 K 個子集,輪流作為驗證集 | 大多數監督學習模型 |
| Stratified K‑Fold | 保持類別比例 | 不平衡分類問題 |
| Time‑Series Split | 不打亂時間序列 | 時間序列預測 |
| Leave‑One‑Out | 每次留一個樣本驗證 | 小資料集 |
### 4.3.1 實作範例(Python)
python
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.linear_model import LogisticRegression
import numpy as np
X, y = np.random.randn(200, 10), np.random.randint(0, 2, 200)
clf = LogisticRegression(max_iter=1000)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(clf, X, y, cv=cv, scoring='roc_auc')
print('ROC‑AUC:', scores.mean(), '+/-', scores.std())
> **提示**:在深度學習或大型模型中,使用 `KerasClassifier` 或 `KerasRegressor` 可以直接套用 scikit‑learn 的交叉驗證框架。
## 4.4 模型選擇與調參(Hyperparameter Tuning)
| 方法 | 優點 | 缺點 |
|------|------|------|
| Grid Search | 全部組合搜尋,結果可解釋 | 計算量大 |
| Random Search | 隨機抽樣,覆蓋範圍廣 | 可能遺漏最佳組合 |
| Bayesian Optimization | 利用過往結果預測未試組合 | 實作複雜 |
| Hyperband / Optuna | 動態調整樣本數 | 需要自定義調參空間 |
### 4.4.1 參數範例(XGBoost)
python
import xgboost as xgb
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint as sp_randint
param_dist = {
'n_estimators': sp_randint(100, 500),
'max_depth': sp_randint(3, 10),
'learning_rate': [0.01, 0.05, 0.1, 0.2],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0]
}
xgb_clf = xgb.XGBClassifier(objective='binary:logistic', eval_metric='auc')
random_search = RandomizedSearchCV(xgb_clf, param_distributions=param_dist,
n_iter=50, scoring='roc_auc', cv=5, verbose=1, n_jobs=-1)
random_search.fit(X, y)
print('Best params:', random_search.best_params_)
> **實務提醒**:超參數的空間設定應該結合領域知識,避免盲目尋找極端值;同時在調參前先做基準模型(baseline),以便衡量改進幅度。
## 4.5 常見陷阱與最佳實務
| 陷阱 | 原因 | 解決方案 |
|------|------|-----------|
| 資料泄漏 | 特徵工程或標籤包含未來資訊 | 在資料分割前完成所有處理;使用 `ColumnTransformer` 確保一致性 |
| 過擬合 | 模型過於複雜 | 加入正則化、交叉驗證、早停法 |
| 樣本不平衡 | 正負類比例偏離 | 過採樣、欠採樣、SMOTE、類別權重 |
| 低維度誤導 | 高維資料中相似點被視為聚類中心 | 先做 PCA 或 t‑SNE 做可視化確認聚類結構 |
| 參數搜尋過度 | 搜尋時間長、資源浪費 | 先做粗略搜尋,再聚焦關鍵參數;使用 Bayesian 或 Hyperband |
> **最佳實務**:始終在 *全新* 測試集上驗證最終模型,避免交叉驗證時的資訊泄漏;並在部署前建立模型版本管理(如使用 MLflow 或 DVC)。
## 4.6 案例實作:客戶流失預測
> **業務目標**:預測客戶是否在未來 3 個月內流失,協助行銷團隊制定維繫策略。
### 4.6.1 資料概覽
- **特徵**:年齡、性別、訂閱時間、月消費、使用頻率、客服互動次數、客戶服務滿意度等。
- **標籤**:`churn`(1:流失,0:留存)。
### 4.6.2 主要步驟
1. **資料前處理**:缺失值填補、離群值修正、標準化。
2. **特徵工程**:
- 生成「客戶活躍度」指標(如最近 6 個月平均消費)。
- 轉換類別變數為 one‑hot 編碼。
3. **模型選擇**:使用 `XGBoost` 與 `Random Forest` 進行基線對照。
4. **交叉驗證**:`StratifiedKFold` 5 次。
5. **調參**:使用 `RandomizedSearchCV` 針對 XGBoost。
6. **評估**:ROC‑AUC、Precision‑Recall Curve,並以召回率為主要指標。
7. **部署**:將最佳模型封裝為 RESTful API,使用 Docker 進行容器化。
8. **監控**:設置模型漂移檢測,並建立 A/B 測試機制。
### 4.6.3 重要代碼片段
python
# 1. 資料前處理示例
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
numeric_features = ['age', 'subscription_months', 'monthly_spend', 'support_calls']
numeric_transformer = Pipeline([('scaler', StandardScaler())])
categorical_features = ['gender', 'service_satisfaction']
categorical_transformer = Pipeline([('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
]
)
# 2. 模型 + Pipeline
from xgboost import XGBClassifier
from sklearn.metrics import roc_auc_score
clf = XGBClassifier(objective='binary:logistic', eval_metric='auc', n_estimators=300, max_depth=5)
pipe = Pipeline([('preprocessor', preprocessor), ('classifier', clf)])
# 3. 交叉驗證與評估
from sklearn.model_selection import StratifiedKFold, cross_val_predict
import numpy as np
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
probs = cross_val_predict(pipe, X, y, cv=cv, method='predict_proba')[:,1]
auc = roc_auc_score(y, probs)
print('Cross‑Validated ROC‑AUC:', auc)
---
## 4.7 小結
- **監督學習** 以預測為核心,涵蓋分類與回歸,重視模型選擇、評估指標與參數調整。
- **非監督學習** 以資料結構探索為目的,聚類與降維是兩大常用工具。
- **交叉驗證** 能夠穩定評估模型,防止過擬合;搭配 **Bayesian Optimisation** 或 **Hyperband** 可提升調參效率。
- **業務落地** 需要從資料前處理、特徵工程、模型驗證、部署、監控四個階段完整設計。
> **延伸閱讀**:
> - *Hands‑On Machine Learning with Scikit‑Learn, Keras & TensorFlow* (Aurélien Géron)
> - *Practical Machine Learning* (Pedro Domingos)
> - *Feature Engineering for Machine Learning* (Alice Zheng, Jason Brownlee)