Hike News
Hike News

機器學習-特徵工程-特徵選擇(feature_selection)-過濾法

Introduction

從所有的特徵中,選擇出有意義的對模型有幫助的特徵

  • 避免必須將所有特徵都導入模型進行訓練的窘境
  • 重要!!:必須與數據提供者討論
  • 若是我們無法找到合適領域的人幫助理解數據來選擇特徵的話,可使用以下四種方法
    • 過濾法
    • 嵌入法
    • 包裝法
    • 降維演算法

過濾法(Filter)

  • 常被用作特徵預處理的步驟
  • 根據各種統計檢驗的分數相關性的各項指標來進行特徵選擇

方差過濾法(VarianceThreshold)

請參考http://www.taroballz.com/2018/07/06/ML_DecreaseFeature/

相關性過濾

方差過濾完畢後,我們希望挑選出與標籤(Label)相關且有意義的特徵

  • 若特徵與標籤無關:浪費計算資源
  • 有三種常用的方法來評判特徵與標籤之間的相關性
    • 卡方過濾
    • F-score檢驗
    • 互信息

卡方過濾

  • 專門針對離散型標籤(分類問題)的相關性過濾
  • sklearn.feature_selection.chi2
    • 計算每個 非負數特徵 和 標籤 之間的卡方統計量
      • 卡方檢驗法不能計算負數;可是用以下兩種預處理方法變為正數
        • MinMaxScalar
        • StandardScalar
    • 依照卡方統計量 由高到低 為 特徵排名
  • 再結合feature_selection.SelectKBest
    • 輸入 評分標準 來選出前K個分數最高的特徵
      • 除去最可能獨立於標籤,與分類目的無關的特徵
  • 若卡方檢驗檢測到某個特徵所有值都相同時,會提示先進行方差過濾

SelectKBest()

為一轉換器,有兩個重要的參數score_funck

  • score_func
  • k
    • 選出前k個 卡方值最高 的特徵
    • 可指定自己所需要的特徵數目
    • 為一超參數,設定過低的值有可能會刪除與模型相關且有效的特徵,須不斷進行調整
      • 使用學習曲線驗證法得出好的k
        • 計算成本龐大
      • 實例化chi2等評估指標 獲得卡方值很大P值<0.05 的特徵數作為k
        • 請參考 卡方檢驗

fit_transform

與其他轉換器不一樣的是fit_transform參數中須放入兩個參數

  • X_fschi = SelectKBest(chi2,k=300).fit_transform(X,y)
    • 第一個參數須放入欲轉換的feature矩陣X
    • 第二個參數為Label矩陣y

卡方檢驗

  • 推測兩組數據(feature,Label)之間的差異
    • 原假設:兩組數據是互相獨立
  • 檢驗後返回 卡方值P值 兩個統計量

    • 卡方值:難界定有效篩選的範圍
    • P值:一般使用 0.01 or 0.05 作為顯著性水平(p值判斷邊界)
      • >=0.05 or 0.01:兩組數據相關 (拒絕原假設,接受備擇假設)
        • 該特徵對模型訓練有貢獻
      • \<0.05 or 0.01:兩組數據相互獨立 (接受原假設)
  • 因此須選取 卡方值很大P值>=0.05 or 0.01 的特徵(與標籤相關的特徵)

    • 可從chi2實例獲得 各個特徵對應的 卡方值 及 P值
      1
      2
      3
      from sklearn.feature_selection import chi2

      chivalue,pvalues_chi = chi2(X,y)
      • X為feature矩陣
      • y為Label矩陣
      • chivalue為各特徵的卡方值,為一ndarray
      • pvalues為各特徵相對標籤的p值,為一ndarray
    • K_value = chi_values.shape[0] - (p_values_chi < 0.01).sum() 將得到超參數k值該定為多少

F檢驗(ANOVA)

  • 又稱作方差齊性檢驗(變異數分析;Analysis of variance)
  • 是用來捕捉每個特徵與標籤之間的 線性 關係的過濾方法
    • 原假設:數據不存在顯著的線性關係
  • F檢驗分類
    • feature_selection.f_classif
    • 用於Label為離散型數據
  • F檢驗回歸
    • feature_selection.f_regression
    • 用於Label為連續型數據
  • 檢驗後返回 F值P值 兩個統計量

    • F值:難界定有效篩選的範圍
    • P值:一般使用 0.01 or 0.05 作為顯著性水平(p值判斷邊界)
      • <=0.05 or 0.01:兩組數據存在 顯著線性相關 (拒絕原假設,接受備擇假設)
        • 該特徵對模型訓練有貢獻
      • >0.05 or 0.01:兩組數據 沒有顯著線性關係 (接受原假設)
        • 應被刪除
  • 選取P值<0.05 or 0.01 的特徵(與標籤相關的特徵)

    • ```python
      from sklearn.feature_selection import f_classif

      F, pvalues_f = f_classif(X,y)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
            *`pvalues`為各特徵相對標籤的p值,為一ndarray
      * `K_value = F.shape[0] - (pvalues_f > 0.01).sum()` 將得到超參數`k`值該定為多少

      * F檢驗在服從**正態分布**時效果會非常穩定
      * 如要使用F檢驗過濾特徵,會先將數據轉換為 服從正態分布 的形式
      * `StandardScalar`

      * 再結合`feature_selection.SelectKBest`一起聯用
      * 輸入 **評分標準** 來選出前`K`個分數最高的特徵


      ## 互信息法
      * 是用來捕捉特徵與標籤之間的**任意關係**(線性及非線性)的過濾方法
      * 故比F檢驗更強大
      * 互信息分類
      * `feature_selection.mutual_info_classif`
      * 互信息回歸
      * `feature_selection.mutual_info_regression`
      * 返回 **每個特徵 與 標籤 之間的 互信息量的估計**
      * 介於0-1之間
      * 0:表示兩組數據相互獨立
      * 1:表示兩組數據**完全相關**

      * 選取 **結果值大於0**的特徵(與標籤相關的特徵)
      * ```python
      from sklearn.feature_selection import mutual_info_classif as MIC

      result = MIC(X,y)
      • result為各特徵的戶信息量估計
    • 只要不等於0就是與標籤有關
      • K_values_all_MIC = result.shape[0] -(result == 0).sum() 可得到超參數k值該定為多少

總結

先使用方差過濾,在使用各種過濾法來捕捉相關性,可直接使用互信息法更好