特征选择(2)
在sklearn.feature_selection模块中,可以对样本集进行特征选择(feature selection)和降维(dimensionality reduction),这样会提高估计器的准确度或者增强在高维数据集上的性能。
1. 移除低方差特征
VarianceThreshold是特征选择的一个基本方法,移除所有方差不满足阈值的特征。默认移除所有零方差特征,即在所有样本上取值不变的特征。
例如:假设有一个特征是布尔值的数据集,我们要移除那些在整个数据集中特征为0或者为1的比例超过80%的特征。布尔特征是伯努利随机变量,变量方差为 Var[X] = p(1-p),因此,我们用阈值“0.8*(1-0.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))) print(sel.fit_transform(X))
[[0 1]
[1 0]
[0 0]
[1 1]
[1 0]
[1 1]]
VarianceThreshold移除了第一列,它的值为0的概率为 p=5/6>0.8
2. 单变量特征选择
单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。它可以当做评估期的预处理步骤。
Scikit-learn将特征选择的内容作为实现transform方法的对象:
- SelectKBest:移除评分最高的K个特征之外的所有特征
- SelectPercentile:移除指定的最高得分百分比之外的所有特征
- 对每个特征应用常见的单变量统计测试:假阳性率(false positive rate)SelectFpr,伪发现率(false discovery rate)SelectFdr,或族系误差(family wise error)SelectFwe。
- 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-test 的方法计算两个随机变量之间的线性相关程度。另一方面,mutual information methods(互信息)能够计算任何种类的统计相关性,但是作为非参数的方法,互信息需要更多的样本来进行准确的估计。
3. 特征选择作为pipeline(管道)的一部分
特征选择通常在机器学习之前来做预处理。具体表现如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分类器。
来自:sklearn官方文档