返回目錄
A
數據洞見:從原始數據到商業決策的機器學習實戰 - 第 5 章
第5章 特徵工程與特徵選擇
發布於 2026-02-28 07:56
# 第5章 特徵工程與特徵選擇
在資料科學的實務流程中,特徵工程往往是成敗關鍵。它不僅是將原始資料轉換為模型可解讀的輸入,更是提升預測精度、降低過擬合、提升模型可解釋性的核心。以下將從 **特徵拆解**、**特徵衍生**、**特徵縮減**三大面向,深入探討方法、工具與最佳實務,並結合商業案例說明如何透過特徵重要性評估與選擇策略,將高維資料轉化為高價值的特徵集。
## 5.1 特徵拆解:從原始資料解構
| 步驟 | 目的 | 典型範例 |
|------|------|----------|
| 1. **欄位拆分** | 將複合欄位拆成更細粒度的子欄位 | 例:`Full_Name` → `First_Name`, `Last_Name` |
| 2. **結構化文字** | 從非結構化文字提取結構化資訊 | 例:`Address` → `Street`, `City`, `Zip` |
| 3. **日期時間拆解** | 從時間戳記提取年、月、日、星期、季節等 | 例:`Order_Date` → `Year`, `Month`, `Weekday` |
| 4. **分隔符拆解** | 依照分隔符拆分多值欄位 | 例:`Tags` → `Tag1`, `Tag2`, … |
> **實務提示**:在拆分前先確認資料完整性,避免因缺失值導致拆分失敗。可使用 `pandas.Series.str.split()` 或 `tf.keras.layers.TextVectorization` 等工具。
### 範例:拆解訂單資料
python
import pandas as pd
df = pd.DataFrame({
'Order_ID': [101, 102, 103],
'Order_Date': ['2023-01-15 10:23:00', '2023-02-20 15:45:00', '2023-03-05 09:10:00'],
'Full_Name': ['張三', '李四', '王五'],
})
# 拆解 Order_Date
df['Order_Date'] = pd.to_datetime(df['Order_Date'])
df['Year'] = df['Order_Date'].dt.year
df['Month'] = df['Order_Date'].dt.month
df['Weekday'] = df['Order_Date'].dt.weekday # 0=Mon
print(df[['Order_ID', 'Year', 'Month', 'Weekday']])
## 5.2 特徵衍生:創造新資訊
### 5.2.1 數學運算
| 類型 | 說明 | 例子 |
|------|------|------|
| 標準化 (Z-score) | 轉換為均值 0、標準差 1 | `(x - μ) / σ` |
| 正規化 (Min‑Max) | 將值壓縮至 [0,1] | `(x - min) / (max - min)` |
| Log / Box‑Cox | 處理偏態分布 | `np.log1p(x)` |
### 5.2.2 交互特徵
> 兩個或多個特徵之間的乘積、比值、差值等。
python
# 交互特徵示例:Monthly_Charge * Tenure
import numpy as np
df['Monthly_Charge_Log'] = np.log1p(df['Monthly_Charge'])
df['Charge_Tenure_Interaction'] = df['Monthly_Charge_Log'] * df['Tenure']
### 5.2.3 位置特徵
| 來源 | 應用 | 例子 |
|------|------|------|
| 地理 | 用戶分區 | 緯度 & 經度 → 近鄰中心距離 |
| 時間 | 節假日、工作日 | `df['Is_Holiday'] = df['Date'].isin(holidays)` |
## 5.3 特徵縮減:降低維度、保留訊息
| 方法 | 原理 | 優缺點 |
|------|------|------|
| 主成份分析 (PCA) | 透過線性變換最大化變異量 | 直覺、可視化,但不保留類別關係 |
| t‑SNE / UMAP | 非線性降維、保留局部結構 | 計算量大、參數多 |
| Lasso / ElasticNet | 透過 L1 正則化自動遺失不重要特徵 | 需要調參、對非線性不敏感 |
| 遺傳演算法 | 適應性選擇子集 | 需要大量運算、結果不一定穩定 |
### 5.3.1 PCA 範例
python
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
X = df.drop(columns=['Target'])
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=0.95) # 保留 95% 變異量
X_pca = pca.fit_transform(X_scaled)
print(f'原始特徵數: {X.shape[1]}, PCA 之後: {X_pca.shape[1]}')
> **注意**:PCA 會把特徵組合成線性不相關的組合,若要保留類別可視化或解釋性,需考慮使用 `SparsePCA` 或 `FactorAnalysis`。
## 5.4 特徵重要性評估
| 模型 | 重要性指標 | 典型工具 |
|------|------------|----------|
| 決策樹 / 隨機森林 | Gini / Entropy | `feature_importances_` |
| 梯度提升 | SHAP | `shap.TreeExplainer` |
| 線性模型 | 回歸係數 | `coef_` |
| XGBoost | Gain / Cover | `xgboost.plot_importance` |
### 5.4.1 SHAP 解釋
python
import shap
model = XGBClassifier().fit(X_train, y_train)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
> **實務建議**:先用模型訓練出重要性排序,再根據業務需求挑選「可解釋」且「可操作」的特徵。若重要性排序高度相近,可透過 **Permutation Importance** 進一步驗證。
## 5.5 特徵選擇策略
### 5.5.1 過濾法(Filter)
- **統計檢定**:Chi‑Square、ANOVA、Correlation threshold。
- **優點**:計算快速、易於實現。
python
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)
X_filtered = selector.fit_transform(X)
### 5.5.2 包裝法(Wrapper)
- **遞迴特徵刪除 (RFE)**、**貪婪搜索 (Forward/Backward)**。
- **優點**:考慮模型交互,結果更穩健。
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)
X_selected = selector.fit_transform(X, y)
### 5.5.3 嵌入法(Embedded)
- **L1 正則化**、**決策樹**、**XGBoost** 內建重要性。
- **優點**:同時完成模型訓練與特徵選擇。
python
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
selected = X.columns[lasso.coef_ != 0]
## 5.6 案例:金融風險評估特徵工程
| 步驟 | 描述 |
|------|------|
| 1. 資料拆解 | `Full_Name` → `First_Name`, `Last_Name`;`Account_Balance` → `Balance_Log` |
| 2. 特徵衍生 | `Debt_to_Income` = `Total_Debt` / `Annual_Income`;`Tenure_Years` = `Months_in_Service` / 12 |
| 3. 特徵縮減 | 使用 **PCA** 於 `Transaction_History` 縮減 100 個特徵至 20 個主成份 |
| 4. 重要性評估 | 以 **XGBoost** 取得 Top 15 重要特徵,並以 **SHAP** 解釋單筆預測 |
| 5. 特徵選擇 | 結合 **Filter**(Correlation < 0.9)與 **Embedded**(L1)最終挑選 30 個特徵 |
> **結果**:模型 F1-score 從 0.78 提升至 0.86,且可解釋性顯著提高,支持業務風險控制決策。
## 5.7 小結
> 特徵工程不是「一次性的技術」而是 **持續迭代** 的流程。從拆解、衍生、縮減到選擇,每一步都應結合 **業務需求**、**資料特性** 與 **模型特性**,才能真正將資料轉化為商業價值。
>
> **關鍵要點**:
> - **拆解**:先把複合資料拆成可操作單元。
> - **衍生**:創造能捕捉非線性關係的新特徵。
> - **縮減**:降低維度,提升訓練速度與模型泛化。
> - **重要性評估**:使用多種指標確定「真正重要」的特徵。
> - **選擇策略**:根據資料量、模型類型選擇 Filter/Wrapper/Embedded,並交叉驗證。
>
> 透過本章所示方法,您將能在實務專案中快速、系統化地打造高效、可解釋的特徵集,為後續模型建構與部署奠定堅實基礎。