特徵工程心法¶
「Garbage in, garbage out.」業界 DS 約 80% 時間在這裡。Kaggle 賽到後段,大家都用 LightGBM,贏的是特徵工程。好特徵往往勝過複雜模型。
數值型特徵¶
縮放(線性模型/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(每折只用其他折的均值)來防。
📌 延伸:縮放/正則化見〈ML 面試核心觀念〉,端到端的 Pipeline 防 leakage 見〈Géron Ch1–9 重點整理〉。