返回目錄
A
數據科學全能指南:從數據到洞察 - 第 5 章
第五章:機器學習基礎
發布於 2026-02-22 23:12
# 第五章:機器學習基礎
在資料科學的工作流程中,機器學習(Machine Learning)是將資料轉化為預測模型的核心技術。本章將從基礎概念說起,帶你逐步了解監督式與非監督式學習、常見演算法、模型評估與交叉驗證,以及實務中的最佳實踐。內容將以理論與實際 Python 代碼相結合,方便你快速上手並在業務場景中落地。
---
## 1. 監督式學習(Supervised Learning)
監督式學習是指「輸入 + 目標輸出」的學習過程,模型學習從特徵(features)映射到目標(label)。
| 目標類型 | 典型問題 | 常見演算法 |
|---|---|---|
| **回歸(Regression)** | 房價預測、股價預測 | 線性回歸、Lasso、Ridge、Decision Tree Regressor、Random Forest Regressor、XGBoost、LightGBM |
| **分類(Classification)** | 客戶是否流失、垃圾郵件偵測 | 邏輯迴歸、KNN、SVM、決策樹、隨機森林、Gradient Boosting、神經網路 |
> **註記**:雖然許多演算法本身可做分類或回歸,但在實務上往往會根據問題類型調整參數或使用特定損失函數。
### 1.1 線性回歸
最簡單且解釋性最好的回歸模型:
python
from sklearn.linear_model import LinearRegression
X = df[['sqft', 'bedrooms']] # 特徵
y = df['price'] # 目標
model = LinearRegression().fit(X, y)
print(f'係數: {model.coef_}')
### 1.2 邏輯迴歸
用於二元分類問題,輸出 0/1 或概率值。
python
from sklearn.linear_model import LogisticRegression
X = df[['age', 'income']]
y = df['churn'] # 0: 留存 1: 離開
model = LogisticRegression(max_iter=1000).fit(X, y)
### 1.3 決策樹與集成方法
- **決策樹**:易於解釋,但易過擬合。
- **隨機森林**:多棵樹投票,減少過擬合。
- **Gradient Boosting**:逐步修正錯誤,性能優秀(如 XGBoost、LightGBM)。
python
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=200, random_state=42).fit(X, y)
### 1.4 支持向量機(SVM)
適合高維數據,使用核函數可處理非線性關係。
python
from sklearn.svm import SVC
svc = SVC(kernel='rbf', probability=True).fit(X, y)
### 1.5 k-近鄰(k‑NN)
基於距離度量的懶惰學習,簡單且可解釋。
python
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5).fit(X, y)
## 2. 非監督式學習(Unsupervised Learning)
無需目標輸出,主要用於結構探索、特徵降維和聚類。
| 目的 | 典型演算法 |
|---|---|
| **聚類(Clustering)** | K‑Means、DBSCAN、Hierarchical Clustering |
| **降維(Dimensionality Reduction)** | PCA、t‑SNE、UMAP |
python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42).fit(X)
> **實務提示**:在聚類前,務必對特徵進行標準化(`StandardScaler`),否則尺度差異會影響距離度量。
## 3. 模型評估指標
### 3.1 分類評估
| 指標 | 公式 | 何時使用 |
|---|---|---|
| **Accuracy** | (TP+TN)/(TP+TN+FP+FN) | 樣本均衡時使用 |
| **Precision** | TP/(TP+FP) | 需要抑制假陽性時使用 |
| **Recall** | TP/(TP+FN) | 需要抑制假陰性時使用 |
| **F1‑Score** | 2·(Precision·Recall)/(Precision+Recall) | Precision & Recall 同等重要 |
| **ROC‑AUC** | 曲線下方面積 | 評估概率模型,對類別不均衡友好 |
python
from sklearn.metrics import classification_report, roc_auc_score
print(classification_report(y_true, y_pred))
print('ROC‑AUC:', roc_auc_score(y_true, y_proba))
### 3.2 回歸評估
| 指標 | 公式 | 何時使用 |
|---|---|---|
| **MSE** |
\(\frac{1}{n}\sum (y_i-\hat y_i)^2\) | 應對大誤差敏感 |
| **RMSE** | \(\sqrt{MSE}\) | 直觀解釋誤差 |
| **MAE** | \(\frac{1}{n}\sum |y_i-\hat y_i|\) | 對極端值不敏感 |
| **R²** | 1 - SS_res/SS_tot | 變異解釋比例 |
python
from sklearn.metrics import mean_squared_error, r2_score
print('RMSE:', mean_squared_error(y_true, y_pred, squared=False))
print('R²:', r2_score(y_true, y_pred))
## 4. 交叉驗證(Cross‑Validation)與模型選擇
直接用訓練集評估模型易導致過擬合,交叉驗證能更真實評估泛化能力。
python
from sklearn.model_selection import KFold, cross_val_score
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(rf, X, y, cv=kf, scoring='accuracy')
print('CV Accuracy:', scores.mean(), '+/-', scores.std())
### 4.1 Grid Search 與 Random Search
python
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [100, 200], 'max_depth': [None, 10, 20]}
grid = GridSearchCV(rf, param_grid, cv=5, scoring='accuracy').fit(X, y)
print('Best params:', grid.best_params_)
### 4.2 交叉驗證策略
- **K‑Fold**:最常用,隨機分層可保證各折樣本比例。
- **StratifiedKFold**:對分類問題保持類別比例。
- **Leave‑One‑Out (LOO)**:適合小樣本,計算量大。
- **TimeSeriesSplit**:時序資料,避免未來信息泄露。
## 5. 實務技巧與常見陷阱
| 觀察 | 建議 |
|---|---|
| **資料不平衡** | 重新採樣(SMOTE、undersampling)、使用類別權重、切換評估指標(F1、AUC)。 |
| **特徵泄漏(Leakage)** | 檢查目標中是否含有將來信息;在特徵工程中去除或延遲特徵。 |
| **過度擬合** | 進行特徵選擇、使用正則化、增加訓練數據、簡化模型、交叉驗證。 |
| **模型可解釋性** | 需求業務解釋時,先試簡單模型;若需高精度,搭配 SHAP / LIME 做特徵重要性說明。 |
| **計算資源** | 大規模資料時,先做樣本下采樣或使用 GPU 加速的 LightGBM。 |
| **重複實驗** | 固定 `random_state`、記錄實驗配置,使用 `MLflow` 或 `Weights & Biases` 做版本管理。 |
## 6. 案例:信用卡欺詐偵測
> **場景說明**:金融機構需要預測交易是否為欺詐,以降低損失。目標類別極度不平衡(欺詐 0.2%)。
python
# 1. 資料前處理
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, StratifiedKFold
from imblearn.over_sampling import SMOTE
X = train_df.drop(columns=['is_fraud', 'transaction_id'])
y = train_df['is_fraud']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
# 2. 重採樣
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X_train, y_train)
# 3. 模型:XGBoost
import xgboost as xgb
model = xgb.XGBClassifier(scale_pos_weight=(len(y_res)-y_res.sum())/y_res.sum(), eval_metric='auc').fit(X_res, y_res)
# 4. 評估
from sklearn.metrics import roc_auc_score
y_proba = model.predict_proba(X_test)[:, 1]
print('Test ROC‑AUC:', roc_auc_score(y_test, y_proba))
> **重點**:
> 1. `scale_pos_weight` 自動調整類別權重,減少手動重新採樣的風險。
> 2. 使用 `eval_metric='auc'` 直接優化 ROC‑AUC,對不平衡資料友好。
> 3. 結合時間序列拆分可防止未來信息提前洩漏。
---
## 小結
本章介紹了機器學習的基本框架、核心演算法、評估指標、交叉驗證與調參技巧,以及實務中常見的陷阱與對策。掌握這些知識後,你將能夠:
1. 根據業務需求選擇最合適的模型。
2. 正確處理資料不平衡、特徵尺度、過擬合問題。
3. 透過交叉驗證與網格搜尋得到可靠的性能估計。
4. 產出可解釋且可部署的預測模型。
在下一章,我們將進一步探討深度學習(Deep Learning)與強化學習(Reinforcement Learning),並結合分布式計算與雲端部署,讓你能在大規模實務環境中擴展模型效能。祝學習愉快!