聊天視窗

數據科學:從原始資料到策略洞察 - 第 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`。 --- **感謝閱讀**:本章結合統計、機器學習與實務工具,力求在「特徵品質 → 性能提升 → 可解釋性」的三重維度上提供完整流程。