返回目錄
A
數據科學的藝術與科學:從基礎到實踐 - 第 5 章
第五章:機器學習基礎與模型選擇
發布於 2026-02-25 14:53
# 第五章:機器學習基礎與模型選擇
> 在前四章的特徵工程與資料前處理中,我們已經確保了數據品質。接下來,我們將進入模型建構的核心階段:選擇合適的機器學習演算法、評估模型效能、以及如何利用交叉驗證、調參與模型融合來取得最佳表現。
---
## 1. 監督式學習(Supervised Learning)
監督式學習是最常見的機器學習類型,模型以帶標籤的訓練資料為基礎,學習輸入特徵與目標變數之間的映射。
| 類別 | 典型演算法 | 適用場景 | 主要優點 | 主要缺點 |
|------|------------|----------|----------|----------|
| **回歸** | 線性迴歸、Ridge/Lasso、隨機森林迴歸、梯度提升迴歸、神經網路 | 房價預測、銷售額預測 | 直觀、可解釋性高 | 受限於線性假設、對離群值敏感 |
| **分類** | 邏輯斯迴歸、決策樹、隨機森林、XGBoost、SVM、KNN、神經網路 | 信用卡欺詐、疾病診斷、垃圾郵件 | 可處理非線性關係、易於解釋 | 訓練時間長、易過擬合 |
### 1.1 線性迴歸
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 讀取數據
X = df.drop(columns=['price'])
y = df['price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 建模
model = LinearRegression()
model.fit(X_train, y_train)
# 評估
pred = model.predict(X_test)
print('RMSE:', mean_squared_error(y_test, pred, squared=False))
### 1.2 隨機森林與梯度提升
- **隨機森林(Random Forest)**:利用多棵決策樹的平均值降低過擬合。適合特徵非線性且交互關係複雜的情況。
- **梯度提升(XGBoost/LightGBM/CatBoost)**:逐步逼近最佳解,對噪音較小、特徵工程相對簡單的數據表現極佳。
---
## 2. 非監督式學習(Unsupervised Learning)
非監督式學習不依賴標籤,主要用於探索資料結構、降維或聚類。
| 典型演算法 | 目的 | 常見應用 |
|-------------|------|----------|
| **K‑均值聚類** | 分群 | 市場細分、客戶分類 |
| **DBSCAN** | 離群偵測 | 异常行為檢測 |
| **PCA** | 降維 | 特徵縮減、可視化 |
| **t‑SNE / UMAP** | 可視化 | 高維資料投影 |
### 2.1 K‑均值聚類示例
python
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 標準化
X_scaled = StandardScaler().fit_transform(df[feature_cols])
# 進行聚類
kmeans = KMeans(n_clusters=4, random_state=42)
clusters = kmeans.fit_predict(X_scaled)
# 可視化
plt.scatter(df['feature1'], df['feature2'], c=clusters, cmap='viridis')
plt.title('K‑Means 聚類結果')
plt.show()
---
## 3. 模型評估指標
### 3.1 回歸指標
| 指標 | 定義 | 使用情境 |
|------|------|----------|
| MAE | 平均絕對誤差 | 直觀解釋、對離群值不敏感 |
| MSE | 平方誤差平均 | 會放大大誤差,常用於優化目標 |
| RMSE | MSE 的平方根 | 與原始單位一致,便於比較 |
| R² | 迴歸解釋比例 | 衡量模型對變異性的解釋力 |
### 3.2 分類指標
| 指標 | 定義 | 典型使用場景 |
|------|------|----------------|
| Accuracy | 正確率 | 標準分類問題 |
| Precision | 正確陽性的比例 | 權重對陽性誤報敏感 |
| Recall | 檢出率 | 權重對漏報敏感 |
| F1‑Score | 兩者調和平均 | 資料不平衡時優先考量 |
| ROC‑AUC | 曲線下面積 | 評估二元分類器的排序能力 |
| Log‑Loss | 交叉熵損失 | 需要概率輸出 |
> **實務提醒**:對於不平衡資料,Accuracy 可能會誤導。建議使用 F1‑Score 或 ROC‑AUC 作為主要評估指標。
---
## 4. 交叉驗證(Cross‑Validation)
交叉驗證是評估模型泛化能力的核心方法,能減少因樣本分割偶然性導致的偏差。
### 4.1 基本流程
python
from sklearn.model_selection import cross_val_score, KFold
kf = KFold(n_splits=5, shuffle=True, random_state=42)
model = RandomForestRegressor(random_state=42)
scores = cross_val_score(model, X, y, cv=kf, scoring='neg_mean_squared_error')
print('CV RMSE:', (-scores).mean() ** 0.5)
### 4.2 特殊情況
| 交叉驗證 | 何時使用 |
|----------|-----------|
| StratifiedKFold | 針對分類,保持類別比例 |
| TimeSeriesSplit | 時間序列,避免未來資訊洩漏 |
| Leave‑One‑Out | 低樣本量,全面利用每筆資料 |
---
## 5. 模型調參(Hyper‑Parameter Tuning)
模型的最佳效果往往取決於參數設定。常見的調參方法有:
| 方法 | 代表工具 | 優點 |
|------|-----------|------|
| Grid Search | `GridSearchCV` | 全面搜尋、簡單易用 |
| Random Search | `RandomizedSearchCV` | 節省計算、對高維參數空間友好 |
| Bayesian | `Optuna`, `Hyperopt`, `Optuna` | 以先前結果為基礎,快速收斂 |
### 5.1 Optuna 調參示例
python
import optuna
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import XGBRegressor
def objective(trial):
params = {
'n_estimators': trial.suggest_int('n_estimators', 100, 500),
'max_depth': trial.suggest_int('max_depth', 3, 15),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5, 1.0),
'random_state': 42
}
model = XGBRegressor(**params)
return cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error').mean()
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
print('Best params:', study.best_params)
---
## 5. 模型選擇流程圖
┌───────────────────────┐
│ 1. 明確問題與目標類型 │
├───────────────────────┤
│ 2. 選擇基礎演算法 │
├───────────────────────┤
│ 3. 交叉驗證評估 │
├───────────────────────┤
│ 4. 參數調整 │
├───────────────────────┤
│ 5. 模型融合與選擇最佳 │
└───────────────────────┘
> **案例**:
> - **信用卡欺詐偵測**:使用 Logistic Regression → Random Forest → XGBoost;評估指標以 ROC‑AUC 為主。
> - **房價預測**:先用線性迴歸做基準,然後加入 Ridge、Random Forest、XGBoost,最後選擇 RMSE 最低的模型。
---
## 6. 模型融合(Ensemble)
模型融合能將多個基模型的預測進行組合,往往能提升穩定性與準確度。
| 方法 | 概念 | 典型實現 |
|------|------|----------|
| Bagging | 多個模型訓練於不同資料子集,平均或投票 | `BaggingClassifier` |
| Boosting | 逐步減少前一模型錯誤 | XGBoost, LightGBM |
| Stacking | 輸出做為新特徵進行二層學習 | `StackingClassifier/Regressor` |
| Voting | 多模型投票 | `VotingClassifier/Regressor` |
### 6.1 Voting 示例
python
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
base_estimators = [
('lr', LogisticRegression()),
('dt', DecisionTreeClassifier(max_depth=5)),
('rf', RandomForestClassifier(n_estimators=100))
]
voting = VotingClassifier(estimators=base_estimators, voting='soft')
voting.fit(X_train, y_train)
print('Voting AUC:', roc_auc_score(y_test, voting.predict_proba(X_test)[:,1]))
---
## 7. 實務建議
| 步驟 | 要點 |
|------|------|
| **先做簡單模型** | 例如線性迴歸或 Logistic Regression,快速定位問題。 |
| **逐步增加複雜度** | 如 Random Forest → XGBoost → 深度神經網路,避免一次跳到過於複雜的模型。 |
| **特徵重要性** | 應用 `feature_importances_` 或 SHAP 了解模型決策。 |
| **監控與版本管理** | 建立 MLflow / DVC pipeline,確保每個模型版本可追溯。 |
| **避免資料洩漏** | 前處理與特徵選擇必須在交叉驗證內完成,不能在測試資料上做調整。 |
| **處理不平衡** | 先使用 SMOTE 或 Class‑Weight,然後評估 F1‑Score 或 ROC‑AUC。 |
---
## 8. 參考文獻
- Bishop, C. M. *Pattern Recognition and Machine Learning*. Springer, 2006.
- Hastie, T., Tibshirani, R., Friedman, J. *The Elements of Statistical Learning*. Springer, 2009.
- Chen, T., Guestrin, C. *XGBoost: A Scalable Tree Boosting System*. KDD 2016.
- Pedregosa, F. *et al.* scikit‑learn: Machine Learning in Python. JMLR 2011.
- Kelleher, J. D., Tierney, B., Namee, B. *Programming Collective Intelligence*. O’Reilly, 2015.
---
> **總結**:模型選擇不是一次性決策,而是整合數據品質、演算法特性、評估指標、交叉驗證、調參與模型融合的多層面流程。透過循環迭代,我們能在保持可解釋性的同時,實現高效能的預測模型。