【sklearn】特征选择和降维
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】特征选择和降维的更多相关文章
- 机器学习实战基础(二十):sklearn中的降维算法PCA和SVD(一) 之 概述
概述 1 从什么叫“维度”说开来 我们不断提到一些语言,比如说:随机森林是通过随机抽取特征来建树,以避免高维计算:再比如说,sklearn中导入特征矩阵,必须是至少二维:上周我们讲解特征工程,还特地提 ...
- sklearn特征选择和分类模型
sklearn特征选择和分类模型 数据格式: 这里.原始特征的输入文件的格式使用libsvm的格式,即每行是label index1:value1 index2:value2这样的稀疏矩阵的格式. s ...
- 参考:菜菜的sklearn教学之降维算法.pdf!!
PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...
- 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维
PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...
- 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD
PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...
- 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现
简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...
- sklearn 特征选择
1.移除低方差的特征(Removing features with low variance) VarianceThreshold 是特征选择中的一项基本方法.它会移除所有方差不满足阈值的特征.默认设 ...
- 机器学习实战基础(二十四):sklearn中的降维算法PCA和SVD(五) PCA与SVD 之 重要接口inverse_transform
重要接口inverse_transform 在上周的特征工程课中,我们学到了神奇的接口inverse_transform,可以将我们归一化,标准化,甚至做过哑变量的特征矩阵还原回原始数据中的特征矩阵 ...
- 机器学习实战基础(二十二):sklearn中的降维算法PCA和SVD(三) PCA与SVD 之 重要参数n_components
重要参数n_components n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数. ...
随机推荐
- top100tools
Top 100 Tools for Learning 2013 2142 EmailShare Here are the Top 100 Tools for Learning 2013 – the ...
- C 语言宏定义函数编写时 do-while 的妙用和一些注意事项
在 C 语言中,我们都知道可以用宏定义来编写函数,一般称为宏函数.如果一个宏函数比较复杂,那么在编写这样的宏函数是有一定技巧和注意事项的.文章给出一些我认为值得关注的地方,以及一些注意事项(个人建议) ...
- BZOJ 3343 教主的魔法(分块)
题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...
- Go语言实现:【剑指offer】把字符串转换成整数
该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合 ...
- ajax面试要点
目录 目录 ajax是什么? 优点 缺点 ajax的工作原理 如何创建一个ajax(ajax的交互模型) ajax过程中get和post的区别 同步和异步的区别 JavaScript 的同源策略 如何 ...
- javascript canvas全部API
HTMLCanvasElement//canvas elem对象 属性 height//高 width//宽 方法 getContext()//获取<canvas>相关的可绘制的上下文 t ...
- 数据算法 --hadoop/spark数据处理技巧 --(11.K-均值聚类 12. k-近邻)
十一.k-均值聚类 这个需要MR迭代多次. 开始时,会选择K个点作为簇中心,这些点成为簇质心.可以选择很多方法啦初始化质心,其中一种方法是从n个点的样本中随机选择K个点.一旦选择了K个初始的簇质心,下 ...
- 关于开源,Git,Github
在Github和Git上fork之简单指南 https://linux.cn/article-4292-1.html,中文翻译 https://www.dataschool.io/simple-gui ...
- 使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印
多线程同步问题,都需要用到监视器,用来监视资源是否可用.C++中使用condition_variable,Java中使用Condition来实现同步. 1. 实现思路 需要有一个全局变量控制当前该哪个 ...
- 【2020】DBus,一个更能满足企业需求的大数据采集平台
功能远超Sqoop.DataX.Flume.Logatash.Filebeat等采集工具 注:由于文章篇幅有限,完整文档可扫免费获取 深知其他组件的局限性,才能彰显DBus的优越感 当前有很多数据采集 ...