聊天視窗

數據洞見:從原始數據到商業決策的機器學習實戰 - 第 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,並交叉驗證。 > > 透過本章所示方法,您將能在實務專案中快速、系統化地打造高效、可解釋的特徵集,為後續模型建構與部署奠定堅實基礎。