特征选择是机器学习中很重要的一部分,构造并选取合适的特征,能极大的提高模型的表现。sklearn中feature_selection模块提供了一些特征选择方法。可以通过dir()的方法整体看一下。
import sklearn
from sklearn import datasets
from sklearn import feature_selection as fs
import numpy as np
import matplotlib.pyplot as plt
dir(sklearn.feature_selection)
0. 读取测试数据
# 鸢尾花数据
iris_data = datasets.load_iris()
X, y = iris_data.data, iris_data.target
# 查看前三条
X[:3]
1. 方差阈值法 VarianceThreshold
该方法筛选掉方差低于某个值的变量,用于剔除常量或接近常量的变量。
# 设置方差阈值为0.4,则方差小于0.4的变量将被过滤掉
vf1 = fs.VarianceThreshold(threshold=0.4)
X1 = vf1.fit_transform(X)
# 查看结果
X1[:3]
# 查看每个特征变量的方差
np.var(X,axis=0)
可见第二列方差为0.1887,小于0.4,故被剔除。
2. 相关性过滤
2.1 卡方检验 chi2
该方法专门针对离散型标签(分类问题),且特征为非负。卡方检验chi2计算每个非负特征和标签之间的卡方统计量和p值,我们可以通过不同标准,基于该结果进行变量筛选。
from sklearn.feature_selection import chi2, SelectKBest
# 计算卡方统计量
Chi2, p_value = chi2(X, y) # 返回卡方统计量和p值
Chi2, p_value
选择变量的标准:(1)可以设置变量个数K为一个固定值,选取卡方统计量最大的K个变量;
# 可以设置为一个固定值如3;
X2 = SelectKBest(chi2, k=3).fit_transform(X, y)
X2[:3]
# 结果可知筛掉第二列
# array([[5.1, 1.4, 0.2],
# [4.9, 1.4, 0.2],
# [4.7, 1.3, 0.2]])
选择变量的标准:(2)筛掉所有p值大于设定值,比如0.05或0.01的特征; 根据p值可知筛掉第二列。
k = F.shape[0] - (p_value > 0.05).sum()
print(k)
## 结果
# k=3
X3 = SelectKBest(chi2, k=k).fit_transform(X, y)
X3[:3]
选择变量的标准: (3) 结合SelectKBest方法,输入”评分标准“来选出前k个分数最高的特征的类,即在一个范围内遍历k值,得到使评分函数效果最好的K值,从而再选取前K个卡方统计量最大的变量。
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier as RFC
# 在一个范围内遍历k值,使随机森林模型评分函数效果最好
score=[]
for i in range(4,0,-1):
new_data = SelectKBest(chi2, k=i).fit_transform(X, y)
score.append(cross_val_score(RFC(n_estimators=4,random_state=0),new_data,y,cv=5).mean())
plt.plot(range(4, 0,-1),score)
plt.show()
有图,k=3时效果最好。
2.2 F检验
F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也可以做分类,包含f_classif(用于分类问题)和f_regression(用于回归问题)两个函数。
from sklearn.feature_selection import f_classif, f_regression
F, p_value = f_classif(X_scale,y)
F, p_value
## 输出
# (array([ 119.26450218, 49.16004009, 1180.16118225, 960.0071468 ]),
# array([1.66966919e-31, 4.49201713e-17, 2.85677661e-91, 4.16944584e-85]))
选择变量的标准同上。
2.3 互信息
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。既可以做回归也可以做分类问题,包含mutual_info_classif(分类)和mutual_info_regression(回归)两个函数。 它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。
from sklearn.feature_selection import mutual_info_classif, mutual_info_regression
mutual_info_classif(X, y)
## 输出
# array([0.49703472, 0.23401444, 0.9931895 , 0.97820121])
选择变量的标准,同样可以给定变量数K,选取互信息量最大的K个变量。或者结合SelectKBest方法。
3. 嵌入法
嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行。 在使用嵌入法时,我们先使用某个机器学习的算法或模型进行训练,得到各个特征对模型的贡献或者说重要性,比如决策树的featureimportance属性。基于这种重要性的评估,找的一个重要性的临界值,根据该临界值确定对模型建立更加有用的特征。
优点:嵌入法基于模型本身,选择更合适的变量,更有利于提高该模型效果。
缺点:需要通过一定方法(经验或超参数)确定重要性的临界值;计算可能耗时耗力
嵌入法的基本使用:
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.feature_selection import SelectFromModel
RFC_=RFC(n_estimators=4,random_state=0)
new_data = SelectFromModel(RFC_,threshold=0.1).fit_transform(X,y) #这个是嵌入法的实例化
# threshold 特征重要性的阈值,重要性低于这个阈值的特征都将被删除
print('新数据的维度',new_data.shape)
## 输出
# 新数据的维度 (150, 3)
可通过一下方法确定重要性的阈值:
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import cross_val_score
# 如:模型选用随机森林模型
RFC_=RFC(n_estimators=4,random_state=0)
# 通过超参数方法,确定重要性特征的临界值
score = []
for i in np.linspace(0,0.3,20): ## 临界值取0-0.3之间,每隔0.015取一个值
# 根据重要性特征阈值,得到取得的重要特征。(threshold参数为特征重要性的阈值,重要性低于这个阈值的特征都将被删除)
X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)
# 计算模型得分
once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()
score.append(once)
# 画出取不同阈值时的得分
plt.plot(np.linspace(0,0.3,20),score)
plt.show()
由图可知,阈值可取0.1-0.15。
4. 包装法
包装法,也是一个特征选择和算法训练同时进行的方法。不同的是我们往往使用一个目标函数作为黑盒来帮助我们完成特征选择,而不是我们自己输入某个评估指标或统计量的阈值。包装法在初始训练集上训练我们的评估器,并且通过coef_属性或feature_importances_属性获得每个特征的重要性,然后从当前的一组特征中删除掉一些最不重要的特征,然后在新的特征集合上重复该过程,直到最后剩下的特征是我们规定的数量。文章来源:https://www.toymoban.com/news/detail-827912.html
from sklearn.feature_selection import RFE
score = []
# 确定最优的特征变量个数
for i in range(1,5):
rfe = RFE(RFC_, n_features_to_select=i, step=1)
rfe.fit(X, y)
X_rfe = rfe.transform(X)
once = cross_val_score(RFC_, X_rfe, y, cv=5).mean()
score.append(once)
plt.plot(range(1,5),score)
plt.show()
文章来源地址https://www.toymoban.com/news/detail-827912.html
到了这里,关于python——机器学习:sklearn特征选择feature_selection的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!