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

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

数据挖掘.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 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

人脸识别技术大总结1——Face Detection &Alignment

2105
来自专栏AI科技评论

深度学习元老Yann Lecun详解卷积神经网络(30页干货PPT)

雷锋网注:卷积神经网络(Convolutional Neural Network)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型...

4189
来自专栏红色石头的机器学习之路

台湾大学林轩田机器学习基石课程学习笔记9 -- Linear Regression

上节课,我们主要介绍了在有noise的情况下,VC Bound理论仍然是成立的。同时,介绍了不同的error measure方法。本节课介绍机器学习最常见的一种...

2180
来自专栏机器学习和数学

[机智的机器在学习] 机器学习中的归一化和正则化问题

今天我们要说的是,在机器学习常用的算法里面,那些需要归一化,那些不需要,通过scikit-learn中的预处理的一些方法,实际了解如何正则化和归一化数据。看完本...

5526
来自专栏大数据智能实战

Photographic Image Synthesis with Cascaded Refinement Networks(由语义分割图生成逼真街景图)

  在生成真实图像方面,常用的都是无监督模型,如GAN,VAE等。   然而ICCV2017的这篇文章,同样是从图像(图像分割结果的语义标注图)到原始的街景图像...

3606
来自专栏专知

你以为线性回归和逻辑回归是一回事吗?

【导读】逻辑回归到底是回归还是分类?逻辑回归和线性回归是一回事儿吗?它们有什么区别和联系?其实它们从输出到公式,再到残差分布,都不一样。本文将认真“探讨”关于以...

4833
来自专栏AI研习社

我是这样学习 GAN 的——开发者自述

Generative Adversarial Network,就是大家耳熟能详的 GAN,由 Ian Goodfellow 首先提出,在这两年更是深度学习中最热...

3136
来自专栏SIGAI学习与实践平台

流形学习概述

同时在本微信公众号中,回复“SIGAI”+日期,如“SIGAI0515”,即可获取本期文章的全文下载地址(仅供个人学习使用,未经允许,不得用于商业目的)。

893
来自专栏Spark学习技巧

【深度学习】笔记第一弹--神经网络

1. 神经网络前言 1.1 背景 在进入神经网络之前,先讲述两个略带血腥的实验。 第一个实验是科学家将耳朵到大脑听觉区的神经给切断了,然后将眼睛到大脑听觉区的...

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

数据挖掘算法(logistic回归,随机森林,GBDT和xgboost)

面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终,不过继续加油。 不过总的来看,面试前有准备...

6409

扫码关注云+社区