机器学习中的特征选择

总第98篇

本篇讲解一些特征工程部分的特征选择(feature_selection),主要包括以下几方面:

  • 特征选择是什么
  • 为什么要做特征选择
  • 特征选择的基本原则
  • 特征选择的方法及实现

特征选择是什么

特征选择也称特征子集选择,是从现有的m个特征中选出对机器学习有用的n个特征(n<=m),以此降低特征维度减少计算量,同时也使模型效果达到最优。

为什么要做特征选择

在实际业务中,用于模型中的特征维度往往很高,几万维,有的一些CTR预估中维度高达上亿维,维度过高会增大模型计算复杂度,但是在这么多维数据中,并不是每个特征对模型的预测都是有效果的,所以需要利用一些方法去除一些不必要特征,从而降低模型的计算复杂度。

特征选择的基本原则

我们在进行特征选择时,主要遵循如下两个原则:

  • 波动性
  • 相关性

波动性是指该特征取值发生变化的情况,用方差来衡量,如果方差很小,说明该特征的取值很稳定,可以近似理解成该特征的每个值都接近,这样的特征对模型是没有任何效果,是不具备区分度的,比如年龄这个特征,都是20岁左右大小的。反之,方差越大,则特征对模型的区分度越好。

相关性是就是该特征和目标结果的相关性大小,常用皮尔逊相关系数来度量。

特征选择的方法及实现

1.移除低方差特征

移除低方差特征是指移除那些方差低于某个阈值,即特征值变动幅度小于某个范围的特征,这一部分特征的区分度较差,我们进行移除。 这里的这个阈值需要根据具体的业务场景进行设定。

from sklearn.feature_selection import VarianceThreshold
X = [[0, 2, 1], [1, 1, 0], [2, 3, 0], [3, 6, 1], [4, 2, 0], [5, 1, 1]]
print(X)
print("---------------")
sel = VarianceThreshold(threshold=1)
sel.fit_transform(X)
print(sel.fit_transform(X))
2.单变量特征选择

单变量特征是基于单一变量和目标y之间的关系,通过计算某个能够度量特征重要性的指标,然后选出重要性Top的K个特征。但是这种方式有一个缺点就是忽略了特征组合的情况,有的时候单一特征可能表现不是很好,但是与其他特征组合以后,效果就很不错,这样就会造成特征被误删,所以这种特征选择方式不常用。该特征选择方式可以通过SelectKBest(score_func=<function f_classif at 0x6404aa0>, k=10)实现,其中score_func是用来指定特征重要性的计算公式,k是特征保留维度。下面是一些score_func函数及其解释:

f_classif(相关性度量): ANOVA F-value between label/feature for classification tasks. mutual_info_classif(互信息度量): Mutual information for a discrete target. chi2(卡方检验): Chi-squared stats of non-negative features for classification tasks. f_regression(用于回归的相关性度量): F-value between label/feature for regression tasks. mutual_info_regression(用于回归的互信息度量): Mutual information for a continuous target. SelectPercentile: Select features based on percentile of the highest scores. SelectFpr: Select features based on a false positive rate test. SelectFdr: Select features based on an estimated false discovery rate. SelectFwe: Select features based on family-wise error rate. GenericUnivariateSelect: Univariate feature selector with configurable mode.

递归式消除特征

递归式消除特征(RFE)是指,将全部特征都丢到给定的模型里面,模型会输出每个特征的重要性,然后删除那些不太重要的特征;把剩下的特征再次丢到模型里面,又会输出各个特征的重要性,再次删除;如此循环,直至最后剩下目标维度的特征值。

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")
##5个特征被选中,每次迭代去除1个特征。
selector = RFE(estimator, 5, step=1)
selector = selector.fit(X, y)
print(selector.support_) ##所选特征的掩码
##特征排名,使得rank_ [i]对应于第i个特征的排名位置。
##所选择的(重要性最高的)特征被分配为等级1,被删除的特征显示其原始的位置。
selector.ranking_
print(selector.fit(X,y))

因为该方法每次都需要把特征从新丢到模型里面进行计算,计算量较为复杂;因该方法需要模型输出特征重要性,所以需要选用可以输出特征重要性的模型,比如LR的coef_。

使用SelectFromModel选取特征

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

SelectFromModel和递归式消除特征不同的是,该方法不需要重复训练模型,只需要训练一次即可;二是该方法是指定权重的阈值,不是指定特征的维度。

1.基于L1正则化的特征提取

使用L1正则化的线性模型会得到一个稀疏权值矩阵,即生成一个稀疏模型:该模型的大多数系数为0,即特征重要性为0,这个时候可以利用 SelectFromModel方法选择非零系数所对应的特征,正则化的过程就可以看作是特征选择的一部分。可以用于此目的的稀疏评估器有用于回归的linear_model.Lasso,以及用于分类以及用于分类的linear_model.LogisticRegression 和 svm.LinearSVC。实现方式如下:

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
2.基于Tree(树)模型的特征选取

我们知道树模型的建立过程就是一个特征选择的过程,他会根据信息增益的准则来选择信息增益最大的特征来进行建模,输出各个特征的feature_importances_,然后传入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
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
clf.feature_importances_  
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape               

你还可以看看:

机器学习模型效果评估

机器学习中非平衡数据处理

原文发布于微信公众号 - 张俊红(zhangjunhong0428)

原文发表时间:2018-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文武兼修ing——机器学习与IC设计

Fast-RCNN阅读笔记系统架构模型训练

由于RCNN存在流水线过长,检测速度慢的问题,Fast-RCNN几乎将整个过程置于深度学习的框架下,因此带来了准确率和速度的提升,该系统主要组成部分如上图所示,...

1321
来自专栏深度学习思考者

深度学习目标检测算法——Faster-Rcnn

Faster-Rcnn代码下载地址:https://github.com/ShaoqingRen/faster_rcnn 一 前言   Faster rcnn是...

3115
来自专栏marsggbo

DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍

一、计算机视觉 ? 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计...

22410
来自专栏人工智能

基于Region Proposal的深度学习目标检测简述(一)

开篇需要跟大家道歉,一切忙没时间的理由都是借口,实际上就是偷懒了,这么久才更新,非常抱歉! 本篇争取以最简明的叙述,帮助大家理解下基于Region Propos...

3416
来自专栏贾志刚-OpenCV学堂

理解CNN卷积层与池化层计算

深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长、填充方式、卷积核大小、池化层策略等都会对最终输出模型与参数、计算复杂度产生...

2121
来自专栏瓜大三哥

DeepFace

检测→对齐→表示→分类 在文章中,通过3d模型改进了人脸对齐的方法。然后,通过基于4million人脸图像(4000个个体)训练的一个9层的人工神经网络来进行人...

2486
来自专栏机器学习、深度学习

人脸对齐--Dense Face Alignment

Dense Face Alignment ICCVW2017 http://cvlab.cse.msu.edu/project-pifa.html ...

4847
来自专栏用户2442861的专栏

VGG论文笔记/小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

3252
来自专栏闪电gogogo的专栏

《统计学习方法》笔记七(1) 支持向量机——线性可分支持向量机

应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解,一是因为对偶问题往往更容易求解,二是自然引入核函数,进而推广到非线性分类的问题。

812
来自专栏机器人网

反卷积是什么?反卷积的作用

反卷积与卷积 反卷积,顾名思义是卷积操作的逆向操作。 为了方便理解,假设卷积前为图片,卷积后为图片的特征。 卷积,输入图片,输出图片的特征,理论依据是统计不变性...

2936

扫码关注云+社区

领取腾讯云代金券