返回目錄
A
洞見數據:AI 驅動的全流程商業數據分析 - 第 5 章
5. 機器學習模型構建
發布於 2026-02-26 13:33
# 5. 機器學習模型構建
在前一章已完成資料清洗、特徵工程與維度縮減,現在我們將聚焦於 **模型構建**——將高品質特徵轉化為可解決實務問題的預測器。本章將帶領讀者從基礎模型到先進演算法,並說明如何在商業場景中選擇、實作、驗證與部署。
---
## 5.1 監督學習
監督學習是最常見的商業模型類型,適用於有明確目標變數(label)的資料。以下介紹四大類模型,並提供實作範例與最佳實務。
### 5.1.1 線性迴歸(Linear Regression)
| 目的 | 典型應用 | 主要假設 |
|------|-----------|----------|
| 回歸預測 | 房價預測、銷售預測 | 線性關係、殘差正態分佈、無多重共線性 |
**核心步驟**
1. 資料分割(train/test)
2. 特徵標準化(尤其是正則化版本)
3. 模型擬合(Ordinary Least Squares, Ridge/Lasso)
4. 評估(MAE、RMSE、R²)
5. 交叉驗證與正則化
**Python 範例**
```python
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_absolute_error, r2_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
pred = model.predict(X_test)
print('MAE:', mean_absolute_error(y_test, pred))
print('R²:', r2_score(y_test, pred))
```
**實務小技巧**
- **檢查共線性**:使用 VIF(Variance Inflation Factor)
- **特徵交互**:手動或利用 PolynomialFeatures
- **正則化**:Ridge (L2) 與 Lasso (L1) 可自動特徵選擇
---
### 5.1.2 決策樹(Decision Tree)
| 目的 | 典型應用 | 優點 |
|------|-----------|------|
| 分類/回歸 | 信用評分、客戶細分 | 易解釋、可處理非線性關係 |
**核心步驟**
- 設定樹深度、最小樣本分裂數、分裂準則
- 交叉驗證調整 hyper‑parameters
- 觀察 feature importance
**Python 範例**
```python
from sklearn.tree import DecisionTreeClassifier, export_text
clf = DecisionTreeClassifier(max_depth=5, min_samples_split=10, random_state=42)
clf.fit(X_train, y_train)
print('Feature importances:', clf.feature_importances_)
print(export_text(clf, feature_names=list(X.columns)))
```
**實務小技巧**
- **剪枝(Pruning)**:成本複雜度剪枝(ccp_alpha)
- **資料不平衡**:使用 class_weight 或 SMOTE
- **可視化**:graphviz、dtreeviz
---
### 5.1.3 XGBoost / LightGBM / CatBoost(集成提升)
| 目的 | 典型應用 | 特點 |
|------|-----------|------|
| 端到端預測 | 電商推薦、詐騙偵測 | 速度快、準確度高、支持缺失值 |
**核心概念**
- **Boosting**:迭代加權學習,弱模型逐步改進
- **Gradient Boosting**:利用損失函數梯度更新
- **正則化**:L1 / L2 以及學習率調節
**Python 範例**
```python
import xgboost as xgb
param = {
'objective': 'reg:squarederror',
'max_depth': 6,
'eta': 0.1,
'subsample': 0.8,
'colsample_bytree': 0.8,
}
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
bst = xgb.train(param, dtrain, num_boost_round=500, early_stopping_rounds=20, evals=[(dtest, 'eval')])
pred = bst.predict(dtest)
print('RMSE:', np.sqrt(mean_squared_error(y_test, pred)))
```
**實務小技巧**
- **交叉驗證**:使用 XGBoost 的 built‑in cv 以及 Optuna / Hyperopt
- **特徵處理**:不需標準化,但可使用 OneHotEncoder 轉換類別
- **模型解釋**:SHAP、TreeSHAP 進行局部與全局解釋
---
### 5.1.4 深度學習(Deep Learning)
| 目的 | 典型應用 | 框架 |
|------|-----------|------|
| 高維非線性建模 | 圖像、語音、文本 | TensorFlow、PyTorch、Keras |
**核心步驟**
- 資料預處理:正規化、數據增強
- 模型設計:全連接、CNN、RNN、Transformer
- 訓練:批次、學習率調度、早停
- 評估:混淆矩陣、精度/召回率、AUC
**Python 範例(Keras)**
```python
import tensorflow as tf
from tensorflow.keras import layers, models
model = models.Sequential([
layers.Dense(128, activation='relu', input_shape=(X_train.shape[1],)),
layers.Dropout(0.5),
layers.Dense(64, activation='relu'),
layers.Dense(1, activation='linear')
])
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
loss='mse',
metrics=['mae'])
history = model.fit(X_train, y_train, epochs=100, batch_size=256,
validation_split=0.2, callbacks=[tf.keras.callbacks.EarlyStopping(patience=10)])
```
**實務小技巧**
- **GPU 加速**:使用 tf.keras.utils.multi_gpu_model 或 PyTorch 的 DataParallel
- **小樣本**:採用預訓練模型(Transfer Learning)
- **可解釋性**:Grad‑CAM、Integrated Gradients
---
## 5.2 無監督學習
無監督學習解決沒有明確標籤的問題,例如 **客戶細分**、**異常偵測** 或 **主題抽取**。以下涵蓋主要演算法及實作方法。
### 5.2.1 聚類(Clustering)
#### 5.2.1.1 K‑Means
| 目的 | 典型應用 | 特點 |
|------|-----------|------|
| 客戶細分 | 市場細分 | 簡單、可擴展 |
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, random_state=42)
labels = kmeans.fit_predict(X)
print('Silhouette:', silhouette_score(X, labels))
```
#### 5.2.1.2 DBSCAN
| 目的 | 典型應用 | 特點 |
|------|-----------|------|
| 非球形聚類 | 位置資料 | 無需設定聚類數、對噪聲 robust |
```python
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)
```
### 5.2.2 異常偵測(Anomaly Detection)
| 目的 | 典型應用 | 方法 |
|------|-----------|------|
| 異常識別 | 詐騙偵測、設備故障 | Isolation Forest, One-Class SVM, Autoencoder |
**Isolation Forest 範例**
```python
from sklearn.ensemble import IsolationForest
iso = IsolationForest(contamination=0.05, random_state=42)
iso.fit(X)
anomalies = iso.predict(X)
print('Anomaly count:', np.sum(anomalies==-1))
```
### 5.2.3 主題模型(Topic Modeling)
| 目的 | 典型應用 | 方法 |
|------|-----------|------|
| 文本聚類 | 客戶反饋分析 | LDA、NMF、BERTopic |
**Python 範例(gensim LDA)**
```python
from gensim import corpora, models
# 建立字典與語料庫
dictionary = corpora.Dictionary(documents)
corpus = [dictionary.doc2bow(doc) for doc in documents]
lda = models.LdaModel(corpus, num_topics=5, id2word=dictionary, passes=10, random_state=42)
print(lda.print_topics(num_words=6))
```
**實務小技巧**
- **文字預處理**:去除停用詞、詞幹化、tf‑idf 或 word2vec
- **評估**:Coherence、Perplexity
- **可視化**:pyLDAvis、BERTopic dashboard
---
## 5.3 訓練工作流與可重現性
### 5.3.1 訓練管線(Pipeline)
- **sklearn Pipeline**:自動化特徵變換 + 模型
- **tf.keras Sequential / Functional API**:結合 `tf.keras.layers.BatchNormalization` 等
- **Dask / Ray**:分散式訓練
```python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipe = Pipeline([
('scaler', StandardScaler()),
('regressor', Ridge(alpha=1.0))
])
pipe.fit(X_train, y_train)
```
### 5.3.2 版本控制與追蹤
| 工具 | 功能 |
|------|------|
| **MLflow** | 參數、模型、指標追蹤,簡易實驗管理 |
| **DVC** | 資料版本控制,與 Git 整合 |
| **TensorBoard** | 深度學習訓練可視化 |
**MLflow 例子**
```python
import mlflow
import mlflow.sklearn
with mlflow.start_run():
mlflow.log_params({'alpha': 1.0, 'model': 'Ridge'})
mlflow.sklearn.log_model(model, 'model')
mlflow.log_metric('MAE', mae)
```
### 5.3.3 模型部署前的確認
1. **驗證穩健性**:確保資料分割不造成資訊洩漏
2. **性能基準**:預先設定業務可接受的門檻(例如 AUC > 0.85)
3. **資源需求**:計算與記憶體評估,決定是否使用 GPU 或分散式
4. **安全性**:模型不含敏感資料、符合隱私法規
---
## 5.4 小結
| 監督學習 | 無監督學習 | 深度學習 |
|----------|------------|----------|
| Linear Regression → 決策樹 → XGBoost | K‑Means → DBSCAN | CNN/RNN/Transformer |
| 目標回歸/分類 | 資料聚類/異常偵測 | 高維非線性 |
> **關鍵 Take‑Away**
> 1. **特徵處理**:不論模型,品質特徵是基石,特別是對於提升器與深度學習。
> 2. **正則化與剪枝**:控制過擬合、提高泛化。
> 3. **模型解釋**:使用 SHAP / SHAP / LIME,尤其在金融、醫療等需解釋的場景。
> 4. **自動化調參**:Optuna、Ray Tune 等可顯著縮短迭代時間。
---
> **下一步**:在第六章我們將進一步討論 **模型驗證、評估與部署**,並結合 **MLflow**、**Docker** 及雲端服務(AWS SageMaker、Azure ML、GCP Vertex AI)實作端到端流水線。