聊天視窗

數據決策的藝術:從資料蒐集到洞察生成 - 第 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 進行特徵選擇與維度縮減。