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_func
及 k
score_func
- 指定轉換器用於評估的統計量,可以是
chi2
等標準 - ref:https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html
- 指定轉換器用於評估的統計量,可以是
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矩陣
卡方檢驗
- 推測兩組數據(feature,Label)之間的差異
- 原假設:兩組數據是互相獨立的
檢驗後返回 卡方值 及 P值 兩個統計量
- 卡方值:難界定有效篩選的範圍
- P值:一般使用 0.01 or 0.05 作為顯著性水平(p值判斷邊界)
- >=0.05 or 0.01:兩組數據相關 (拒絕原假設,接受備擇假設)
- 該特徵對模型訓練有貢獻
- \<0.05 or 0.01:兩組數據相互獨立 (接受原假設)
- >=0.05 or 0.01:兩組數據相關 (拒絕原假設,接受備擇假設)
因此須選取 卡方值很大且P值>=0.05 or 0.01 的特徵(與標籤相關的特徵)
- 可從
chi2
實例獲得 各個特徵對應的 卡方值 及 P值1
2
3from sklearn.feature_selection import chi2
chivalue,pvalues_chi = chi2(X,y)X
為feature矩陣y
為Label矩陣chivalue
為各特徵的卡方值,為一ndarraypvalues
為各特徵相對標籤的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:兩組數據 沒有顯著線性關係 (接受原假設)
- 應被刪除
- <=0.05 or 0.01:兩組數據存在 顯著線性相關 (拒絕原假設,接受備擇假設)
選取P值<0.05 or 0.01 的特徵(與標籤相關的特徵)
```python
from sklearn.feature_selection import f_classifF, 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
值該定為多少
總結
先使用方差過濾,在使用各種過濾法來捕捉相關性,可直接使用互信息法更好