参考地址:http://scikit-learn.org/stable/modules/feature_selection.html#feature-selectionsklearn.feature_selection模块中的类可用于样本集中的特征选择/维数降低,以提高估计器的准确度分数或提高其在非常高维数据集上的性能。
1.1 删除低方差特征
例如,假设我们有一个具有布尔特征的数据集,并且我们要删除超过80%的样本中的一个或零(开或关)的所有特征。 布尔特征是伯努利随机变量,这些变量的方差由下式给出
所以我们可以选择使用阈值.8 *(1 - .8):
>>> from sklearn.feature_selection import VarianceThreshold >>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]] >>> sel = VarianceThreshold(threshold=(.8 * (1 - .8))) >>> sel.fit_transform(X) array([[0, 1], [1, 0], [0, 0], [1, 1], [1, 0], [1, 1]])
1.2 单变量特征选择
通过选择基于单变量统计测试的最佳特征来进行单变量特征选择。 它可以被看作是估计器的预处理步骤。 Scikit学习将特征选择例程公开为实现变换方法的对象:
1)SelectKBest删除除k个最高得分特征之外的所有内容
2)SelectPercentile除去用户指定的最高得分百分比的特征
3)对每个特征使用常见的单变量统计检验:假阳性率SelectFpr,错误发现率SelectFdr或家族误差SelectFwe。
4)GenericUnivariateSelect允许使用可配置策略执行单变量特征选择。 这允许使用超参数搜索估计器来选择最佳的单变量选择策略。例如,我们可以对样本执行测试,以仅检索两个最佳特征,如下所示:
>>> 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.shape (150, 4) >>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y) >>> X_new.shape (150, 2)这些对象作为输入一个评分函数,返回单变量分数和p值(或仅用于SelectKBest和SelectPercentile的分数):
对于回归:f_regression,mutual_info_regression
对于分类:chi2,f_classif,mutual_info_classif
基于F检验的方法估计两个随机变量之间的线性依赖程度。 另一方面,互信息方法可以捕获任何种类的统计依赖关系,但是非参数化,它们需要更多的样本进行准确的估计。
1.3 递归特征消除
给定赋予特征的权重(例如,线性模型的系数)的外部估计器,递归特征消除(RFE)是通过递归地考虑更小和更小的特征集来选择特征。 首先,对初始特征集进行训练,并将权重分配给每个特征。 然后,从当前设置的特征中剪除绝对权重最小的特征。 在修剪的集合上递归地重复该过程,直到最终达到所要选择的要素数量为止。
1.4使用SelectFromModel进行特征选择
SelectFromModel是一个元变换器,可以与任何在拟合后具有coef_或feature_importances_属性的估计器一起使用。 如果相应的coef_或feature_importances_值低于提供的阈值参数,则这些特征被认为是不重要的并被移除。 除了在数值上指定阈值之外,还有内置的启发式方法用于使用字符串参数来查找阈值。 可用的启发式是“平均值”,“中位数”和浮点数,如“0.1 * mean”。
1.4.1 基于L1-特征选择
用L1范数惩罚的线性模型具有稀疏解:他们的许多估计系数为零。 当目标是降低与另一个分类器一起使用的数据的维度时,它们可以与feature_selection.SelectFromModel一起使用以选择非零系数。 特别地,用于此目的的稀疏估计量是用于回归的linear_model.Lasso和用于分类的linear_model.LogisticRegression和svm.LinearSVC的线性估计。
>>> from sklearn.svm import LinearSVC >>> from sklearn.datasets import load_iris >>> from sklearn.feature_selection import SelectFromModel >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> X.shape (150, 4) >>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y) >>> model = SelectFromModel(lsvc, prefit=True) >>> X_new = model.transform(X) >>> X_new.shape (150, 3)
1.4.2 基于树的特征选择
基于树的估计器(参见sklearn.tree模块和sklearn.ensemble模块中的树的森林)可用于计算特征重要性,这又可以用于丢弃不相关的特征(当与sklearn.feature_selection.SelectFromModel ):
>>> from sklearn.ensemble import ExtraTreesClassifier >>> from sklearn.datasets import load_iris >>> from sklearn.feature_selection import SelectFromModel >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> X.shape (150, 4) >>> clf = ExtraTreesClassifier() >>> clf = clf.fit(X, y) >>> clf.feature_importances_ array([ 0.04..., 0.05..., 0.4..., 0.4...]) >>> model = SelectFromModel(clf, prefit=True) >>> X_new = model.transform(X) >>> X_new.shape (150, 2)1.4.3 特征选择作为管道的一部分
特征选择通常用作执行实际学习之前的预处理步骤。 在scikit学习中推荐的方法是使用sklearn.pipeline.Pipeline:
clf = Pipeline([ ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))), ('classification', RandomForestClassifier()) ]) clf.fit(X, y)