机器学习之特征工程-特征选择

一个基本的数据挖掘场景如下:

数据挖掘.jpg

从上面的数据挖掘场景可知,当数据预处理完成后,我们需要选择有意义的特征,输入机器学习的算法模型进行训练。通常来说,从两个方面考虑来选择特征:

特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

根据特征选择的形式又可以将特征选择方法分为3种:

  • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  • Embedded:集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

我们使用sklearn中的feature_selection库来进行特征选择。

Filter

1

方差法

使用方差法,要先计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

from sklearn.datasets import load_iris from sklearn.feature_selection import VarianceThreshold #方差选择法,返回值为特征选择后的数据 #参数threshold为方差的阈值 iris = load_iris() print(iris.data[0]) print(iris.target[0]) print(VarianceThreshold(threshold=3).fit_transform(iris.data)[0])

从结果看,只有第三个属性符合,结果如下:

[ 5.1 3.5 1.4 0.2]0[ 1.4]

皮尔逊系数

皮尔逊系数只能衡量线性相关性,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合皮尔逊系数来选择特征的代码如下:

from sklearn.feature_selection import SelectKBestfrom scipy.stats import pearsonrfrom sklearn.datasets import load_iris iris=load_iris()#选择K个最好的特征,返回选择特征后的数据#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数#参数k为选择的特征个数# 定义函数def multivariate_pearsonr(X, y): scores, pvalues = [], [] for ret in map(lambda x:pearsonr(x, y), X.T): scores.append(abs(ret[0])) pvalues.append(ret[1]) return (np.array(scores), np.array(pvalues)) transformer = SelectKBest(score_func=multivariate_pearsonr, k=2) Xt_pearson = transformer.fit_transform(iris.data, iris.target) print(Xt_pearson)

卡方检验

只能用于二分类,经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性(http://wiki.mbalib.com/wiki/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C)。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2 #选择K个最好的特征,返回选择特征后的数据 SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

互信息法

互信息系数能够很好地度量各种相关性,但是计算相对复杂一些,互信息计算公式如下:

使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下

from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import mutual_info_classif #选择K个最好的特征,返回选择特征后的数据 SelectKBest(mutual_info_classif, k=2).fit_transform(iris.data, iris.target)

Wrapper

包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。

递归特征消除法

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression #递归特征消除法,返回特征选择后的数据

#参数estimator为基模型 #参数n_features_to_select为选择的特征个数 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data,iris.target)

Embedded

集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

基于树模型的特征选择法

树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import GradientBoostingClassifier #GBDT作为基模型的特征选择SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

当然还有别的方法:

通过特征组合后再来选择特征:如对用户id和用户特征组合来获得较大的特征集再来选择特征,这种做法在推荐系统和广告系统中比较常见,这也是所谓亿级甚至十亿级特征的主要来源,原因是用户数据比较稀疏,组合特征能够同时兼顾全局模型和个性化模型。

通过深度学习来进行特征选择:目前这种手段正在随着深度学习的流行而成为一种手段,尤其是在计算机视觉领域,原因是深度学习具有自动学习特征的能力,这也是深度学习又叫unsupervised feature learning的原因。从深度学习模型中选择某一神经层的特征后就可以用来进行最终目标模型的训练了。

文中涉及源码在此:源码(https://github.com/jacksu/machine-learning/blob/master/src/ml/feature_selection.ipynb)

皮尔逊系数

1、皮尔逊系数(https://www.zhihu.com/question/19734616) 2、普通数据挖掘场景(http://www.cnblogs.com/jasonfreak/p/5448462.html) 3、https://www.zhihu.com/question/29316149 4、sklearn feature selection(http://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection)

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-11-03

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

计算机视觉任务:图像梯度和图像完成

该笔记是以斯坦福cs231n课程的python编程任务为主线,展开对该课程主要内容的理解和部分数学推导。这篇文章是关于计算机视觉处理的,分为两篇文章撰写完成。此...

3607
来自专栏AI科技大本营的专栏

入门 | 零基础入门深度学习系列——递归神经网络

为了帮助编程爱好者,从零开始入门,AI100特别精选了韩炳涛所著《零基础入门深度学习》系列文章,以下Enjoy! 作者 | 韩炳涛 无论即将到来的是大数据时代还...

39210
来自专栏python读书笔记

《算法图解》note 10 K近邻算法1.K近邻算法简介2.python实现方式3.K近邻算法的优缺点

18510
来自专栏大数据挖掘DT机器学习

R语言实现主成分和因子分析

主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。 探索性因子分析(EFA)是一系列用来发现一组变量...

2964
来自专栏null的专栏

利用Theano理解深度学习——Convolutional Neural Networks

注:本系列是基于参考文献中的内容,并对其进行整理,注释形成的一系列关于深度学习的基本理论与实践的材料,基本内容与参考文献保持一致,并对这个专题起名为“利用The...

4089
来自专栏深度学习入门与实践

【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络GoogLeNet

  前面讲了LeNet、AlexNet和Vgg,这周来讲讲GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在201...

3686
来自专栏大数据挖掘DT机器学习

你看到的最直白清晰的CNN讲解

这篇博客介绍的是深度神经网络中常用在图像处理的模型——卷积神经网络(CNN),CNN在图像分类中(如kaggle的猫狗大战)大显身手。这篇博客将带你了解图像在...

43610
来自专栏小小挖掘机

对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析

1、背景 GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很...

6858
来自专栏智能算法

使用sklearn做单机特征工程

出自博客园 链接:http://www.cnblogs.com/jasonfreak/p/5448385.html 1 特征工程是什么? 有这么一句话在业界广...

2914
来自专栏机器学习算法与Python学习

基础 | 10幅图解释机器学习中的基本概念

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 以下的几幅图是我认为在解释机器学习基...

3176

扫码关注云+社区