1.13 特征选择

sklearn.feature_selection模块中的类可以用于样本集上的特征选择/降维,以提高估计器的精度值,或提高其应用在高维数据集上的性能。

1.13.1 删除低方差的特征

VarianceThreshold是一种简单的特征选择baseline方法。它删除了方差不满足某个阈值的所有特性。

默认情况下,它会删除所有的零方差特性,即在所有样本中具有相同值的特性。

例如,假设我们有一个具有布尔特征的数据集,并且我们想要删除超过80%的样本中所有要么为1要么为0(开或关)的特征。

布尔特征是伯努利随机变量,其方差为

\(\mathrm{Var}[X] = p(1 - p)\)

所以我们可以选择使用阈值 .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]])

VarianceThreshold删除了第一列,该列包含0的概率为p = 5/6 > .8。

1.13.2 单变量特征选择

单变量特征选择的工作原理是基于单变量统计检验来选择最佳特征。它可以被看作是估计器的一个预处理步骤。

Scikit-learn将特性选择例程作为实现转换方法的对象公开:

  • SelectKBest 删除了k个最高评分的特征以外的所有特性;

  • SelectPercentile 删除了除用户指定的最高评分百分比以外的所有特征;

  • 对每个特征使用常见的单变量统计检验: 假阳性率SelectFpr,假发现率SelectFdr,或族判断误差率SelectFwe;

  • GenericUnivariateSelect允许使用可配置策略执行单变量特性选择。这允许选择最好的单变量选择策略与超参数搜索估计器。

例如,我们可以对样本进行\(\chi^2\)测试,只检索两个最好的特征:

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_new = SelectKBest(chi2, k=2).fit_transform(X, y) X.shape, X_new.shape

((150, 4), (150, 2))

这些对象接受一个评分函数作为输入,该函数返回单变量分数和p-值(或仅返回SelectKBest和SelectPercentile的分数):

对于回归问题: f_regression, mutual_info_regression

对于分类问题: chi2, f_classif, mutual_info_classif

基于F检验的方法估计了两个随机变量之间的线性相关程度。

另一方面,互信息方法可以捕获任何类型的统计相关性,但由于是非参数的,因此需要更多的样本来进行准确的估计。

1.13.3 递归特征删除

给定一个给特征赋予权重的外部估计量(例如,线性模型的系数),递归特征删除(RFE)是通过递归地考虑越来越小的特征集来选择特征。

首先,对估计器进行原始特征集的训练,然后通过coef_属性或feature_importances_属性获得每个特征的重要性。

然后,从当前的一组特性中删除最不重要的特性。该过程在修剪集上递归地重复,直到最终达到所需的要选择的特性数量。

RFECV在交叉验证循环中执行RFE,以找到最优的特性数量。

1.13.4 用SelectFromModel选择特征

SelectFromModel是一个元转换器,可以与任何在拟合后具有coef_或feature_importances_属性的估计器一起使用。

如果相应的coef_或feature_importances_值低于提供的阈值参数,则认为这些特性不重要并将其删除。

除了以数字方式指定阈值外,还有使用字符串参数查找阈值的内置启发式方法。

可用的启发式方法是“平均数”、“中位数”和这些数的浮点倍数,如“0.1*平均数”。

有关如何使用它的示例,请参考下面的部分。

1.13.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 X, y = load_iris(return_X_y=True)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X.shape, X_new.shape

((150, 4), (150, 3))

对于支持向量机和逻辑回归,参数C控制了稀疏性:C越小,选择的特征越少。对于Lasso, alpha参数越高,选择的特征越少。

1.13.4.2 基于树的特征选择

基于树的估计器(参照sklearn.tree模块和sklearn.ensemble模块中的森林)可用于计算特征的重要性,而这些重要性又可用于丢弃不相关的特征(与SelectFromModel元转换器结合使用):

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel X, y = load_iris(return_X_y=True)
clf = ExtraTreesClassifier(n_estimators=50)
clf = clf.fit(X, y) model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X.shape, X_new.shape, clf.feature_importances_

((150, 4), (150, 2), array([0.09394361, 0.05591118, 0.42796637, 0.42217885]))

1.13.5 特征选择作为流水线的一部分

特征选择通常用作实际学习之前的预处理步骤。在scikit-learn中推荐的方法是使用sklearn.pipeline.Pipeline:

clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)

在这个代码片段中,我们使用了sklearn.svm.LinearSVC和sklearn.feature_selection.SelectFromModel用于评估特征重要性并选择最相关的特征。

然后,一个sklearn.ensemble.RandomForestClassifier针对转换后的输出进行训练,即仅使用相关特征。

还可以使用其他特性选择方法以及提供评估特性重要性方法的分类器执行类似的操作。

完整案例

一个显示单变量特征选择的例子。

在iris数据中加入噪声(非信息性)特征,应用单变量特征选择。

对于每个特征,我们绘制单变量特征选择的p值和支持向量机相应的权值。

我们可以看到,单变量特征选择选择了信息特征,并且这些特征具有更大的SVM权值。

在整个特征集中,只有前四个特征是重要的。我们可以看到他们在单变量特征选择上得分最高。

支持向量机给这些特征赋予了很大的权重,但也选择了许多非信息性特征。

在支持向量机之前进行单变量特征选择,可以增加支持向量机的显著特征权重,从而改善分类。

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt from sklearn import datasets, svm
from sklearn.feature_selection import SelectPercentile, f_classif # #############################################################################
# Import some data to play with # The iris dataset
iris = datasets.load_iris() # Some noisy data not correlated
E = np.random.uniform(0, 0.1, size=(len(iris.data), 20)) # Add the noisy data to the informative features
X = np.hstack((iris.data, E))
y = iris.target plt.figure(1)
plt.clf() X_indices = np.arange(X.shape[-1]) # #############################################################################
# Univariate feature selection with F-test for feature scoring
# We use the default selection function: the 10% most significant features
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X, y)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
plt.bar(X_indices - .45, scores, width=.2,
label=r'Univariate score ($-Log(p_{value})$)', color='darkorange',
edgecolor='black') # #############################################################################
# Compare to the weights of an SVM
clf = svm.SVC(kernel='linear')
clf.fit(X, y) svm_weights = (clf.coef_ ** 2).sum(axis=0)
svm_weights /= svm_weights.max() plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM weight',
color='navy', edgecolor='black') clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X), y) svm_weights_selected = (clf_selected.coef_ ** 2).sum(axis=0)
svm_weights_selected /= svm_weights_selected.max() plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,
width=.2, label='SVM weights after selection', color='c',
edgecolor='black') plt.title("Comparing feature selection")
plt.xlabel('Feature number')
plt.yticks(())
plt.axis('tight')
plt.legend(loc='upper right')
plt.show()

Automatically created module for IPython interactive environment

参考资料

sklearn user guide 1.13 Feature secection

【sklearn】特征选择和降维的更多相关文章

  1. 机器学习实战基础(二十):sklearn中的降维算法PCA和SVD(一) 之 概述

    概述 1 从什么叫“维度”说开来 我们不断提到一些语言,比如说:随机森林是通过随机抽取特征来建树,以避免高维计算:再比如说,sklearn中导入特征矩阵,必须是至少二维:上周我们讲解特征工程,还特地提 ...

  2. sklearn特征选择和分类模型

    sklearn特征选择和分类模型 数据格式: 这里.原始特征的输入文件的格式使用libsvm的格式,即每行是label index1:value1 index2:value2这样的稀疏矩阵的格式. s ...

  3. 参考:菜菜的sklearn教学之降维算法.pdf!!

    PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...

  4. 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维

    PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...

  5. 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD

    PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...

  6. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  7. sklearn 特征选择

    1.移除低方差的特征(Removing features with low variance) VarianceThreshold 是特征选择中的一项基本方法.它会移除所有方差不满足阈值的特征.默认设 ...

  8. 机器学习实战基础(二十四):sklearn中的降维算法PCA和SVD(五) PCA与SVD 之 重要接口inverse_transform

    重要接口inverse_transform  在上周的特征工程课中,我们学到了神奇的接口inverse_transform,可以将我们归一化,标准化,甚至做过哑变量的特征矩阵还原回原始数据中的特征矩阵 ...

  9. 机器学习实战基础(二十二):sklearn中的降维算法PCA和SVD(三) PCA与SVD 之 重要参数n_components

    重要参数n_components n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数. ...

随机推荐

  1. usaco1.1

    Your Ride Is Here #include <iostream> #include <string> #include <vector> using na ...

  2. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...

  3. 机器学习总结-LR(对数几率回归)

    LR(对数几率回归) 函数为\(y=f(x)=\frac{1}{1+e^{-(w^{T}x+b)}}\). 由于输出的是概率值\(p(y=1|x)=\frac{e^{w^{T}x+b}}{1+e^{w ...

  4. 牛客练习赛39 B 选点(dfs序+LIS)

    题意: 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于任意一棵子树,都要满足: 如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大: 如果在左子树选 ...

  5. 使用canvas制作五子棋游戏

    要制作JS五子棋的话我们可以一开始来理清一下思路,这样对我们后来的编程是有好处的 1.棋盘使用canvas制作.canvas用来做这种不用太过复杂的图形的时候是很有用处的,下图是我制作的一个五子棋棋盘 ...

  6. 编译生成protobuf的jar包

    编译生成protobuf的jar包 配置maven 安装maven,并修改maven源为阿里云 下载maven wget http://mirror.bit.edu.cn/apache/maven/m ...

  7. pretty-errors:美化python异常输出以使其清晰易读

    1. 安装pretty-errors python -m pip install pretty_errors 2.如果你想让你的每一个程序都能这样在报错时也保持美貌,那么运行下面这这行命令,就不用每次 ...

  8. MySQL数据库的备份、还原、迁移

    一.单库备份与还原 1.远程连接MySQL数据库 D:\mysql-5.7.14-winx64\bin>mysql -h192.168.2.201 -uroot -pcnbi2018 参数说明: ...

  9. 【HDU - 1069】 Monkey and Banana (基础dp)

    Monkey and Banana 直接写中文了 Problem Statement 一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子 ...

  10. Deepin下将Caps映射为Control_L键

    xmodmap -e 'clear Lock' -e 'keycode 0x42 = Control_L'