特徵工程心法¶
「Garbage in, garbage out.」業界 DS 約 80% 時間在這裡。Kaggle 賽到後段,大家都用 LightGBM,贏的是特徵工程。好特徵往往勝過複雜模型。 本頁定位:本區「資料進模型前該怎麼處理」的完整版,決定做什麼;對應的怎麼寫(Pipeline、ColumnTransformer、自訂 Transformer)見〈sklearn Pipeline 與資料前處理模板〉。
數值型特徵¶
縮放(線性模型/NN/SVM/KNN 需要;樹模型不用)¶
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# StandardScaler:均值0、標準差1 —— 通用首選
# MinMaxScaler :縮到 [0,1] —— 需固定範圍輸入(如 NN)
# RobustScaler :用中位數與 IQR —— 有異常值時
面試常考
樹模型不需要標準化——CART 分裂只看閾值(大小順序),與絕對數值無關。線性模型靠 w·x,尺度差太大會讓梯度偏向大數值特徵、收斂慢又跑歪。
分箱(Binning)¶
連續變數切成類別(年齡→兒童/青年/中年/老年):處理非線性、降噪、增可解釋性。
變換(Transformation)¶
Log(處理右偏,如收入/人口)、Square root(較溫和)、Box-Cox(自動找最佳變換)。
類別型特徵¶
| 編碼 | 做法 | 適用 / 注意 |
|---|---|---|
| One-Hot | 每類別一欄 0/1 | 類別少(<10);多會維度爆炸 |
| Label | 紅→0、黃→1… | 有序(學歷)OK;無序給線性模型會誤判大小,樹模型可處理 |
| Target | 類別→該類別 target 均值 | 高基數(郵遞區號/商品 ID)最有用;易 leak,必須 CV-based |
| Frequency | 類別→出現頻率 | 高基數的輕量替代 |
缺失值¶
策略:刪除(缺失 >50% 考慮)、填均值/中位數(隨機缺失)、填眾數(類別)、填特殊值(−999/「未知」讓模型自學)、模型預測填補(MICE)、保留缺失當特徵。
業界領悟
加一個 is_missing 布林旗標常有奇效——缺失本身可能就是訊號(沒填收入的人行為模式本就不同)。
時間特徵¶
從 datetime 抽:年/月/日/時/星期幾、是否週末/假日、距某重要日幾天。周期性用 sin/cos(讓 23 點與 0 點在數值上相近):
特徵交互¶
兩特徵組出新特徵:BMI = 體重 / 身高²、座標×距離…—業務領悟常在這裡贏。
特徵選擇¶
- 過濾式(Filter):刪低變異、用相關係數/互信息選前 N;快但不看交互。
- 包裝式(Wrapper):RFE 遞迴消除;慢但考慮與模型互動。
- 嵌入式(Embedded):L1 正則化(不重要係數歸零)、樹模型 feature importance。
imbalanced data 常用手法¶
SMOTE(合成少數類)、上/下採樣、class_weight。
🎤 面試口答
- 樹模型為何不用標準化、線性要:樹只看大小順序、縮放不改分裂;線性靠 w·x,尺度差會讓梯度偏向大數值特徵。
- One-Hot 維度爆炸怎麼辦:改 Target Encoding(配 CV 防 leak)/ Frequency Encoding / NN Embedding;樹模型可用 Label Encoding。
- 缺失為何有時保留不填:缺失本身是訊號,加
is_missingflag 比填均值更保留資訊。 - Target Encoding 的 leakage 與防法:用整個訓練集均值 encode 等於看到自己的 label;用 CV-based(每折只用其他折的均值)來防。
延伸閱讀(本站)¶
- sklearn Pipeline 與資料前處理模板 — 本頁每個處理步驟對應的可複製程式碼
- ML 面試核心觀念 — 縮放為何影響線性模型、L1 為何能選特徵
- Géron《Hands-On ML》Ch1–9 重點整理 — Ch2 端到端專案裡的資料準備脈絡
- 模型評估與 Cross-Validation 實務 — target encoding 等前處理如何在 CV 中不漏水
- 常見 ML Case Study — 四種任務各自的特徵設計取捨
參考資料¶
本頁為實務心法的個人整理。各手法的標準出處:
- scikit-learn User Guide: Preprocessing data
- scikit-learn User Guide: Feature selection
- imbalanced-learn 官方文件(SMOTE 與重採樣)
- category_encoders 官方文件(Target / Frequency Encoding)
- Géron, A.《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》, 3rd ed. Ch2