什麼是 特徵選擇法(Feature Selection)?

特徵選擇是機器學習中選擇最相關特徵子集的過程,旨在簡化模型、提高準確性、減少過擬合和提升模型的可解釋性。

核心概念

特徵選擇(Feature Selection)是機器學習模型建構過程中至關重要的一環。在現實世界的資料集中,往往存在大量的特徵,但並非所有特徵都對模型的預測能力有貢獻。有些特徵可能與目標變數無關,有些特徵可能包含冗餘資訊,甚至有些特徵可能引入雜訊,導致模型性能下降。特徵選擇的目的就是從原始特徵集合中,挑選出最相關、最具代表性的特徵子集,以提升模型的效能和可解釋性。

為什麼需要特徵選擇?

  • 提高模型準確性: 移除無關或冗餘的特徵可以減少模型的複雜度,降低過擬合的風險,從而提高模型的泛化能力。
  • 簡化模型: 減少特徵數量可以簡化模型,使其更容易理解和解釋。這對於需要向非技術人員解釋模型結果的場景非常重要。
  • 降低計算成本: 減少特徵數量可以降低模型的訓練和預測時間,節省計算資源。
  • 提升資料品質: 特徵選擇可以幫助我們識別和移除資料中的雜訊和異常值,提升資料品質。

特徵選擇的類型:

特徵選擇方法可以分為三大類:

  • 過濾式方法(Filter Methods): 這些方法獨立於任何特定的機器學習演算法,它們基於統計檢定或其他評分函數來評估每個特徵的重要性。常用的過濾式方法包括:
    • 變異數閾值(Variance Threshold): 移除變異數低於某個閾值的特徵。
    • 相關係數(Correlation Coefficient): 移除與目標變數相關性低的特徵,或移除高度相關的特徵(多重共線性)。
    • 卡方檢定(Chi-Square Test): 用於分類問題,評估類別型特徵與目標變數之間的獨立性。
    • 互資訊(Mutual Information): 衡量兩個變數之間的相互依賴性。
  • 包裹式方法(Wrapper Methods): 這些方法使用特定的機器學習演算法來評估特徵子集的性能。它們透過搜尋不同的特徵子集,並使用交叉驗證等技術來評估每個子集的性能。常用的包裹式方法包括:
    • 前向選擇(Forward Selection): 從空集開始,每次選擇一個能最大程度提升模型性能的特徵,直到達到預定的特徵數量或性能閾值。
    • 後向消除(Backward Elimination): 從完整特徵集開始,每次移除一個對模型性能影響最小的特徵,直到達到預定的特徵數量或性能閾值。
    • 遞迴特徵消除(Recursive Feature Elimination, RFE): 遞迴地訓練模型,並移除權重最小的特徵,直到達到預定的特徵數量。
  • 嵌入式方法(Embedded Methods): 這些方法將特徵選擇融入到機器學習演算法的訓練過程中。常用的嵌入式方法包括:
    • L1正則化(Lasso): L1正則化會將某些特徵的係數縮減為零,從而實現特徵選擇。
    • 決策樹(Decision Tree): 決策樹演算法會根據特徵的重要性來構建樹結構,因此可以自然地進行特徵選擇。
    • 梯度提升機(Gradient Boosting Machine): 梯度提升機演算法也會根據特徵的重要性來構建模型,因此可以自然地進行特徵選擇。

運作原理

不同類型的特徵選擇方法有不同的運作原理。以下分別介紹過濾式、包裹式和嵌入式方法的運作原理:

過濾式方法:

過濾式方法的運作原理是基於統計檢定或其他評分函數來評估每個特徵的重要性,然後根據評分結果選擇特徵子集。例如,使用相關係數進行特徵選擇時,會計算每個特徵與目標變數之間的相關係數,然後選擇相關係數絕對值較大的特徵。使用卡方檢定進行特徵選擇時,會計算每個類別型特徵與目標變數之間的卡方統計量,然後選擇卡方統計量較大的特徵。

包裹式方法:

包裹式方法的運作原理是使用特定的機器學習演算法來評估特徵子集的性能。例如,使用前向選擇進行特徵選擇時,會從空集開始,每次選擇一個能最大程度提升模型性能的特徵,直到達到預定的特徵數量或性能閾值。模型性能通常使用交叉驗證等技術來評估。

嵌入式方法:

嵌入式方法的運作原理是將特徵選擇融入到機器學習演算法的訓練過程中。例如,使用L1正則化進行特徵選擇時,L1正則化會將某些特徵的係數縮減為零,從而實現特徵選擇。決策樹和梯度提升機演算法會根據特徵的重要性來構建模型,因此可以自然地進行特徵選擇。

範例:使用Python和Scikit-learn進行特徵選擇

以下是一個使用Python和Scikit-learn進行特徵選擇的簡單範例:

python from sklearn.feature_selection import SelectKBest, chi2 from sklearn.datasets import load_iris

載入資料集

iris = load_iris() X, y = iris.data, iris.target

使用卡方檢定選擇最佳的k個特徵

k = 2 # 選擇2個最佳特徵 selector = SelectKBest(score_func=chi2, k=k) selector.fit(X, y)

獲取選擇的特徵的索引

selected_features_indices = selector.get_support(indices=True)

獲取選擇的特徵的名稱

selected_features_names = [iris.feature_names[i] for i in selected_features_indices]

print("選擇的特徵索引:", selected_features_indices) print("選擇的特徵名稱:", selected_features_names)

實際應用

特徵選擇在許多領域都有廣泛的應用,包括:

  • 生物資訊學: 基因選擇、蛋白質選擇
  • 金融: 信用評分、風險管理、欺詐檢測
  • 醫療保健: 疾病診斷、藥物發現、患者預測
  • 文本挖掘: 文本分類、情感分析、主題建模
  • 圖像處理: 物件檢測、圖像分類、人臉識別

常見誤區

  • 特徵選擇一定能提高模型性能: 特徵選擇並非總是能提高模型性能。如果原始特徵集合中沒有無關或冗餘的特徵,或者特徵選擇方法選擇了錯誤的特徵子集,則特徵選擇可能會降低模型性能。
  • 選擇的特徵越多越好: 選擇的特徵越多並不一定越好。選擇過多的特徵可能會導致模型過擬合,降低模型的泛化能力。
  • 特徵選擇只需要做一次: 特徵選擇並非只需要做一次。隨著資料的變化,特徵的重要性也可能會發生變化,因此需要定期重新進行特徵選擇。
  • 過濾式方法比包裹式方法更好: 過濾式方法和包裹式方法各有優缺點。過濾式方法計算速度快,但可能無法選擇到最佳的特徵子集。包裹式方法可以選擇到最佳的特徵子集,但計算速度慢。
  • 忽略領域知識: 特徵選擇不應完全依賴演算法,領域知識的運用往往能更有效地選擇特徵。

相關術語

常見問題

← 回到 特徵選擇法 快查頁

延伸學習

想看 特徵選擇法 的完整影片教學?前往 美第奇 AI 學院