Scikit-learn 学习笔记--(1)特征选择

1 篇文章 0 订阅
1 篇文章 0 订阅

  特征选择(排序)对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。

特征选择主要有两个功能:

  1. 减少特征数量、降维,使模型泛化能力更强,减少过拟合
  2. 增强对特征和特征值之间的理解

  拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。

scikit-learn Feature selection

1. Removing features with low variance 去掉取值变化小的特征

  假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。

可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

  我们想移除特征值全0或者全1超过百分之80的特征,满足伯努利分布,方差为:

Var[X]=p(1p)

  所以我们可以设定阈值为: 0.8(10.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 = (0.8*(1-0.8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])
Parsed in 0.006 seconds

  正如预期的那样,VarianceThreshold 消除了第一列

2. Univariate feature selection 单变量特征选择

  单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。可以看做一个预处理步骤的估计量,对于回归和分类问题可以采用卡方检验等方式对特征进行测试。

这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。

SelectKBest /SelectPercentile

SelectKBest :只保留得分最高的前k个特征
SelectPercentile:只保留得分最高的前百分之k个特征
而他们通过什么指标来进行排名呢?根据官方文档,有以下几个指标:

TargetDescribe
f_classifANOVA F-value between labe/feature for classification tasks.
chi2Chi-squared stats of non-negative features for classification tasks.
f_regressionF-value between label/feature for regression tasks.
>>> 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)
>>>###Percentile
>>> from sklearn.feature_selection import SelectPercentile
>>> X_new_Percent = SelectPercentile(chi2,percentile=50).fit_transform(X,y)
>>> X_new_Percent.shape
(150, 2)

对于regression问题,可以使用f_regression指标。对于classification问题,可以使用chi2或者f_classif变量。

3. Recursive feature elimination 递归特征选择(RFE)

递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

Sklearn提供了RFE包,可以用于特征消除,还提供了RFECV,可以通过交叉验证来对的特征进行排序。

>>> 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)
>>> estimator = SVR(kernel="linear")
>>> selector = RFE(estimator, 5, step=1)
>>> selector = selector.fit(X, y)
>>> selector.support_ 
array([ True,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)
>>> selector.ranking_
array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])

其中SVR是支持向量回归算法,他跟SVM的区别:戳我戳我!!


ParametersTypeDefaultDescribe
estimatorobject/一种算法或者模型
n_features_to_selectint or Nonedefault=None选择多少维特征,不填则选择一半特征
stepint or floatdefault=1大于等于1每次迭代删除相应整数的特征,0-1之间每次迭代删除对应百分比的特征
estimator_paramsdict/外部参数估计量,不建议使用该属性
verboseintdefault=0控制输出的冗长

AttributesTypeDescirbe
n_features_int选择的特征数量
support_array of shape [n_features]所有特征是否被选择的布尔值
ranking_array of shape [n_features]特征得分排名
estimator_object使用的算法或者模型对象

4. Feature selection using SelectFromModel

L1-based feature selection

  该思路的原理是:在linear regression模型中,有的时候会得到sparse solution。意思是说很多变量前面的系数都等于0或者接近于0。这说明这些变量不重要,那么可以将这些变量去除


TipsExplain
卡方检验用方差来衡量某个观测频率和理论频率之间差异性的方法
皮尔森卡方检验这是一种最常用的卡方检验方法,它有两个用途:1是计算某个变量对某种分布的拟合程度,2是根据两个观测变量的Contingency table来计算这两个变量是否是独立的。主要有三个步骤:第一步用方差和的方式来计算观测频率和理论频率之间卡方值;第二步算出卡方检验的自由度(行数-1乘以列数-1);第三步比较卡方值和对应自由度的卡方分布,判断显著性。
p-value,p-value就是为了验证假设和实际之间一致性的统计学意义的值,即假设检验。有些地方叫右尾概率,根据卡方值和自由度可以算出一个固定的p-value,
响应变量(response value)模型的输入叫做explanatroy variables,模型的输出叫做response variables,其实就是要验证该特征对结果造成了什么样的影响

That’s it References:
http://dataunion.org/14072.html

未完---------》》》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值