特征选择- Sklearn.feature_selection的理解

Sklearn的feature_selection模块中给出了其特征选择的方法,实际工作中选择特征的方式肯定不止这几种的,IV,GBDT等等都ok;

一、移除低方差特征(Removing features with low variance)

  API函数:sklearn.feature_selection.VarianceThreshold(threshold=0.0)

  VarianceThreshold是特征选择的一个简单基本方法,它会移除所有那些方差不满足一些阈值的特征。 在默认情况下,其会移除所有方差为0的特征,也就是所有取值相同的特征。

  官网说:[

    例如,假设我们有一个特征是布尔值的数据集,我们想要移除那些在整个数据集中特征值为0或者为1的比例超过80%的特征。布尔特征是伯努利( Bernoulli )随机变量,变量的方差为

                            

    因此,我们可以使用阈值 ``.8 * (1 - .8)``进行选择:

      ]

其用法可见,移除低于阈值的特征。但是对不不同的特征,其特征分布我们需要自己探索,即使对于离散特征数值化后或者连续特征,可以直接计算其方差。但是我认为这个选择特征的方法实际意义有待商榷;对于一个特征取值唯一的情况,这种方法是肯定可以发现的。但是如果一个特征是布尔值,即使整个数据集合中有特征值为0或者为1的比例超过80%的特征,并不能说明这个特征不好哇,其对目标变量的相关性如果还不错,你会忍心把这个变量剔除吗。对吧,所以我实际工作中,没用过这个方法。各抒己见!

二、单变量特征选择,Univariate feature selection

  这个有用,比上一个API有用多了。慢慢来看。

  官网说【单变量的特征选择是通过基于单变量的统计测试来选择最好的特征。它可以当做是评估器的预处理步骤】。是的哇,单变量的特征选择,出发点是想针对每一个特征单独检测其和目标变量Y的相关性,顾名思义单变量嘛。选择方法很多,具体区分又区分,你所做的模型是回归还是分类。

  Scikit-learn 将特征选择的内容作为实现了 transform 方法的对象

  (1)、SelectKBest移除那些除了评分最高的 K 个特征之外的所有特征

  (2)、SelectPercentile移除除了用户指定的最高得分百分比之外的所有特征

这些对象将得分函数作为输入,返回单变量的得分和 p 值:

用例1,SelectPercentile的用法:

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, SelectPercentile
from sklearn.feature_selection import f_classif
iris = load_iris()
X, y = iris.data, iris.target
sp = SelectPercentile(f_classif, percentile= 90)
#得到返回至少含有90%特征信息的特征
X_result = sp.fit_transform(X, y)
#可以看到哪些特征被保留
sp.get_support()
#输出结果
array([ True, False,  True,  True], dtype=bool)

用例2,依然使用iris数据集,看一下mutual_info_classif 和pandas中的corr()函数的信息相关性计算结果对比;

import pandas as pd
from sklearn import  datasets
import numpy as np
import seaborn as sns
from sklearn.feature_selection import mutual_info_classif
iris = datasets.load_iris()
X = iris.data
y = iris.target
new_y = [y[i:i+1] for i in range(0, len(y), 1)]
data = np.hstack((X, new_y))
data_df = pd.DataFrame(data)
#0到3表示特征,4表示目标变量,画图查看相关性,如下图所示
sns.heatmap(data_df.corr(), annot= True, fmt= ‘.2f‘)

  0,1,2,3特征和4(目标变量)的相关性分别为【0.18,-0.42, 0.95,0.96】

  互信息相关性:

mutual_info = mutual_info_classif(X, y, discrete_features= False)
#输出结果如下,和上面的结果对比看一下
array([ 0.48502046,  0.30654537,  0.99750059,  0.9849968 ])

  三、递归特征消除(Recursive Feature Elimination)

  官网解释:给定一个外部的估计器,可以对特征赋予一定的权重(比如,线性模型的相关系数),recursive feature elimination ( RFE ) 通过考虑越来越小的特征集合来递归的选择特征。 首先,评估器在初始的特征集合上面训练并且每一个特征的重要程度是通过一个 coef_ 属性 或者 feature_importances_ 属性来获得。 然后,从当前的特征集合中移除最不重要的特征。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。

用例:

from sklearn.feature_selection import RFE
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import datasets
iris = datasets.load_iris()
gbdt_RFE = RFE(estimator=GradientBoostingClassifier(random_state= 123),n_features_to_select=2)
gbdt_RFE.fit(iris.data, iris.target)
gbdt_RFE.support_
#特征选择输出结果
gbdt_RFE.support_
#输出结果为:
array([False, False,  True,  True], dtype=bool)

  四、使用SelectFromModel 选取特征(Feature selection using SelectFromModel)

官网解释:SelectFromModel是一个 meta-transformer(元转换器) ,它可以用来处理任何带有 coef_ 或者 feature_importances_ 属性的训练之后的评估器。 如果相关的``coef_`` 或者 featureimportances 属性值低于预先设置的阈值,这些特征将会被认为不重要并且移除掉。除了指定数值上的阈值之外,还可以通过给定字符串参数来使用内置的启发式方法找到一个合适的阈值。可以使用的启发式方法有 mean 、 median 以及使用浮点数乘以这些(例如,0.1*mean )

4.1、基于 L1 的特征选取

用例:

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

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

4.2、基于 Tree(树)的特征选取

  基于树的 estimators (查阅 sklearn.tree 模块和树的森林 在 sklearn.ensemble 模块) 可以用来计算特征的重要性。

用例:

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_classification
from sklearn.ensemble import ExtraTreesClassifier

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000,
                           n_features=10,
                           n_informative=3,
                           n_redundant=0,
                           n_repeated=0,
                           n_classes=2,
                           random_state=0,
                           shuffle=False)

# Build a forest and compute the feature importances
forest = ExtraTreesClassifier(n_estimators=250, random_state=0)
forest.fit(X,y)
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
#作图观察特征重要性
plt.bar(range(10), importances[indices])
plt.xticks(range(X.shape[1]), indices)
plt.show()

五、特征选取作为 pipeline(管道)的一部分(Feature selection as part of a 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.pipeline.Pipeline 来了解更多的实例。

原文地址:https://www.cnblogs.com/nobbyoucanyouup/p/9026146.html

时间: 2024-07-30 10:57:51

特征选择- Sklearn.feature_selection的理解的相关文章

Python —— sklearn.feature_selection模块

Python -- sklearn.feature_selection模块 sklearn.feature_selection模块的作用是feature selection,而不是feature extraction. Univariate feature selection:单变量的特征选择 单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要.剔除那些不重要的指标. sklearn.feature_selection模块中主要有以下几个方法: Select

机器学习之特征选择和降维的理解

在机器学习中,特征选择和降维感觉好像差不多,维度都降低了,今天和其他同学交流学习才知道其实不然,区别很大. 一般情况下,我们不会使用原始数据直接去进行训练,因为原始数据的特征明显,信息丰富,我们训练后的效果对于训练集非常好,而对于测试集来说就很差了.这就是过拟合问题. 当我们进行特征提取后,维度依然不减,为了解决过拟合问题,就使用降维(常用PCA)或特征选择. 对于特征选择,就是从众多个特征中选择部分特征作为训练集的特征,抛弃剩余部分的特征,这样维度就减少了,但是选中的这部分特征就是原始数据中的

特征选择和特征理解 (转)

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

sklearn特征选择和分类模型

数据格式: 这里.原始特征的输入文件的格式使用libsvm的格式,即每行是label index1:value1 index2:value2这样的稀疏矩阵的格式. sklearn中自带了非常多种特征选择的算法. 我们选用特征选择算法的根据是数据集和训练模型. 以下展示chi2的使用例.chi2,採用卡方校验的方法进行特征选择.比較适合0/1型特征和稀疏矩阵. from sklearn.externals.joblib import Memory from sklearn.datasets imp

结合Scikit-learn介绍几种常用的特征选择方法

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

干货:结合Scikit-learn介绍几种常用的特征选择方法

原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我

数据预处理与特征选择

数据预处理和特征选择是数据挖掘与机器学习中关注的重要问题,坊间常说:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.特征工程就是将原始数据转化为有用的特征,更好的表示预测模型处理的实际问题,提升对于未知数据的预测准确性.下图给出了特征工程包含的内容: 本文数据预处理与特征选择的代码均采用sklearn所提供的方法,并使用sklearn中的IRIS(鸢尾花)数据集来对特征处理功能进行说明,IRIS数据集由Fisher在1936年整理,包含4个特征:Sepal.Length(花萼长

谁动了我的特征?——sklearn特征转换行为全记录

目录 1 为什么要记录特征转换行为?2 有哪些特征转换的方式?3 特征转换的组合4 sklearn源码分析 4.1 一对一映射 4.2 一对多映射 4.3 多对多映射5 实践6 总结7 参考资料 1 为什么要记录特征转换行为? 使用机器学习算法和模型进行数据挖掘,有时难免事与愿违:我们依仗对业务的理解,对数据的分析,以及工作经验提出了一些特征,但是在模型训练完成后,某些特征可能“身微言轻”——我们认为相关性高的特征并不重要,这时我们便要反思这样的特征提出是否合理:某些特征甚至“南辕北辙”——我们

如何进行特征选择?

特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的). 在许多机器学习相关的书里,很难