返回目錄
A
數據科學之路:從基礎到實務應用 - 第 4 章
發布於 2026-02-26 17:05
## 第4章 機器學習模型實作——從線性模型到樹模型、深度學習
本章將帶領讀者從最基礎的線性模型逐步過渡到複雜的樹模型與深度學習架構。透過實際範例、程式碼片段與評估指標,協助你掌握模型選擇、調參、解釋與部署的全流程。
### 4.1 線性模型
- **線性迴歸**:最直觀的預測方法,假設目標變數與特徵之間呈線性關係。
- **Ridge / Lasso / ElasticNet**:透過 L2 / L1 正則化降低過擬合並挑選重要特徵。
- **Logistic 迴歸**:分類任務的基礎模型,輸出為機率值,可透過閾值決定類別。
#### Python 範例
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from sklearn.metrics import mean_squared_error, accuracy_score
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
linreg = LinearRegression().fit(X_train, y_train)
pred = linreg.predict(X_test)
rmse = mean_squared_error(y_test, pred, squared=False)
print('RMSE:', rmse)
#### R 範例
R
library(glmnet)
x <- as.matrix(df[ , -ncol(df)])
y <- df$target
cv.lasso <- cv.glmnet(x, y, alpha=1)
best.lambda <- cv.lasso$lambda.min
lasso.model <- glmnet(x, y, alpha=1, lambda=best.lambda)
> **心得**:線性模型在資料量大、特徵相對線性時表現出色;但若存在非線性或交互效應,往往需要轉向更複雜的模型。
### 4.2 樹模型
- **決策樹**:透過資訊增益或基尼係數分裂特徵,生成可視化的分類/回歸樹。
- **隨機森林**:多棵樹的投票或平均結果,提升穩定性與泛化能力。
- **梯度提升樹(GBDT)**:逐步修正殘差,取得高精度的預測效果。
#### Python 範例
python
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
rf = RandomForestRegressor(n_estimators=500, max_depth=10, random_state=42)
rf.fit(X_train, y_train)
rf_pred = rf.predict(X_test)
gbdt = GradientBoostingRegressor(n_estimators=400, learning_rate=0.05, max_depth=5)
gbdt.fit(X_train, y_train)
gbdt_pred = gbdt.predict(X_test)
> **注意**:樹模型易於捕捉非線性與高階交互,但若特徵維度極高,可能導致過擬合;此時可利用正則化或早停機制。
### 4.3 XGBoost 與 LightGBM
- **XGBoost**:針對缺失值、稀疏特徵進行內部處理,訓練速度快、效果優。
- **LightGBM**:使用基於直方圖的分裂,適合極大資料集。
#### Python 範例
python
import xgboost as xgb
xgb_reg = xgb.XGBRegressor(
n_estimators=800,
learning_rate=0.03,
max_depth=6,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1,
reg_lambda=1
)
xgb_reg.fit(X_train, y_train)
xgb_pred = xgb_reg.predict(X_test)
> **實務建議**:對於需要處理缺失值且特徵較為稀疏的業務場景,XGBoost 是首選;若資料量超過數百萬筆,則 LightGBM 更具成本效益。
### 4.4 深度學習
- **多層感知機 (MLP)**:最基礎的前饋網路,適用於結構化資料。
- **卷積神經網路 (CNN)**:處理圖像或時間序列資料,可捕捉局部特徵。
- **長短期記憶 (LSTM)**:針對序列資料的長期依賴,適合預測股票、銷售等。
- **Transformer**:自注意力機制,可並行處理序列,成為 NLP 與時序預測的新標準。
#### Python 範例(Keras)
python
from tensorflow.keras import models, layers
model = models.Sequential()
model.add(layers.Dense(128, activation='relu', input_shape=(X_train.shape[1],)))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
history = model.fit(X_train, y_train, epochs=50, batch_size=32,
validation_split=0.2, verbose=2)
#### R 範例(keras)
R
library(keras)
model <- keras_model_sequential() %>%
layer_dense(units = 128, activation = 'relu', input_shape = ncol(X_train)) %>%
layer_dropout(rate = 0.2) %>%
layer_dense(units = 64, activation = 'relu') %>%
layer_dense(units = 1)
model %>% compile(
optimizer = 'adam',
loss = 'mse',
metrics = list('mae')
)
history <- model %>% fit(
X_train, y_train,
epochs = 50, batch_size = 32,
validation_split = 0.2
)
> **挑戰**:深度學習模型需求大量資料與計算資源;若資料量有限,容易過擬合。可透過資料增強、正則化或先用簡單模型做特徵提取。
### 4.5 模型評估與選擇
- 線性模型:速度快、易解釋。
- 樹模型:能處理缺失、非線性。
- XGBoost/LightGBM:高效能、適合大規模資料。
- 深度學習:針對結構化或序列/圖像資料的極限情境。
在實際專案中,**模型的複雜度應與資料品質、業務目標與資源成本相匹配**。