返回目錄
A
數據決策的藝術:從資料蒐集到洞察生成 - 第 5 章
第五章 特徵工程與維度縮減
發布於 2026-02-25 05:56
# 第五章 特徵工程與維度縮減
> **學習目標**
> - 理解特徵工程的核心概念與實務價值。
> - 掌握各類特徵轉換、衍生、選擇及維度縮減方法。
> - 能夠將原始資料轉化為機器學習模型最適合的輸入,並避免常見陷阱。
## 5.1 特徵工程概述
| 項目 | 定義 | 目的 |
|------|------|------|
| Feature | 資料集中的單一可量化變數 | 成為模型學習的輸入 |
| Feature Engineering | 將原始資料轉化、衍生、選擇特徵的整體流程 | 提升模型表現、降低維度、改善可解釋性 |
### 5.1.1 為什麼特徵工程重要?
1. **資料品質**:模型對噪聲、缺失值敏感,合適的處理能降低誤差。
2. **表徵力**:合適的特徵能更好捕捉資料內在關係,提升預測精度。
3. **計算成本**:維度過高會導致「維度詛咒」,影響訓練時間與記憶體佔用。
4. **可解釋性**:特徵選擇與衍生可幫助業務人員理解模型決策。
### 5.1.2 特徵工程流程圖
mermaid
flowchart TD
A[資料蒐集] --> B[資料清理]
B --> C[特徵工程]
C --> D[特徵選擇]
D --> E[模型訓練]
E --> F[模型評估]
F --> G[部署]
## 5.2 轉換(Transformation)與標準化
| 方法 | 何時使用 | 範例 |
|------|----------|------|
| **標準化(StandardScaler)** | 需要零均值、單位方差 | 連續數值型特徵、線性模型 |
| **Min–Max Scaling** | 需要將值限制在 [0,1] | 圖像像素、權重輸入 |
| **對數/平方根變換** | 右偏分布 | 交易金額、頁面瀏覽次數 |
| **Box-Cox / Yeo-Johnson** | 需要穩定方差 | 變數分布嚴重偏斜 |
python
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 讀取範例資料
df = pd.read_csv('sample.csv')
X = df[['age', 'salary', 'log_visits']]
# 標準化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
X_std = pd.DataFrame(X_std, columns=X.columns)
## 5.3 衍生(Construction)與編碼(Encoding)
### 5.3.1 數值衍生
- **比例**:`ratio = total / category_sum`
- **時間差**:`time_diff = event_time - reference_time`
- **累計**:`cumsum = df['value'].cumsum()`
### 5.3.2 類別編碼
| 技術 | 優缺點 | 適用場景 |
|------|--------|----------|
| **One-Hot** | 無序類別,維度高 | 小類別數、樹模型 |
| **Ordinal** | 排序資訊 | 具有順序的類別、線性模型 |
| **Target/Mean** | 防止高維、提升表徵力 | 大類別數、線性/樹模型 |
| **Embeddings** | 大類別、需要深度學習 | NLP、推薦系統 |
python
from sklearn.preprocessing import OneHotEncoder
cat_cols = ['gender', 'region']
encoder = OneHotEncoder(sparse=False, drop='first')
cat_encoded = encoder.fit_transform(df[cat_cols])
cat_encoded = pd.DataFrame(cat_encoded, columns=encoder.get_feature_names_out(cat_cols))
## 5.4 特徵選擇(Feature Selection)
| 方法 | 原理 | 優點 |
|------|------|------|
| **Filter** | 依統計量(相關係、ANOVA) | 計算快,模型獨立 |
| **Wrapper** | 基於模型表現進行評估 | 考慮特徵交互 |
| **Embedded** | 在訓練過程中自動選擇 | 速度快、效果好 |
### 5.4.1 相關係矩陣示例
python
import seaborn as sns
import matplotlib.pyplot as plt
corr = df.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('Feature Correlation Matrix')
plt.show()
### 5.4.2 Lasso(L1 正則化)選擇
python
from sklearn.linear_model import Lasso
X = df.drop('target', axis=1)
y = df['target']
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
coef = pd.Series(lasso.coef_, index=X.columns)
selected_features = coef[coef != 0].index.tolist()
## 5.5 維度縮減(Dimensionality Reduction)
| 技術 | 目的 | 常見參數 |
|------|------|----------|
| **PCA** | 主成分分析,保留最大方差 | `n_components`, `whiten` |
| **LDA** | 監督式,最大化類別分離 | `n_components` |
| **t-SNE** | 非線性可視化 | `perplexity`, `n_iter` |
| **UMAP** | 非線性,保留鄰域 | `n_neighbors`, `min_dist` |
### 5.5.1 PCA 範例
python
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 95% 變異
X_pca = pca.fit_transform(X_scaled)
print(f'原始維度: {X.shape[1]}, PCA 之後: {X_pca.shape[1]}')
### 5.5.2 t-SNE 可視化
python
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
plt.figure(figsize=(8, 6))
plt.scatter(X_tsne[:,0], X_tsne[:,1], c=y, cmap='viridis', s=10)
plt.title('t-SNE 2D Projection')
plt.colorbar(label='Target Class')
plt.show()
## 5.6 常見陷阱與最佳實踐
| 陷阱 | 造成原因 | 對策 |
|------|----------|------|
| **資料泄露** | 特徵衍生時使用測試集資訊 | 只在訓練集內計算衍生值 |
| **過度縮減** | PCA/ t-SNE 只保留「視覺」信息 | 先評估對模型的影響,保持關鍵變量 |
| **高維編碼** | One-Hot 對樹模型影響不大,對線性模型影響大 | 考慮使用 Target Encoding 或 Embeddings |
| **缺失值處理失誤** | 直接 drop 會降低樣本量 | 使用 Imputer 或填補策略 |
### 5.6.1 評估特徵工程效果
1. **交叉驗證**:在每個折中完成特徵工程,避免泄露。
2. **模型比較**:同一模型使用原始特徵 vs. 轉換後特徵,觀察性能差異。
3. **時間成本**:記錄訓練時間與記憶體佔用,評估縮減的經濟效益。
python
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=200, random_state=42)
cv_scores = cross_val_score(rf, X_pca, y, cv=5, scoring='neg_mean_squared_error')
print(f'CV RMSE: {(-cv_scores.mean()) ** 0.5:.4f}')
## 5.7 小結
- **特徵工程是模型成功的關鍵基石**:不僅提升預測精度,還能節省計算資源並提升可解釋性。
- **從簡單到複雜**:先做 Filter、簡單轉換;再進行 Wrapper 或 Embedded 選擇;最後使用 PCA、LDA 等縮減技術。
- **維持可重現性**:使用 `random_state`、統一的 pipeline 或 `FeatureUnion`。
- **不斷迭代**:模型表現與業務需求會變,特徵工程同樣需要持續優化。
> **案例延伸**:在第六章將會以實際金融風險模型為例,展示如何從「客戶交易行為」資料中衍生「信用分數」特徵,並使用 Lasso + PCA 進行特徵選擇與維度縮減。