聊天視窗

數據科學的邏輯與實踐:從基礎到高階決策 - 第 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,讓同伴也能受益。