sklearn 特征提取

官网: Feature selection

移除方差较小的特征

方差阈值(VarianceThreshold)是特征选择的一个简单方法,去掉那些方差没有达到阈值的特征。默认情况下,删除零方差的特征,例如那些只有一个值的样本
假设我们有一个有布尔特征的数据集,然后我们想去掉那些超过80%的样本都是0(或者1)的特征。布尔特征是伯努利随机变量,方差为 p(1-p)。

1
2
3
4
5
6
7
8
9
10
11
12
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)
Output:
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])

VarianceThreshold去掉了第一列,第一列里面0的比例为5/6。

单变量特征选择

单变量特征选择通过单变量统计检验选择特征,可以看作一个估计器的预处理步骤。Sklearn将特征选择视为日常的转换操作:

  • SelectBest 只保留 k 个最高分的特征;
  • SelectPercentile 只保留用户指定百分比的最高得分的特征;
  • 使用常见的单变量统计检验:假正率SelectFpr,错误发现率selectFdr,或者总体错误率SelectFwe;
  • GenericUnivariateSelect 通过结构化策略进行特征选择,通过超参数搜索估计器进行特征选择。
    举个例子,使用卡方检验选择两个最优特征:

SelectKBest和SelectPerecntile能够返回特征评价的得分和P值:

1
2
sklearn.feature_selection.SelectPercentile(score_func=<function f_classif>, percentile=10)
sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10

其中的参数 score_func 有以下选项:
(1)回归
f_regression:相关系数,计算每个变量与目标变量的相关系数,然后计算出F值和P值;

1
2
3
degrees_of_freedom = y.size - (2 if center else 1)
F = corr ** 2 / (1 - corr ** 2) * degrees_of_freedom
pv = stats.f.sf(F, 1, degrees_of_freedom)

mutual_info_regression:互信息,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。
参考:http://www.cnblogs.com/gatherstars/p/6004075.html

(2)分类
chi2:卡方检验;
f_classif:方差分析,计算方差分析(ANOVA)的F值 (组间均方 / 组内均方);
mutual_info_classif:互信息,互信息方法可以捕捉任何一种统计依赖,但是作为非参数方法,需要更多的样本进行准确的估计。

卡方(Chi2)检验

经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2chi2 测试来选择最佳的两项特征:

1
2
3
4
5
6
7
8
9
10
>>> 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)

Pearson相关系数 (Pearson Correlation)

皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的 pearsonr 方法能够同时计算 相关系数和p-value

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
# pearsonr(x, y)的输入为特征矩阵和目标向量
print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))
>>>
# 输出为二元组(sorce, p-value)的数组
Lower noise (0.71824836862138386, 7.3240173129992273e-49)
Higher noise (0.057964292079338148, 0.31700993885324746)

这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。Scikit-learn提供的 f_regrssion 方法能够批量计算特征的f_score和p-value,非常方便,参考sklearn的pipeline

Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。例如:

1
2
3
x = np.random.uniform(-1, 1, 100000)
print pearsonr(x, x**2)[0]
-0.00230804707612

互信息和最大信息系数

递归特征淘汰(RFE)

给特征赋予一个外部模型产生的权重(例如:线性模型系数),RFE递归地使用越来越少的特征来进行特征选择。首先,在原始数据上建立模型并且给每个特征一个 权重;然后,淘汰绝对权重最小的特征,递归地执行这个过程直到达到希望的特征数。RFECV使用交叉验证方法发现最优特征数量。

使用SelectFromModel方法特征选择

SelectFromModel是一种元转换器,可以与那些有coef_ 或者featureimportances属性的模型一起使用。如果coef_ 或者featureimportances小于阈值,我们就认为特征是不重要的。除了指定阈值以外,也可以使用启发式的方式。有效的启发式方法包括均值、中位数或者乘以系数,比如 0.1*均值。

基于L1范数的特征选择使用

##

如果文章对您有用请随意打赏,谢谢支持!
0%