返回目錄
A
數據科學:從原始資料到策略洞察 - 第 4 章
第4章 特徵工程:從洞察到可用特徵的轉化
發布於 2026-02-25 10:50
# 第4章 特徵工程:從洞察到可用特徵的轉化
> **「特徵工程」不僅是資料處理的工具箱,更是一座把原始訊息轉化為模型語言的橋樑。**
本章將帶領讀者由先前 EDA 取得的洞察出發,進一步把數據轉化為「模型可識別」的特徵。特徵工程的核心在於 **選擇**、**轉換** 與 **創造**。透過實務範例,我們將逐步示範如何將統計量、領域知識與算法智慧結合,打造可落地的預測模型。
---
## 4.1 為何特徵工程是成功模型的關鍵
1. **信息增益**:在模型學習前,將原始數據轉換成更能表徵目標的特徵,能顯著提升模型的預測能力。
2. **維度管理**:過多冗餘或不相關特徵會造成「維度災難」——資料稀疏、計算成本高、過擬合風險上升。
3. **可解釋性**:有結構的特徵更易於人類解讀,協助策略決策者從模型結果中提煉可執行的洞察。
> 具體來說,我們不只是要「去掉」不良特徵,更要「創造」能捕捉重要關係的新特徵。這是一門結合統計、領域知識與機器學習的綜合技術。
---
## 4.2 特徵工程流程概覽
```
① 需求分析 & 資料探索
② 相關性與多重共線性檢測
③ 失真與異常處理
④ 特徵選擇(Filter / Wrapper / Embedded)
⑤ 特徵轉換(Scaling, Encoding, Feature Synthesis)
⑥ 特徵評估與迭代
⑦ 交叉驗證 + 版本管理
```
> 這個流程並非線性迴圈;在實務中,往往需要在 ② 與 ④ 之間來回切換,甚至在 ⑤ 與 ⑥ 之間進行多次迭代。良好的版本管理(如 `MLflow` 或 `DVC`)可確保每一步改動都可追蹤與回溯。
---
## 4.3 失真與異常處理:確保特徵品質的第一步
| 步驟 | 方法 | 主要工具 |
|---|---|---|
| 缺失值補齊 | 均值 / 中位數 / 預測模型 | `pandas`, `scikit‑learn` Imputer |
| 離群值檢測 | IQR, Z‑score, Isolation Forest | `scipy.stats`, `scikit‑learn` IsolationForest |
| 數據類型轉換 | 類別 → 數值, 時間序列拆解 | `pandas`, `datetime` |
```python
import pandas as pd
from sklearn.impute import SimpleImputer
from scipy.stats import zscore
# 缺失值補齊
imp_mean = SimpleImputer(strategy='mean')
X_imp = pd.DataFrame(imp_mean.fit_transform(X), columns=X.columns)
# 離群值標記
X_imp['z_score'] = zscore(X_imp['sales'])
X_imp.loc[abs(X_imp['z_score']) > 3, 'sales'] = X_imp['sales'].median()
```
> **提示**:在處理時間序列資料時,先將時間拆解成「年、季、月、日、週、工作日/週末」等元件,能捕捉季節性與週期性變化。
---
## 4.4 相關性與多重共線性檢測
- **Pearson / Spearman**:衡量線性/非線性相關。
- **VIF (Variance Inflation Factor)**:評估共線性程度。
```python
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 只保留數值特徵
numeric_cols = X_imp.select_dtypes(include=['number']).columns
X_num = X_imp[numeric_cols]
# 計算 VIF
vif_data = pd.DataFrame()
vif_data['feature'] = numeric_cols
vif_data['VIF'] = [variance_inflation_factor(X_num.values, i) for i in range(X_num.shape[1])]
print(vif_data)
```
> **最佳實踐**:當 VIF > 5 或 10 時,考慮刪除或合併特徵;若兩個特徵高度相關(|r|>0.9),保留對業務更具解釋性的那一個。
---
## 4.5 特徵選擇方法
| 類型 | 描述 | 優點 | 缺點 |
|---|---|---|---|
| Filter | 基於統計指標(如相關性、卡方) | 快速、無模型依賴 | 可能忽略特徵交互作用 |
| Wrapper | 迭代訓練模型評估(如 Recursive Feature Elimination, RFE) | 以模型性能為基準 | 計算成本高 |
| Embedded | 模型自帶正則化或特徵重要性(如 Lasso, Random Forest) | 同時做特徵選擇與模型訓練 | 需要模型先行訓練 |
```python
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression(max_iter=1000)
selector = RFE(estimator, n_features_to_select=10, step=1)
selector.fit(X_num, y)
X_selected = X_num.loc[:, selector.support_]
```
> 在實務中,**組合使用** Filter + Embedded 能在保持速度的同時避免過度簡化。
---
## 4.6 特徵轉換:從原始數據到模型友好格式
1. **標準化 / 正規化**:
- **StandardScaler** (z‑score)
- **MinMaxScaler** (0-1)
2. **編碼**:
- **LabelEncoder** / **OneHotEncoder**(對順序性與名義型變數)
- **Target Encoding**(對高基數類別)
3. **衍生特徵**:
- **交互項**:`X['feature_a'] * X['feature_b']`
- **多項式特徵**:`PolynomialFeatures(degree=2, include_bias=False)`
- **時間特徵拆解**:`X['month']`, `X['day_of_week']`
- **聚合特徵**:`groupby` + `agg`(如平均銷售、最高銷售)
4. **文本特徵**:TF‑IDF、Word2Vec、BERT embeddings。
```python
from sklearn.preprocessing import OneHotEncoder, StandardScaler, PolynomialFeatures
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
numeric_features = ['age', 'income']
categorical_features = ['region', 'product_category']
numeric_transformer = Pipeline(steps=[('scaler', StandardScaler()),
('poly', PolynomialFeatures(degree=2, include_bias=False))])
categorical_transformer = OneHotEncoder(handle_unknown='ignore')
preprocessor = ColumnTransformer(transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
```
> **實戰小技巧**:在處理高基數類別(如商品編號)時,直接 OneHot 會造成維度爆炸。此時可使用 **Target Encoding** 或 **Frequency Encoding**。
---
## 4.7 特徵評估:從性能到可解釋性
1. **模型性能**:使用交叉驗證評估預測準確率、AUC、RMSE 等。
2. **特徵重要性**:
- **Permutation Importance**:評估特徵移動對模型性能的影響。
- **SHAP / LIME**:解釋單筆預測,識別關鍵特徵。
3. **穩健性測試**:
- **敏感度分析**:調整特徵值範圍觀察預測變化。
- **對抗測試**:檢查模型對極端數據或噪聲的魯棒性。
```python
from sklearn.inspection import permutation_importance
model.fit(X_train, y_train)
results = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=42)
importances = pd.Series(results.importances_mean, index=X_test.columns)
importances.sort_values().plot(kind='barh')
```
> **實務提醒**:在決策場景中,**可解釋性往往比微小的性能提升更具價值**。尤其在金融、醫療等高風險領域。
---
## 4.8 版本管理與重複實驗
- **MLflow**:追蹤實驗、參數、模型。
- **DVC**:資料版本控制,保持數據集一致。
- **Git + GitHub Actions**:自動化流水線,確保每一次特徵變更都有回溯。
> **最佳實踐**:將特徵工程腳本封裝成 `Python Package`,並透過 `setup.py` 或 `pyproject.toml` 管理依賴,確保多個團隊同時工作時的 reproducibility。
---
## 4.9 小案例:零售銷售預測的特徵工程
> **背景**:某電商平台希望預測未來一週的每日銷售額。
| 步驟 | 描述 |
|---|---|
| 1. 資料探索 | 觀察銷售額與時間、節假日、促銷活動的關係。 |
| 2. 時間特徵 | `day_of_week`, `is_weekend`, `is_holiday` |
| 3. 促銷衍生特徵 | `promo_level`, `days_since_last_promo` |
| 4. 聚合特徵 | `avg_sales_last_7days`, `max_sales_last_30days` |
| 5. 標準化 & 編碼 | `StandardScaler` + `OneHotEncoder` |
| 6. 特徵選擇 | RFE + Random Forest importance |
| 7. 評估 | 交叉驗證 RMSE = 12.5% |
> **結果**:在原始特徵基礎上,特徵工程提升預測準確率 18%,並能夠提供「哪種促銷級別最有效」的業務洞察。
---
## 4.10 結語:特徵工程的藝術與科學
1. **數據品質**:失真與異常處理是基礎。
2. **業務洞察**:從領域知識出發,設計可解釋衍生特徵。
3. **科學方法**:相關性檢測、VIF、特徵選擇與轉換。
4. **工具鏈**:`pandas`, `scikit‑learn`, `statsmodels`, `MLflow`, `DVC`。
5. **可解釋性**:SHAP、Permutation Importance 為決策提供信心。
> **學習重點**:特徵工程不是一次性工作,而是持續的迭代。保持實驗可復現、可解釋,才能在複雜業務場景中真正發揮 AI 的價值。
---
**作業**:請使用上面提供的流程,在 Kaggle 的 `house‑price‑advanced‑regression‑models` 數據集上實作特徵工程,並在 `MLflow` 中記錄參數、特徵選擇結果、最終模型指標。請在 24 小時內提交 Jupyter Notebook 與 `requirements.txt`。
---
**感謝閱讀**:本章結合統計、機器學習與實務工具,力求在「特徵品質 → 性能提升 → 可解釋性」的三重維度上提供完整流程。