返回目錄
A
資料科學實務與方法:從理論到應用 - 第 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` 以確保可重現。