聊天視窗

資料科學實務與方法:從理論到應用 - 第 5 章

5. 特徵工程:從原始數據到可用特徵

發布於 2026-03-04 03:10

# 5. 特徵工程:從原始數據到可用特徵 > 在前一章,我們學習了如何透過探索性資料分析(EDA)快速洞察數據結構與潛在問題。接下來,我們將把目光聚焦於 **特徵工程**——將原始數據轉換為模型可直接利用的資訊。特徵工程是資料科學裡的「潛力發掘」過程,也是提升模型性能的關鍵。 ## 5.1 為什麼特徵工程重要 - **數據質量**:雖然模型本身非常先進,但如果輸入特徵本身「脏」或不具資訊量,模型永遠無法突破。 - **學習效率**:恰當的特徵能減少模型學習所需的迭代次數,提升訓練速度。 - **解釋性**:某些特徵工程手法(如分箱、交互項)能直接映射到業務語境,幫助決策者理解模型預測。 ## 5.2 標準化與正規化 | 方法 | 適用情境 | 公式 | 影響 | |------|----------|------|------| | **Min‑Max Scaling** | 數值範圍差異大 | \(x' = \frac{x - \min(x)}{\max(x) - \min(x)}\) | 把所有特徵壓縮至 [0,1] 範圍,常用於神經網路。 | **Z‑Score Standardization** | 正態分布假設 | \(x' = \frac{x - \mu}{\sigma}\) | 使特徵均值 0,方差 1,適合大部分機器學習演算法。 | **Robust Scaling** | 存在極端值 | \(x' = \frac{x - \text{median}(x)}{\text{IQR}(x)}\) | 對離群點不敏感,保留中位數與四分位差。 > **實務提醒**:請確保在 *測試集* 上使用相同的縮放參數,避免資料洩露。`sklearn.preprocessing.StandardScaler`、`MinMaxScaler` 皆能自動記錄參數。 ## 5.3 變數轉換(對數、平方根等) 許多業務指標呈現偏態分布(如收入、使用時間)。透過對數或平方根轉換可以讓分布更接近正態,從而提升模型對尾部資料的捕捉力。 ```python import numpy as np import pandas as pd df = pd.read_csv('customer_churn.csv') # 轉換 TotalCharges df['log_TotalCharges'] = np.log1p(df['TotalCharges']) # log(1+x) 防止 0 # 轉換 MonthlyCharges df['sqrt_MonthlyCharges'] = np.sqrt(df['MonthlyCharges']) ``` > **探索性實驗**:使用 `sns.histplot` 觀察轉換前後的直方圖,並確認 Kolmogorov‑Smirnov 檢定值是否下降。 ## 5.4 分類特徵編碼 | 編碼方式 | 何時選用 | 特色 | |----------|----------|------| | **Label Encoding** | 只有兩類或類別順序 | 直接映射到整數,適用樹模型 | | **One‑Hot Encoding** | 無序多類別 | 擴展為稀疏向量,避免順序誤解 | | **Target Encoding** | 目標變數較少 | 使用目標均值進行映射,防止高維度 | ```python from sklearn.preprocessing import OneHotEncoder enc = OneHotEncoder(handle_unknown='ignore') X_cat = enc.fit_transform(df[['InternetService', 'Contract']]) ``` > **注意**:對於大類別變數(如 `State` 可能有 50+ 狀態),`Target Encoding` 或 `Frequency Encoding` 更為高效。 ## 5.5 時間序列特徵 在電信資料中,`tenure`(用戶年限)本身就有時間含義,但我們還可以衍生更多時間特徵: - **季節性**:將 `month` 編碼為 4 個季節。 - **週期性**:將 `day_of_week` 轉為週期三角函數。 - **滯後特徵**:例如上一個月的 `Churn`。 ```python import calendar # 以 'LastDayOfMonth' 產生季節 month_to_quarter = {m: (m-1)//3 + 1 for m in range(1,13)} df['quarter'] = df['month'].map(month_to_quarter) ``` ## 5.6 交互特徵 交互特徵可揭示變數之間的非線性關係。舉例來說,`MonthlyCharges` 與 `tenure` 的乘積可能反映客戶長期承諾度。可以使用 `PolynomialFeatures` 或手動組合。 ```python from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly.fit_transform(df[['MonthlyCharges', 'tenure']]) ``` > **實驗小技巧**:使用 `np.corrcoef` 或 `heatmap` 視覺化交互項與目標之間的相關性。 ## 5.7 特徵選擇 特徵工程往往會產生大量新變數,過度擴張會導致模型過擬合。常用特徵選擇方法包括: - **Filter**:相關係數、卡方檢定。 - **Wrapper**:RFE(Recursive Feature Elimination)。 - **Embedded**:L1 正則化、Tree‑based feature importance。 ```python from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X, y) selector = SelectFromModel(rf, threshold='median') X_selected = selector.transform(X) ``` ## 5.8 自動化特徵工程工具:Featuretools 對於結構化資料庫,`Featuretools` 能自動從關聯表中生成交互、聚合特徵,極大降低人力成本。 ```python import featuretools as ft es = ft.EntitySet(id='customer_data') es.entity_from_dataframe(entity_id='customers', dataframe=df, index='customerID', time_index='tenure') # 自動聚合特徵 feature_matrix, feature_defs = ft.dfs(entityset=es, target_entity='customers', max_depth=2) ``` > **實務建議**:自動特徵不一定是最佳,請結合業務領域知識進行篩選。 ## 5.9 實戰案例:電信客戶流失預測 1. **讀取資料**: ```python df = pd.read_csv('customer_churn.csv') ``` 2. **前處理**:缺失值填補、數值縮放、分類編碼。 3. **特徵工程**: - 轉換 `TotalCharges`、`MonthlyCharges`。 - 建立 `log_TotalCharges`, `sqrt_MonthlyCharges`。 - One‑Hot 編碼 `InternetService`, `Contract`。 - 交互特徵 `MonthlyCharges*tenure`。 - 交互特徵 `InternetService` × `Contract`(使用 `pandas.get_dummies` 合併)。 4. **特徵選擇**:使用 `SelectFromModel` 搭配 `XGBoost`。 5. **模型訓練**: ```python from xgboost import XGBClassifier clf = XGBClassifier(n_estimators=200, max_depth=5, learning_rate=0.1) clf.fit(X_train, y_train) ``` 6. **評估**:ROC‑AUC、混淆矩陣、特徵重要性繪圖。 7. **部署**:將模型包裝為 REST API(FastAPI)並上傳至 Azure Functions。 > **小結**:在此案例中,特徵工程的提升占比超過 20% 的準確度增幅,證明「先行處理」的力量。 ## 5.10 小結 - **特徵工程是資料科學的「中介」**:它把業務語言轉換為模型語言。 - **流程**:清洗 → 轉換 → 編碼 → 交互 → 選擇 → 評估。 - **工具與技巧**:從簡單的 `scikit-learn` API 到自動化工具 `Featuretools`,選擇合適的方案是關鍵。 - **下一章展望**:在掌握了特徵工程後,我們將深入機器學習模型的訓練與調參,並探討如何在實際業務中落地。 > **練習題**: > 1. 對 `customer_churn.csv` 進行 5 次交叉驗證,測試不同特徵選擇方法(Filter、Wrapper、Embedded)對最終模型性能的影響。 > 2. 使用 `Featuretools` 重新生成特徵,並與手動特徵比較,說明兩者差異。 > 3. 在 Kaggle Notebook 中實作一個簡易的特徵工程 Pipeline,並在 `requirements.txt` 中列出所有依賴,最後提交 `Dockerfile` 以確保可重現。