返回目錄
A
資料科學實戰:從數據到洞察 - 第 5 章
5. 基礎機器學習模型
發布於 2026-02-27 05:33
# 5. 基礎機器學習模型
本章聚焦於 **監督式** 與 **非監督式** 基礎模型,並說明其評估指標、交叉驗證與實務落地。透過實際案例與 Python 代碼,幫助讀者快速掌握模型構建與評估的關鍵步驟。
---
## 5.1 監督式學習(Supervised Learning)
監督式學習以「已標註」資料為基礎,學習映射函數 \(f: X \rightarrow y\)。常見任務包括迴歸與分類。
### 5.1.1 迴歸(Regression)
| 模型 | 典型使用情境 | 優缺點 |
|------|--------------|--------|
| 線性迴歸 | 房價預測、利率預測 | 易解釋,對異常值敏感 |
| 決策樹迴歸 | 銷售額預測 | 可處理非線性,容易過擬合 |
| 隨機森林迴歸 | 信用評分 | 高準確度,特徵重要性可解釋 |
#### 範例:線性迴歸
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, r2_score
# 讀取資料
X = pd.read_csv('data/house_prices.csv').drop(columns=['price'])
y = pd.read_csv('data/house_prices.csv')['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('MSE:', mean_squared_error(y_test, pred))
print('R2:', r2_score(y_test, pred))
> **注意**:線性迴歸假設特徵與目標之間為線性關係,實務中往往需要先做特徵擴展(多項式)或使用正則化(Ridge/ElasticNet)以提升模型魯棒性。
### 5.1.2 分類(Classification)
| 模型 | 典型使用情境 | 優缺點 |
|------|--------------|--------|
| 邏輯迴歸 | 試驗金額風險、信貸審批 | 簡單易解釋,對非線性關係不足 |
| 支援向量機 | 欺詐偵測、客戶分群 | 高維資料表現好,參數調整較複雜 |
| 隨機森林 | 產品推薦、信用分數 | 抗噪聲,特徵重要性可視化 |
| 梯度提升樹(XGBoost) | 金融風控、行銷預測 | 高精度,易過擬合,需要正則化 |
#### 範例:隨機森林分類
python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
X = pd.read_csv('data/loan_data.csv').drop(columns=['default'])
y = pd.read_csv('data/loan_data.csv')['default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
clf = RandomForestClassifier(n_estimators=200, max_depth=8, random_state=42)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
print(confusion_matrix(y_test, pred))
print(classification_report(y_test, pred))
> **實務小貼士**:金融資料常呈現類別不平衡,建議使用 **SMOTE**、**類別權重** 或 **Cost‑Sensitive Learning** 來平衡模型。
---
## 5.2 非監督式學習(Unsupervised Learning)
非監督式學習不依賴標籤,主要目的是發掘資料內在結構,例如聚類、降維與異常偵測。
### 5.2.1 聚類(Clustering)
| 方法 | 典型使用情境 | 優缺點 |
|------|--------------|--------|
| K‑Means | 客戶分群、商品組合 | 計算快速,對初始中心敏感 |
| 層次聚類 | 市場細分、組織結構 | 可視化樹狀圖,計算成本高 |
| DBSCAN | 異常偵測、地理熱點 | 不需預先設定 K,能捕捉任意形狀 |
#### 範例:K‑Means
python
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
X = pd.read_csv('data/customer_features.csv').drop(columns=['customer_id'])
kmeans = KMeans(n_clusters=4, random_state=42)
labels = kmeans.fit_predict(X)
plt.scatter(X['feature1'], X['feature2'], c=labels, cmap='viridis')
plt.title('K‑Means Clustering')
plt.show()
> **提示**:使用 **Elbow** 或 **Silhouette** 指標來確定最佳 K 值。
### 5.2.2 降維(Dimensionality Reduction)
| 方法 | 典型使用情境 | 優缺點 |
|------|--------------|--------|
| PCA | 資料可視化、去噪 | 只保留線性關係,解釋性有限 |
| t‑SNE / UMAP | 高維資料可視化 | 計算複雜,難以擴充至大型資料集 |
#### 範例:PCA 可視化
python
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:,0], X_pca[:,1])
plt.title('PCA 2‑D Projection')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
---
## 5.3 評估指標(Evaluation Metrics)
| 任務 | 指標 | 公式 |
|------|------|------|
| 迴歸 | MSE(平均平方誤差) | \(\frac{1}{n}\sum (y_i-\hat y_i)^2\) |
| 迴歸 | RMSE | \(\sqrt{MSE}\) |
| 迴歸 | R²(決定係數) | \(1-\frac{SS_{res}}{SS_{tot}}\) |
| 分類 | Accuracy | 正確預測數 / 總數 |
| 分類 | Precision | TP / (TP+FP) |
| 分類 | Recall(召回率) | TP / (TP+FN) |
| 分類 | F1‑Score | 2·(Precision·Recall)/(Precision+Recall) |
| 分類 | ROC‑AUC | 曲線下的面積 |
> **跨領域實務**:在信用風控中,**Recall**(能否捕捉到所有違約客戶)往往比 Accuracy 更重要;在投資組合優化,**R²** 與 **Adjusted R²** 能幫助判斷特徵解釋度。
---
## 5.4 交叉驗證(Cross‑Validation)
交叉驗證可有效評估模型在未知資料上的泛化能力。常見方法:
- **K‑Fold CV**:將資料分成 K 個子集,輪流作為測試集。
- **Stratified K‑Fold**:對分類任務保持類別比例。
- **Repeated CV**:重複多次 CV,降低隨機性。
python
from sklearn.model_selection import cross_val_score, StratifiedKFold
clf = LogisticRegression(max_iter=1000, random_state=42)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(clf, X, y, cv=cv, scoring='roc_auc')
print('CV ROC‑AUC:', scores.mean(), '\u00B1', scores.std())
---
## 5.5 實務落地技巧
| 主題 | 建議實踐 |
|------|----------|
| 資料分割 | 使用 **train_test_split** + **stratify** 以維持類別比例 |
| 特徵縮放 | 所有基於距離或正則化的模型(K‑Means, SVM, 線性/邏輯迴歸)均需先做 StandardScaler / MinMaxScaler |
| 資料平衡 | 針對類別不平衡資料使用 **SMOTE**、**類別權重** 或 **集成方法** |
| 模型持續監測 | 設置 **漂移檢測** (e.g., Kolmogorov‑Smirnov test) 以判斷模型是否失效 |
| 版本管理 | 用 **MLflow** 或 **DVC** 跟蹤模型、特徵表與數據版本 |
| 可解釋性 | 使用 **SHAP** 或 **Permutation Importance** 進行特徵重要性分析 |
---
## 5.6 小結
- **迴歸**:從線性迴歸到樹基模型,重點是 **特徵選擇** 與 **正則化**。
- **分類**:類別不平衡是金融資料的典型挑戰,需透過重採樣或類別權重來處理。
- **聚類**:K‑Means 與 DBSCAN 是最常用的分群方法,選擇合適的 **距離度量** 與 **核心參數** 直接影響結果。
- **評估**:對於迴歸使用 **MSE / RMSE / R²**;對於分類使用 **Accuracy / Precision / Recall / F1 / ROC‑AUC**;對於聚類使用 **Silhouette** 或 **Calinski‑Harabasz**。
- **交叉驗證**:Stratified K‑Fold 能維持類別分佈,對於不平衡資料特別重要。
- **可持續開發**:將數據前處理、縮放、模型訓練與評估包裝在 **Pipeline** 中,並使用 **MLflow** 或 **DVC** 進行版本管理,確保模型可重複、可追蹤。
---
> **下一章**:模型選擇、超參數優化與可解釋性評估。