机器学习特征选择方法
单变量特征选择
单变量特征选择是通过选择那些基于单变量统计检验(univariate statistical tests)得出的最优特征来实现的。它可以看作是估计器的一个预处理步骤。Scikit-learn将一系列特征选择程序作为不同的类提供给我们,这些类都实现了 transform
方法:
- SelectKBest 选择得分最高的K个特征,其余的特征都删除。
- SelectPercentile 删除除用户指定的最高得分百分比以外的所有特征
- 对每个特征使用通用的单变量统计检验:假阳率(false positive rate)SelectFpr,伪发现率(false discovery rate) SelectFdr或多重比较谬误(family wise error)SelectFwe。
- GenericUnivariateSelect允许使用可配置的策略来执行单变量特征选择。这允许使用超参数搜索估计器(hyper-parameter search estimator)选择最佳的单变量选择策略。
例如,我们可以对样本执行一个χ2测试来挑选出两个最好的特征(chi2方式)
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
这些对象把输入当做计分函数,返回单变量分数(univariate scores)和p值(或对于SelectKBest
和 SelectPercentile
来说,仅仅返回分数):
- 对于回归:f_regression,mutual_info_regression
- 对于分类:chi2,f_classif,mutual_info_classif
基于F-检验的方法可以估计两个随机变量之间的线性依赖度(linear dependency)。另一方面,基于互信息(mutual information)的方法可以捕捉任何类型的统计依赖性(statistical dependency),但由于互信息方法是无参数的,他们需要更多的样本才能进行准确的估计。
#特征相关性权重柱状图输出
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest,f_classif
from sklearn.feature_selection import chi2
import numpy as np
iris=load_iris()
x,y=iris.data,iris.target
print(x.shape)
x_new=SelectKBest(f_classif,k=2).fit_transform(x,y)
print(x_new.shape)
#方法1-采用卡方检验的方式进行特征的提取(统计依赖度)
import numpy as np
from sklearn.feature_selection import SelectKBest,chi2
import matplotlib.pyplot as plt
selector=SelectKBest(chi2,k=2)
selector.fit(x,y)
s=-1*np.log10(selector.pvalues_)
plt.bar(range(len(iris.feature_names)),s)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()
#方法2-采用F检验方法的方式进行特征的提取(线性依赖度)
import numpy as np
from sklearn.feature_selection import SelectKBest,f_classif
import matplotlib.pyplot as plt
selector=SelectKBest(f_classif,k=2)
selector.fit(x,y)
s=-1*np.log10(selector.pvalues_)
plt.bar(range(len(iris.feature_names)),s)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()
#方法3—使用集成学习算法的特征重要性输出进行类比
from sklearn import ensemble
params={"n_estimators":100,"max_depth":4,"min_samples_split":2,"learning_rate":0.01,"loss":"ls"}
clf=ensemble.GradientBoostingRegressor(**params)
clf.fit(x,y)
feature_importance=clf.feature_importances_
feature_importance=100.0*(feature_importance/feature_importance.max())
plt.bar(range(len(iris.feature_names)),feature_importance)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()