2018年4月21日 星期六

機器學習_ML_feature_selection_SelectKBest

機器學習_ML_feature_selection_SelectKBest

tags: ML KNN
官方說明
手上的特徵很多,有什麼方法可以讓我們快速的了解能用的有多少?一般來說我們希望相關性愈高的愈好,除了利用相關矩陣來了解之外還有其它實用的sklearn套件可以用,一起來了解其中的SelectKBest如何選擇特徵。
  • 定義K:K所指同KNN,要選擇K個最好的
  • 選擇演算法:需選擇配合的演算法來計算特徵相關性
    • For regression: f_regression, mutual_info_regression
    • For classification: chi2, f_classif, mutual_info_classif
    • If you use sparse data (i.e. data represented as sparse matrices), chi2, mutual_info_regression, mutual_info_classif will deal with the data without making it dense.
      • 稀疏矩陣的話採行上述三種演算法可保持它的稀疏性
很重要的一點是,不要將適用分類的演算法拿來計算迴歸,這將取得沒用的結果
pvalue與卡方都是統計上的一個手法,這部份如果有興趣的話可以尋找相關文獻來閱讀。

IMPORT

from sklearn.feature_selection import SelectKBest

CLASS

class sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10)

參數說明

score_func

演算法設置,記得誤將適用於迴歸的用於分類
  • f_classif
  • mutual_info_classif
  • chi2
  • f_regression
  • mutual_info_regression
  • SelectPercentile
  • SelectFpr
  • SelectFdr
  • SelectFwe
  • GenericUnivariateSelect

k : int or ‘all’, optional, default=10

選擇的特徵數

屬性說明

scores_

特徵分數

pvalues_

特徵分數p值,如果只回傳分數的話就不會有值,取決於演算法。

方法說明

fit(X, y)

擬合、訓練數據

fit_transform(X[, y])

擬合、訓練數據並且轉換
fit+transform

get_params([deep])

取得模型參數

get_support([indices])

取得特徵索引遮罩(像pandas做過濾的時候使用)

inverse_transform(X)

回傳特徵陣列,但會將get_support為false的部份以0呈現

set_params(**params)

設置模型參數

transform(X)

轉換數據

範例

範例預計利用chi2(卡方檢驗_中興大學說明)來選擇特徵
案例取自sklearn官方
#  import需求套件
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

#  讀入資料集,賦值資料與類別
#  這是一個分類的範例
iris = load_iris()
X, y = iris.data, iris.target
#  取得X的維度
X.shape
結果如下:
(150, 4)
#  利用KBest選擇2個特徵
kbest = SelectKBest(chi2, k=2)
X_new = kbest.fit_transform(X, y)
X_new.shape
結果如下:
(150, 2)
利用特徵選擇,我們保留了K(2)個特徵
接下來,我們來觀察幾個方法的回傳值。
#  取得參數可以看到我們使用的是chi2(卡方)演算法
>>>kbest.get_params()
{'k': 2,
 'score_func': <function sklearn.feature_selection.univariate_selection.chi2>}
#  從回傳的特徵索引可以用來查看我們的特徵
>>>kbest.get_support()
array([False, False,  True,  True], dtype=bool)
#  回傳資料集,並且僅保留兩個特徵的值
>>>kbest.inverse_transform(X_new)
array([[ 0. ,  0. ,  1.4,  0.2],
       [ 0. ,  0. ,  1.4,  0.2],
       [ 0. ,  0. ,  1.3,  0.2],
       [ 0. ,  0. ,  1.5,  0.2],
       [ 0. ,  0. ,  1.4,  0.2],
       [ 0. ,  0. ,  1.7,  0.4],
       ......
#  查詢特徵卡方值(愈大愈好)
>>>kbest.scores_
array([  10.81782088,    3.59449902,  116.16984746,   67.24482759])
#  查詢pvalue,因為chi2有,所以有回傳值
>>>kbest.pvalues_ 
array([  4.47651499e-03,   1.65754167e-01,   5.94344354e-26,
         2.50017968e-15])
#  最後,確認下新特徵的矩陣
>>>X_new
array([[ 1.4,  0.2],
       [ 1.4,  0.2],
       [ 1.3,  0.2],
       [ 1.5,  0.2],
       [ 1.4,  0.2],
       [ 1.7,  0.4],
       [ 1.4,  0.3],
       [ 1.5,  0.2],
       [ 1.4,  0.2],
       .....