返回目錄
A
數據科學的邏輯與實踐:從基礎到高階決策 - 第 4 章
第四章 資料前處理與特徵工程:為模型鋪路
發布於 2026-03-06 14:15
# 第四章 資料前處理與特徵工程:為模型鋪路
> **開場小詩**:\n> 資料的乾淨程度決定了模型的命運;\n> 像打磨石頭的工匠,唯有細緻雕琢,才能鑄就精良之物。
---
## 4.1 為什麼前處理是關鍵?
在你把資料交給任何機器學習演算法之前,先把它「打磨」乾淨,能夠大幅提升模型的表現、穩定性,甚至讓後續的部署與監控變得更容易。舉個簡單的例子:若有 10% 的數值資料缺失,而這些缺失點恰好集中在某一類樣本,直接擬合會把這個類別的特徵視為極端值,進而導致偏差。若先行補值或刪除,再進行模型訓練,模型就能更好地捕捉真正的關聯。
> **實務提醒**:前處理往往比模型調參更耗時。建議先用「pipeline」將前處理與模型組合,減少重複工作。
## 4.2 缺失值處理
| 方法 | 何時適用 | 優點 | 局限 |
|---|---|---|---|
| 刪除 | 缺失比例 < 5% 且隨機 | 簡單直觀 | 可能失去資訊 |
| 平均/中位數填補 | 連續型 | 保留樣本數 | 低變異性 |
| 最頻值填補 | 分類型 | 保留類別比例 | 可能過度簡化 |
| 迴歸填補 | 需要更複雜 | 可捕捉關聯 | 計算成本 |
| KNN 填補 | 需要相似樣本 | 效果好 | 計算量大 |
> **案例**:某線上零售商的交易資料中,約 8% 的 `delivery_days` 缺失。先以月平均值填補,後續用 `RandomForestRegressor` 再細調填補值,最終預測準確率提升 2.3%。
## 4.3 資料型別轉換
1. **數值 → 數值**:如 `price` 可能以「$12.50」字串存放,先用正則式抽取數字。
2. **數值 → 分類**:對於年齡,可用分段式 binning 轉成「18‑24、25‑34」等。
3. **分類 → 數值**:One‑Hot、Label Encoding 或 Target Encoding。
> **提示**:在進行 One‑Hot 時,避免「高維稀疏」問題,可採用 `category_encoders` 的 `OrdinalEncoder` 或 `TargetEncoder`。
## 4.4 異常值檢測與處理
| 方法 | 描述 |
|---|---|
| IQR 方式 | 取 Q1–Q3 的四分位距,異常值為 < Q1‑1.5IQR 或 > Q3+1.5IQR |
| Z‑score | 當標準分數 > 3 或 < –3 時視為異常 |
| Isolation Forest | 無監督,適合多維資料 |
> **案例**:某保險公司在預測理賠金額時,發現有 1% 的樣本為超過 10 倍平均值的異常。經過 Isolation Forest 判定後,將其剔除,模型 RMSE 下降 8%。
## 4.5 特徵縮放
| 方法 | 何時適用 |
|---|---|
| Min–Max | 需要將所有特徵映射到相同範圍 [0,1],常用於 Neural Network |
| Standardization | 需要保持分佈形狀,常用於線性模型、SVM |
| Robust Scaler | 受極端值影響大時,使用 25%–75% 分位數 |
> **實務小貼士**:如果你同時使用多種模型,建議在 pipeline 中為每個模型配置不同的 scaler,以避免「樣本不一致」問題。
## 4.6 分類特徵編碼
| 編碼 | 優缺點 |
|---|---|
| One‑Hot | 簡單直觀,維度爆炸 |
| Target / Mean Encoding | 維度低,易於捕捉目標變量訊息,但易過擬合 |
| CatBoost Encoder | 基於決策樹,保留多重關聯 |
> **案例**:在房價預測中,城市分類編碼使用 CatBoost Encoder,直接帶入 100 萬筆資料,模型 MAPE 從 12% 降至 9%。
## 4.7 特徵選擇與降維
1. **Filter 方法**:相關係數、卡方檢驗、ANOVA 等。
2. **Wrapper 方法**:Recursive Feature Elimination (RFE)。
3. **Embedded 方法**:Lasso、Tree‑based Feature Importance。
4. **降維**:PCA、t‑SNE、UMAP。PCA 主要用於減少維度並保留方差;t‑SNE、UMAP 適合視覺化。
> **實務案例**:在銀行信貸風險評估中,使用 Lasso 降維到 20 個特徵,模型 AUC 提升 4%。
## 4.8 建立完整 Pipeline
python
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
numeric_features = ['age', 'income', 'balance']
cat_features = ['gender', 'city']
numeric_transformer = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline([
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer([
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, cat_features)
])
clf = Pipeline([
('preprocess', preprocessor),
('model', RandomForestClassifier(n_estimators=200, random_state=42))
])
> **提醒**:將前處理封裝進 Pipeline,可以確保測試集不被前處理步驟「洩漏」資訊,同時也方便日後再調參。若使用 `mlflow`,只需 `mlflow.sklearn.log_model(clf)` 就能保存整個 pipeline。
## 4.9 案例:電商客戶終身價值預測
1. **資料**:500,000 條訂單、200,000 條客戶、30 個特徵。
2. **缺失處理**:使用 KNN 進行填補,K=5。
3. **編碼**:對「產品類別」採用 Target Encoding,防止維度爆炸。
4. **特徵縮放**:對連續特徵使用 Robust Scaler。
5. **特徵選擇**:利用 XGBoost 的重要性指標挑選 top 15。
6. **模型**:LightGBM Regressor,最終 MAE 下降 12%。
7. **部署**:打包成 Docker,透過 FastAPI 提供預測 API。
> **結語**:前處理不僅是「資料清洗」,更是為模型奠定「可靠基礎」。若在前處理上投資時間,往往能換來 10%–30% 的性能提升,甚至讓模型更易於解釋與監控。
---
> **章末小練**:挑選一筆你手頭的資料,嘗試完成一次完整的前處理流程,並記錄每一步的時間與效果。將結果分享於專案的 README,讓同伴也能受益。