admin管理员组

文章数量:1650764

sklearn.feature_selection特征选择模块包括:univariate filter selection methods单变量过滤选择方法;recursive feature elimination algorithm递归特征移除方法

Removing features with low variance
移除低方差特征

VarianceThreshold是一种进行特征选择的简单方法,即将方差小于阈值的特征删除,默认阈值是0
比如,现有一个包含布尔型特征的数据集,想删去某些特征列——这些特征列包含的0(或1)超过该列样本数的80%,则由Bernoulli分布可计算方差

Var[X]=p(1p) V a r [ X ] = p ( 1 − p )
即,筛选特征列的阈值为 0.8×(10.8)=0.16 0.8 × ( 1 − 0.8 ) = 0.16

import numpy as np
from sklearn.feature_selection import VarianceThreshold
X = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]])
print(X)
print(' ')
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
print(sel.fit_transform(X))

Univariate feature selection
单变量特征选择

单变量特征选择基于”单变量统计检验”选择最好的特征,该过程可作为估计器作用的预处理过程.
SlectKBest:只保留k个最高得分的特征
SelectPercentile:只保留用户指定前百分之多少的特征
SelectFpr(假正率)/SelectFdr(错误发现率)/SelectFwe(误差率判断族):对每个特征应用常见的单变量统计检验
GenericUnivariateSelect:具有可配置策略的单变量特征选择.利用超参数搜索策略,该方法可获得最优的单变量选择策略
以上几种特征选择器的输入是评分函数,输出是单变量得分和p-值(SelectKBest和SelectPercentile只返回单变量得分)

对于回归问题:f_regression,mutual_info_regression
对于分类问题:chi2,f_classif,mutual_info_classif
基于F-检验的方法估计两个随机变量间的线性相关度.互信息方法可检测到任何变量间的统计依赖性.但是,非参数统计检测方法,要进行精准的估计需要更多的样本.对于系数存储的矩阵,chi2/mutual_info_regression/mutual_info_classif可以在不破坏稀疏性的前提下进行处理.注意,用回归问题的特征评分方法去处理分类问题不会得到有用的结果

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

#Output:
#(150, 4)
#(150, 2)
Recursive feature elimination
递归特征移除

RFE:递归特征移除,该API接口是利用某个可以为特征赋权的外部估计器,递归地删除特征,考查数目越来越少的特征集(如线性模型里的特征系数).(1)首先,利用估计器对初始特征集训练,通过属性coef_和feature_importances_获得特征重要性;(2)然后,从当前特征集中删除最不重要的若干特征;(3)递归地重复以上操作,直至特征数目减少的预期结果
RFECV:带交叉验证的递归特征移除

Feature selection using SelectFromModel
利用模型选择特征

SelectFromModel:一种元转换器,可以配合能返回coef_或feature_importances_的估计器用.若某特征相应的coef_或feature_importances_结果小于阈值,则认为该特征不重要,可以删去.除了直接以数值方式指定阈值外,还可通过设定字符参数,利用内置的启发式方法生成阈值.可用的启发式方法有’mean’/’median’或’mean’/’median’的若干倍(e.g. ‘0.1*mean’)

(1) L1-based feature selection

带有L1范数的线性模型可产生稀疏解:很多特征的稀疏变为0.当想减少数据维度后再分类时,可以利用feature_selection.SelectFromModel选择系数非0的特征
具有如上功能的回归估计器有linear_model.Lasso,分类估计器有linear_model.LogisticRegression和svm.LinearSVC
SVMs和logistic-regression的API里,参数C控制特征的稀疏性,C越小要筛选剩下的特征越少.Lasso的API里,参数alpha越大要筛选剩下的特征越少

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape)

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
print(X_new.shape)

#Output:
#(150, 4)
#(150, 3)
(2) Tree-based feature selection

基于树的估计器(sklearn.tree模块和sklearn.ensemble模块的森林)可用于计算特征重要性,同时,也可结合sklearn.feature_selection.SelectFromModel元转换器用于删除不相关特征

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape)

clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
print(clf.feature_importances_)  

model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
print(X_new.shape) 

#Output:
#(150, 4)
#[ 0.04983538  0.04096076  0.56077362  0.34843023]
#(150, 2)
Feature selection as part of a pipeline
特征选择作为pipeline的一部分

特征选择通常作为实际模型训练的预处理步骤,可以利用sklearn.pipeline.Pipeline实现

from sklearn.pipeline import Pipeline
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

iris = load_iris()
X, y = iris.data, iris.target

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


上例中,首先,利用sklearn.svm.LinearSVC结合klearn.feature_selection.SelectFromModel评估特征的重要性,筛选出最相关的特征.然后,在选定的特征集上训练一个sklearn.ensemble.RandomForestClassifier模型

sklearn.feature_selection.GenericUnivariateSelect(score_func=,mode=’percentile’,param=1e-05)
具有可配置策略的单变量特征选择器

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.
mode:特征选择模式,可选项{‘percentile’,’k_best’,’fpr,’fdr’,’fwe’}
param:由mode相对应确定的参数

sklearn.feature_selection.SelectPercentile(score_func=, percentile=10)
选得分排在前百分之多少的特征

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.
percentile:要保留多少百分比的特征.取值是int,默认10

sklearn.feature_selection.SelectKBest(score_func=, k=10)
选得分最高的k个特征

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.
k:要选出的特征数目.取值int或’all’(不进行特征筛选),默认10

sklearn.feature_selection.SelectFpr(score_func=, alpha=0.05)
基于FPR检测,选p-value小于alpha的特征

FPR表示假正率,用于控制检测错误的总量.

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.
alpha:筛选特征的阈值,p-value小于该阈值的那些特征会被保留

sklearn.feature_selection.SelectFdr(score_func=, alpha=0.05)
基于错误发现率检测,选p-value小于alpha的特征

错误发现率(false discovery rate)的计算是应用Benjamini-Hochberg过程.

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.
alpha:筛选特征的阈值,p-value小于该阈值的那些特征会被保留

sklearn.feature_selection.SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1)
基于权重选择特征的元变换器

estimator:构建变换器所用的基估计器,该估计器fit后可输出表示特征重要度的feature_importances_或coef_属性
threshold:用于特征选择的阈值,特征重要性小于阈值的特征会被删去
prefit:预拟合模型是否直接被传递到变换器中.Whether a prefit model is expected to be passed into the constructor directly or not.
norm_order:根据阈值过滤特征时,计算特征的权重系数利用几阶范数

可调用属性:
estimator_:构建变换器所用的基估计器(当prefit=False时可调用)
threshold_:用于特征选择的阈值

sklearn.feature_selection.SelectFwe(score_func=, alpha=0.05)
根据误差率判断族(Family-wise error rate)计算p-values,保留p-values小于alpha的特征

score_func:可调用函数,函数输入X和y,函数输出特征得分scores和p-value.默认取值是f_classif,该函数只对分类任务起作用
alpha:筛选特征的阈值,p-value小于该阈值的那些特征会被保留

sklearn.feature_selection.RFE(estimator, n_features_to_select=None, step=1, verbose=0)
递归特征移除

RFE:递归特征移除,该API接口是利用某个可以为特征赋权的外部估计器,递归地删除特征,考查数目逐渐减少的特征集(如线性模型里的特征系数).(1)首先,利用估计器对初始特征集训练,通过属性coef_和feature_importances_获得特征重要性;(2)然后,从当前特征集中删除最不重要的若干特征;(3)递归地重复以上操作,直至特征减少到预期数目

estimator:监督学习估计器,该估计器fit后可输出表示特征重要度的coef_和feature_importances_属性
n_features_to_select:筛选多少特征.取值int或None,默认None表示选半数特征
step:每次迭代移除特征的数目.取值可以是(0,1)的浮点数,表示百分之多少的特征;可以是整数,表示特征个数
verbose:控制输出提示信息的繁简.取值int,默认0,表示不输出

可调用属性:
n_features_:筛选的特征数目
support_:筛选特征的布尔编码
ranking_:对特征的重要性排序,最重要的序号为1
estimator_:在筛选出的特征所构成的数据集上建模,用的外部估计器

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
print(X.shape)
estimator = SVR(kernel="linear")
selector = RFE(estimator, 5, step=1)
selector = selector.fit(X, y)
print(selector.support_)
print(selector.ranking_)
#Output:
#(50, 10)
#[ True  True  True  True  True False False False False False]
#[1 1 1 1 1 6 4 3 2 5]
sklearn.feature_selection.RFECV(estimator, step=1, cv=None, scoring=None, verbose=0, n_jobs=1)
递归特征移除,用交叉验证评估保留的特征子集

estimator:监督学习估计器,该学习器fit后可输出特征重要度的coef_和feature_importances_属性
step:每次迭代移除特征的数目.取值可以是(0,1)的浮点数,表示百分之多少的特征;可以是整数,表示特征个数
cv:取值整数或CV迭代生成器,用于确定交叉验证过程数据切分策略,默认切分3折.
(1)integer, to specify the number of folds.
(2)An object to be used as a cross-validation generator.
(3)An iterable yielding train/test splits.
scoring:用筛选保留的特征子集建模时,模型的评分函数
verbose:控制输出提示信息的繁简.取值int,默认0,表示不输出
n_jobs:交叉验证时并行运行的核数目,默认是1,此外,-1表示利用全部核

可调用属性:
n_features_:筛选出用于交叉验证的特征数
support_:筛选特征的布尔编码
ranking_:对特征的重要性排序,最重要的序号为1
grid_scores_:在特征自己构成的数据集的切出的每折上进行交叉验证的得分数组
estimator_:在筛选出的特征所构成的数据集上建模,用的外部估计器

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
print(X.shape)
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=5)
selector = selector.fit(X, y)
print(selector.support_)
print(selector.ranking_)
#Output:
#(50, 10)
#[ True  True  True  True  True False False False False False]
#[1 1 1 1 1 6 4 3 2 5]
sklearn.feature_selection.VarianceThreshold(threshold=0.0)
删去方差小于阈值的特征

threshold:筛选训练集中的特征阈所用的阈值,即删去方差小于阈值的特征,默认取值是0.

可调用属性:
variances_:每个特征的方差

import numpy as np
from sklearn.feature_selection import VarianceThreshold
X = np.array([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(X)
print(' ')

selector = VarianceThreshold()
print(selector.fit_transform(X))

sklearn.feature_selection.chi2(X, y)
计算每个非负特征和类别列间的卡方统计量

根据X计算出卡方统计量,筛选卡方统计量最高的n个特征,其中X的特征列必须是频次或布尔值这种非负的形式.卡方检验用于度量随机变量之间的依赖关系,所以对于那些卡方检测出的与类标签列无依赖关系的特征列,可以删去,这些特征与分类无关

X:样本向量
y:类别标签向量

可调用属性:
chi2:每个特征的卡方统计量
pval:每个特征的p-value

sklearn.feature_selection.f_classif(X, y)
计算样本的方差分析F-值

X:{array-like, sparse matrix} shape = (n_samples, n_features).要进行检测一系列分类器
y:array of shape(n_samples).The data matrix

可调用属性:
F:F-value集合
pval:p-value集合

sklearn.feature_selection.f_regression(X, y, center=True)
单变量线性回归测试

用于测试每个回归器效果的线性模型.该函数不是一个独立的特征选择程序,而是配合其余特征选择程序给出特征的评分,其作用步骤如下:

:[X[:,i]mean(X[:,i])][ymean(y)]std(X[:,i])std(y)Fscore,pvalue 每 个 回 归 器 与 目 标 的 相 关 性 : [ X [ : , i ] − m e a n ( X [ : , i ] ) ] ⋅ [ y − m e a n ( y ) ] s t d ( X [ : , i ] ) ⋅ s t d ( y ) 将 上 述 相 关 性 转 化 成 F − s c o r e , 再 转 化 成 p − v a l u e

X:{array-like, sparse matrix} shape = (n_samples, n_features).要进行检测一系列回归器
y:array of shape(n_samples).The data matrix
center:X和y是否被居中,布尔值,默认True

可调用属性:
F:特征的F-value
pval:F-scores的p-value

sklearn.feature_selection.mutual_info_classif(X, y, discrete_features=’auto’, n_neighbors=3, copy=True, random_state=None)
估计离散目标变量的互信息


(The term “discrete features” is used instead of naming them “categorical”)
两个随机变量的互信息衡量的是变量间的依赖关系,取值非负,互信息为0表示两随机变量独立,取值较大表示两随机变量相关度较高.该函数计算k个近邻的熵,是非参数方法
https://en.wikipedia/wiki/Mutual_information

X:特征矩阵
y:目标向量
discrete_features:该API接口主要是处理离散特征,布尔取值决定是否所以特征都看成离散的,数组取值确定哪些特征列看成离散的,’auto’是将稀疏的特征列看成离散的
n_neighbors:计算互信息时用的近邻点数,默认是3.该值取得大些,会降低估计的方差,但会引入偏差
copy:布尔值,默认False,表示在给定数组内存位置原地计算和修改
random_state:随机种子

可调用属性:
mi:每个特征和目标列间的互信息

sklearn.feature_selection.mutual_info_regression(X, y, discrete_features=’auto’, n_neighbors=3, copy=True, random_state=None)
估计连续目标变量的互信息

X:特征矩阵
y:目标向量
discrete_features:该API接口主要是处理连续特征,布尔取值决定是否所以特征都看成连续的,数组取值确定哪些特征列看成连续的,’auto’是将稠密的特征列看成连续的
n_neighbors:计算互信息时用的近邻点数,默认是3.该值取得大些,会降低估计的方差,但会引入偏差
copy:布尔值,默认False,表示在给定数组内存位置原地计算和修改
random_state:随机种子

可调用属性:
mi:每个特征和目标列间的互信息

本文标签: 算法特征featuresklearnAPI