返回目錄
A
資料科學實戰:從數據到決策的完整流程 - 第 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. **監控與漂移檢測**:模型即時失效風險不可忽視,需構建完整監控機制。
透過本章的理論與實作,你已掌握機器學習在實務中的完整流程,能夠獨立設計、訓練、評估並部署高效、可維護的模型。祝你在資料科學旅程中持續創造商業價值!