机器学习特征选择方法

时间:2024-02-23 09:28:01

单变量特征选择

单变量特征选择是通过选择那些基于单变量统计检验(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()