常⽤特征选择⽅法及Sklearn特征选择包说明
with the data without making it den.例⼦:
3、recursive feature elimination(递归特征消除)
Given an external estimator that assigns weights to features (e.g., the coefficients of a linear model), recursive feature elimination () is to lect features by recursively considering smaller and smaller ts of features.(从最初的所有特征集到逐步删除⼀个feature< features who absolute weights are the smallest are pruned from the current t features>,最后达到满⾜条件的features个数)。
performs RFE in a cross-validation loop to find the optimal number of features.:
: A recursive feature elimination example showing the relevance of pixels in a digit classification task.
: A recursive feature elimination example with automatic tuning of the number of features lected with cross-validation.
4、L1-bad feature lection
L1的spar作⽤就不说了:
>>> from sklearn.svm import LinearSVC
>>> from sklearn.datats import load_iris
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> X_new = LinearSVC(C=0.01, penalty="l1",
dual=Fal).fit_transform(X, y)
>>> X_new.shape
(150, 3)
With SVMs and logistic-regression, the parameter C controls the sparsity: the smaller C the fewer features lected. With Lasso, the higher the alpha parameter, the fewer features lected.
Examples:
pit bull
: Comparison of different algorithms for document classification including L1-bad feature lection.
5、Tree-bad features lection(这个也⽤的⽐价多)
Tree-bad estimators (e the module and forest of trees in the module) can be ud to compute feature importances, which in turn can be ud to discard irrelevant features:
>>> ble import ExtraTreesClassifier
>>> from sklearn.datats import load_iris
>>> iris = load_iris()
宫保鸡丁英文
>>> X, y = iris.data, iris.target
wold
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> X_new = clf.fit(X, y).transform(X)
>>> clf.feature_importances_
array([ , , , ])
>>> X_new.shape
(150, 2)
: example on synthetic data showing the recovery of the actually meaningful features.
: example on face recognition data.
6、Feature lection as part of a pipeline
Feature lection is usually ud as a pre-processing step before doing the actual learning. The recommended way to do this in scikit-learn is to u a :
clf = Pipeline([
('feature_lection', LinearSVC(penalty="l1")),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
In this snippet we make u of a to evaluate feature importances and lect the most relevant features. Then, a is
In this snippet we make u of a to evaluate feature importances and lect the most relevant features. Then, a is trained on the transformed output, i.e. using only relevant features. You can perform similar operations with the other feature lection methods and also classifiers that provide a way to evaluate feature importances of cour. See
piece什么意思the examples for more details.
特征选择 (feature_lection)
[toc]
本⽂主要参考sklearn(0.18版为主,部分0.17)的1.13节的官⽅⽂档,以及⼀些⼯程实践整理⽽成。
当数据预处理完成后,我们需要选择有意义的特征输⼊机器学习的算法和模型进⾏训练。通常来说,从两个⽅⾯考虑来选择特征:
特征是否发散:如果⼀个特征不发散,例如⽅差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么⽤。
北京幼儿羽毛球培训
特征与⽬标的相关性:这点⽐较显见,与⽬标相关性⾼的特征,应当优选选择。除移除低⽅差法外,本⽂介绍的其他⽅法均从相关性考虑。
根据特征选择的形式⼜可以将特征选择⽅法分为3种:accurate
Filter:过滤法,按照发散性或者相关性对各个特征进⾏评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据⽬标函数(通常是预测效果评分),每次选择若⼲特征,或者排除若⼲特征。
Embedded:嵌⼊法,先使⽤某些机器学习的算法和模型进⾏训练,得到各个特征的权值系数,根据系数从⼤到⼩选择特征。类似于Filter⽅法,但是是通过训练来确定特征的优劣。
特征选择主要有两个⽬的:
减少特征数量、降维,使模型泛化能⼒更强,减少过拟合;
增强对特征和特征值之间的理解。
reflect是什么意思 拿到数据集,⼀个特征选择⽅法,往往很难同时完成这两个⽬的。通常情况下,选择⼀种⾃⼰最熟悉或者最⽅便的特征选择⽅法(往往⽬的是降维,⽽忽略了对特征和数据理解的⽬的)。本⽂将结合 Scikit-learn提供的例⼦介绍⼏种常⽤的特征选择⽅法,它们各⾃的优缺点和问题。
Filter:
1. 移除低⽅差的特征 (Removing features with low variance)
假设某特征的特征值只有0和1,并且在所有输⼊样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作⽤不⼤。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种⽅法才能⽤,如果是连续型变量,就需要将连续变量离散化之后才能⽤。⽽且实际当中,⼀般不太会有95%以上都取某个值的特征存在,所以这种⽅法虽然简单但是不太好⽤。可以把它作为特征选择的预处理,先去掉那些取值变化⼩的特征,然后再从接下来提到的的特征选择⽅法中选择合适的进⾏进⼀步的特征选择。
>>> from sklearn.feature_lection import VarianceThreshold
>>> X=[[0,0,1],[0,1,0], [1,0,0], [0,1,1], [0,1,0], [0,1,1]]
>>> l=VarianceThreshold(threshold=(.8*(1-.8)))
>>> l.fit_transform(X)
array([[0,1],[1,0],[0,0],[1,1],[1,0],[1,1]])
果然, VarianceThreshold 移除了第⼀列特征,第⼀列中特征值为0的概率达到了5/6.
2. 单变量特征选择 (Univariate feature lection)
单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要,剔除那些不重要的指标。 对于分类问题(y离散),可采⽤:
卡⽅检验,f_classif, mutual_info_classif,互信息
对于回归问题(y连续),可采⽤:
⽪尔森相关系数,f_regression, mutual_info_regression,最⼤信息系数
这种⽅法⽐较简单,易于运⾏,易于理解,通常对于理解数据有较好的效果(但对特征优化、提⾼泛化能⼒来说不⼀定有效)。这种⽅法有许多改进的版本、变种。
单变量特征选择基于单变量的统计测试来选择最佳特征。它可以看作预测模型的⼀项预处理。==Scikit-learn将特征选择程序⽤包
单变量特征选择基于单变量的统计测试来选择最佳特征。它可以看作预测模型的⼀项预处理。==Scikit-learn将特征选择程序⽤包含 transform 函数的对象来展现==:
SelectKBest 移除得分前 k 名以外的所有特征(取top k)
SelectPercentile 移除得分在⽤户指定百分⽐以后的特征(取top k%)
ancii
对每个特征使⽤通⽤的单变量统计检验:假正率(fal positive rate) SelectFpr, 伪发现率(fal discovery rate) SelectFdr,或族系误差率 SelectFwe.
GenericUnivariateSelect 可以设置不同的策略来进⾏单变量特征选择。同时不同的选择策略也能够使⽤超参数寻优,从⽽让我们找到最佳的单变量特征选择策略。
将特征输⼊到评分函数,返回⼀个单变量的f_score(F检验的值)或p-values(P值,假设检验中的⼀个
标准,P-value⽤来和显著性⽔平作⽐较),注意SelectKBest 和 SelectPercentile只有得分,没有p-value。
For classification: chi2, f_classif, mutual_info_classif
For regression: f_regression, mutual_info_regression
Notice:
The methods bad on F-test estimate the degree of linear dependency between two random variables. (F检验⽤于评估两个随机变量的线性相关性)On the other hand, mutual information methods can capture any kind of statistical dependency, but being nonparametric, they require more samples for accurate estimation.(另⼀⽅⾯,互信息的⽅法可以捕获任何类型的统计依赖关系,但是作为⼀个⾮参数⽅法,估计准确需要更多的样本)
Feature lection with spar data:
If you u spar data (i.e. data reprented as spar matrices), chi2, mutual_info_regression, mutual_info_classif will deal with the data without making it den.(如果你使⽤稀疏数据(⽐如,使⽤稀疏矩阵表⽰的数据), 卡⽅检验(chi2)、互信息回归(mutual_info_regression)、互信息分类(mutual_inf
o_classif)在处理数据时可保持其稀疏性.)
Examples:
2.1 卡⽅(Chi2)检验
经典的卡⽅检验是检验定性⾃变量对定性因变量的相关性。⽐如,我们可以对样本进⾏⼀次[Math Processing Error]chi2测试来选择最佳的两项特征:
>>> from sklearn.datats import load_iris
>>> from sklearn.feature_lection import SelectKBest
>>> from sklearn.feature_lection 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)
2.2 Pearson相关系数 (Pearson Correlation)
⽪尔森相关系数是⼀种最简单的,能帮助理解特征和响应变量之间关系的⽅法,该⽅法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表⽰完全的负相关,+1表⽰完全的正相关,0表⽰没有线性相关。 Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第⼀时间就执⾏。Scipy的 pearsonr ⽅法能够同时计算相关系数和p-value.
import numpy as np
from scipy.stats import pearsonr
np.random.ed(0)
size=300
x=al(0,1, size)
# pearsonr(x, y)的输⼊为特征矩阵和⽬标向量
print("Lower noi", pearsonr(x, x+al(0,1,
size)))
print("Higher noi", pearsonr(x, x+al(0,10,
size)))
研究生报考条件>>>
>>>
# 输出为⼆元组(sorce, p-value)的数组
Lower noi
(0.71824836862138386,7.3240173129992273e-49)
Higher noi
(0.057964292079338148,0.31700993885324746)
这个例⼦中,我们⽐较了变量在加⼊噪⾳之前和之后的差异。当噪⾳⽐较⼩的时候,相关性很强,p-value很低。
Scikit-learn提供的⽅法能够批量计算特征的f_score和p-value,⾮常⽅便,参考sklearn的
Pearson相关系数的⼀个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是⾮线性的,即便两个变量具有⼀⼀对应的关系,Pearson相关性也可能会接近0。例如:
x = np.random.uniform(-1, 1, 100000)
print pearsonr(x, x**2)[0]
crack-0.00230804707612
更多类似的例⼦参考。另外,如果仅仅根据相关系数这个值来判断的话,有时候会具有很强的误导性,如,最好把数据可视化出来,以免得出错误的结论。
2.3 互信息和最⼤信息系数 (Mutual information and maximal information coefficient (MIC)
经典的互信息(互信息为随机变量X与Y之间的互信息[Math Processing Error]I(X;Y)为单个事件之间互信息的数学期望)也是评价定性⾃变量对定性因变量的相关性的,互信息计算公式如下:
互信息直接⽤于特征选择其实不是太⽅便:1、它不属于度量⽅式,也没有办法归⼀化,在不同数据及上的结果⽆法做⽐较;2、对于连续变量的计算不是很⽅便(X和Y都是集合,x,y都是离散的取值),通常变量需要先离散化,⽽互信息的结果对离散化的⽅式很敏感。
最⼤信息系数克服了这两个问题。它⾸先寻找⼀种最优的离散化⽅式,然后把互信息取值转换成⼀种度量⽅式,取值区间
在[0,1]。提供了MIC功能。
反过头来看y=x2这个例⼦,MIC算出来的互信息值为1(最⼤的取值)。
from minepy import MINE
m=MINE()
x =np.random.uniform(-1,1,10000)
print(m.mic())
>>>1.0
MIC的统计能⼒遭到了⼀些质疑,当零假设不成⽴时,MIC的统计就会受到影响。在有的数据集上不存在这个问题,但有的数据集上就存在这个问题。
2.4 距离相关系数 (Distance Correlation)
距离相关系数是为了克服Pearson相关系数的弱点⽽⽣的。在x和x2这个例⼦中,即便Pearson相关系数是0,我们也不能断定这两个变量是独⽴的(有可能是⾮线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独⽴的。
R的 energy 包⾥提供了距离相关系数的实现,另外这是的实现。
>x = runif(1000, -1,1)
>dcor(x, x**2)[1]
0.4943864
尽管有 MIC 和距离相关系数在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的。
第⼀,Pearson相关系数计算速度快,这在处理⼤规模数据的时候很重要。
第⼆,Pearson相关系数的取值区间是[-1,1],⽽MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表⽰关系的正负,绝对值能够表⽰强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。