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

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

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

相关文章

来自专栏机器学习入门

PRML系列:1.1 多项式函数拟合

前言 此系列关于Pattern Recognition and Machine Learning的总结,博文记录一些在阅读过程中遇到的难点和自己的感悟。话不多说...

2108
来自专栏PPV课数据科学社区

机器学习评价指标大汇总

在使用机器学习算法的过程中,针对不同场景需要不同的评价指标,在这里对常用的指标进行一个简单的汇总。 一、分类 1. 精确率与召回率 精确率与召回率多用于二分类问...

35610
来自专栏AI研习社

使用 Scikit-learn 理解随机森林

在我以前的一篇文章(https://blog.datadive.net/interpreting-random-forests/)中,我讨论了随机森林如何变成一...

922
来自专栏机器学习算法原理与实践

主成分分析(PCA)原理总结

    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都...

764
来自专栏Python小屋

KNN分类算法原理与Python+sklearn实现根据身高和体重对体型分类

KNN算法是k-Nearest Neighbor Classification的简称,也就是k近邻分类算法。基本思路是在特征空间中查找k个最相似或者距离最近的样...

2767
来自专栏数据科学与人工智能

【Python环境】Python分类现实世界的数据

引入 一个机器可以根据照片来辨别鲜花的品种吗?在机器学习角度,这其实是一个分类问题,即机器根据不同品种鲜花的数据进行学习,使其可以对未标记的测试图片数据进行分类...

2536
来自专栏SeanCheney的专栏

《Scikit-Learn与TensorFlow机器学习实用指南》 第5章 支持向量机

支持向量机(SVM)是个非常强大并且有多种功能的机器学习模型,能够做线性或者非线性的分类,回归,甚至异常值检测。机器学习领域中最为流行的模型之一,是任何学习机器...

402
来自专栏AILearning

【Scikit-Learn 中文文档】朴素贝叶斯 - 监督学习 - 用户指南 | ApacheCN

中文文档: http://sklearn.apachecn.org/cn/stable/modules/naive_bayes.html 官方文档: htt...

2118
来自专栏机器学习算法原理与实践

支持向量机高斯核调参小结

    在支持向量机(以下简称SVM)的核函数中,高斯核(以下简称RBF)是最常用的,从理论上讲, RBF一定不比线性核函数差,但是在实际应用中,却面临着几个重...

623
来自专栏机器学习原理

机器学习(14)——朴素贝叶斯算法思想:基于概率的预测贝叶斯公式朴素贝叶斯算法示例:文本数据分类

前言:在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,...

5774

扫描关注云+社区