機器學習_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與卡方都是統計上的一個手法,這部份如果有興趣的話可以尋找相關文獻來閱讀。
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],
.....