跳轉到

特徵工程心法

「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 點在數值上相近):

df['hour_sin'] = np.sin(2*np.pi*df['hour']/24)
df['hour_cos'] = np.cos(2*np.pi*df['hour']/24)

特徵交互

兩特徵組出新特徵: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_missing flag 比填均值更保留資訊。
  • Target Encoding 的 leakage 與防法:用整個訓練集均值 encode 等於看到自己的 label;用 CV-based(每折只用其他折的均值)來防。

📌 延伸:縮放/正則化見〈ML 面試核心觀念〉,端到端的 Pipeline 防 leakage 見〈Géron Ch1–9 重點整理〉。