admin管理员组文章数量:1650766
sklearn.feature_selection特征选择模块包括:univariate filter selection methods单变量过滤选择方法;recursive feature elimination algorithm递归特征移除方法
Removing features with low variance
移除低方差特征
VarianceThreshold是一种进行特征选择的简单方法,即将方差小于阈值的特征删除,默认阈值是0
比如,现有一个包含布尔型特征的数据集,想删去某些特征列——这些特征列包含的0(或1)超过该列样本数的80%,则由Bernoulli分布可计算方差
即,筛选特征列的阈值为 0.8×(1−0.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:{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:每个特征和目标列间的互信息
版权声明:本文标题:sklearn库feature selection特征选择算法及API使用 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729532320a1204965.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论