3.1.2 相关性过滤

方差挑选完毕之后,我们就要考虑下一个问题:相关性了。我们希望选出与标签相关且有意义的特征,因为这样的

特征能够为我们提供大量信息。如果特征与标签无关,那只会白白浪费我们的计算内存,可能还会给模型带来噪

音。在sklearn当中,我们有三种常用的方法来评判特征与标签之间的相关性:卡方,F检验,互信息

3.1.2.1 卡方过滤

卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类feature_selection.chi2计算每个非负

特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest

这个可以输入”评分标准“来选出前K个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目

的无关的特征。

另外,如果卡方检验检测到某个特征中所有的值都相同,会提示我们使用方差先进行方差过滤。并且,刚才我们已

经验证过,当我们使用方差过滤筛选掉一半的特征后,模型的表现时提升的。因此在这里,我们使用threshold=中

位数时完成的方差过滤的数据来做卡方检验(如果方差过滤后模型的表现反而降低了,那我们就不会使用方差过滤

后的数据,而是使用原数据):

from sklearn.ensemble import RandomForestClassifier as RFC

from sklearn.model_selection import cross_val_score

from sklearn.feature_selection import SelectKBest

from sklearn.feature_selection import chi2

#假设在这里我一直我需要300个特征

X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)

X_fschi.shape

验证一下模型的效果如何:

cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

可以看出,模型的效果降低了,这说明我们在设定k=300的时候删除了与模型相关且有效的特征,我们的K值设置

得太小,要么我们需要调整K值,要么我们必须放弃相关性过滤。当然,如果模型的表现提升,则说明我们的相关

性过滤是有效的,是过滤掉了模型的噪音的,这时候我们就保留相关性过滤的结果。

3.1.2.2 选取超参数K

那如何设置一个最佳的K值呢?在现实数据中,数据量很大,模型很复杂的时候,我们也许不能先去跑一遍模型看

看效果,而是希望最开始就能够选择一个最优的超参数k。那第一个方法,就是我们之前提过的学习曲线:

#======【TIME WARNING: 5 mins】======#

%matplotlib inline

import matplotlib.pyplot as plt

score = []

for i in range(390,200,-10):

X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)

once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

score.append(once)

plt.plot(range(350,200,-10),score)

plt.show()

通过这条曲线,我们可以观察到,随着K值的不断增加,模型的表现不断上升,这说明,K越大越好,数据中所有的

特征都是与标签相关的。但是运行这条曲线的时间同样也是非常地长,接下来我们就来介绍一种更好的选择k的方

法:看p值选择k。

卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和

P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.01或0.05作为显著性水平,即p值判断

的边界,具体我们可以这样来看:

P值 =<0.05或0.01          >0.05或0.01

拒绝原假设,接受备择假设      接受原假设

从特征工程的角度,我们希望选取卡方值很大,p值小于0.05的特征,即和标签是相关联的特征。而调用

SelectKBest之前,我们可以直接从chi2实例化后的模型中获得各个特征所对应的卡方值和P值。

chivalue, pvalues_chi = chi2(X_fsvar,y)

#k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征:

k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()

#X_fschi = SelectKBest(chi2, k=填写具体的k).fit_transform(X_fsvar, y)

#cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

可以观察到,所有特征的p值都是0,这说明对于digit recognizor这个数据集来说,方差验证已经把所有和标签无

关的特征都剔除了,或者这个数据集本身就不含与标签无关的特征。在这种情况下,舍弃任何一个特征,都会舍弃

对模型有用的信息,而使模型表现下降,因此在我们对计算速度感到满意时,我们不需要使用相关性过滤来过滤我

们的数据。如果我们认为运算速度太缓慢,那我们可以酌情删除一些特征,但前提是,我们必须牺牲模型的表现。

接下来,我们试试看用其他的相关性过滤方法验证一下我们在这个数据集上的结论

3.1.2.3 F检验

F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也

可以做分类,因此包含feature_selection.f_classif(F检验分类)和feature_selection.f_regression(F检验回

归)两个类。其中F检验分类用于标签是离散型变量的数据,而F检验回归用于标签是连续型变量的数据。

和卡方检验一样,这两个类需要和类SelectKBest连用,并且我们也可以直接通过输出的统计量来判断我们到底要

设置一个什么样的K。需要注意的是,F检验在数据服从正态分布时效果会非常稳定,因此如果使用F检验过滤,我

们会先将数据转换成服从正态分布的方式。

F检验的本质是寻找两组数据之间的线性关系,其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统

计量。和卡方过滤一样,我们希望选取p值小于0.05或0.01的特征,这些特征与标签时显著线性相关的,而p值大于

0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征,应该被删除。以F检验的分类为例,我们继续

在数字数据集上来进行特征选择

from sklearn.feature_selection import f_classif

F, pvalues_f = f_classif(X_fsvar,y)

k = F.shape[0] - (pvalues_f > 0.05).sum()

#X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)

#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

得到的结论和我们用卡方过滤得到的结论一模一样:没有任何特征的p值大于0.01,所有的特征都是和标签相关

的,因此我们不需要相关性过滤

3.1.2.4 互信息法

互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既

可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和

feature_selection.mutual_info_regression(互信息回归)。这两个类的用法和参数都和F检验一模一样,不过

互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。

互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间

取值,为0则表示两个变量独立,为1则表示两个变量完全相关。以互信息分类为例的代码如下:

from sklearn.feature_selection import mutual_info_classif as MIC

result = MIC(X_fsvar,y)

k = result.shape[0] - sum(result <= 0)

#X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)

#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

所有特征的互信息量估计都大于0,因此所有特征都与标签相关。

当然了,无论是F检验还是互信息法,大家也都可以使用学习曲线,只是使用统计量的方法会更加高效。当统计量

判断已经没有特征可以删除时,无论用学习曲线如何跑,删除特征都只会降低模型的表现。当然了,如果数据量太

庞大,模型太复杂,我们还是可以牺牲模型表现来提升模型速度,一切都看大家的具体需求

3.1.3 过滤法总结

到这里我们学习了常用的基于过滤法的特征选择,包括方差过滤,基于卡方,F检验和互信息的相关性过滤,讲解

了各个过滤的原理和面临的问题,以及怎样调这些过滤类的超参数。通常来说,我会建议,先使用方差过滤,然后

使用互信息法来捕捉相关性,不过了解各种各样的过滤方式也是必要的

python相关性分析特征过滤_特征选择-Filter过滤法后续(相关,互信息法)相关推荐

  1. python相关性分析特征过滤_Python相关性分析

    导言机器学习的步骤 1)提出问题 :一切的机器学习目标都是为了解决生活或工作的实际问题 2)理解数据 : 采集数据(根据研究问题采集相关数据) 导入数据(数据从Excel.数据库.网络中导入到Phyt ...

  2. python相关性分析及画图_数据分析Python手绘图形库有哪些?

    数据分析Python手绘图形库有哪些,今天,给大家介绍一个很酷的 Python 手绘风格可视化神包:cutecharts. 和 Matplotlib .pyecharts 等常见的图表不同,使用这个包 ...

  3. python相关性分析后怎样删除特征_震惊!数据分析还能这样做?

    原标题:震惊!数据分析还能这样做? 数据分析概述 数据分析完整工作流程 关于数据分析的大体流程这里以图形的形式展现给大家,就不做过多的讲述. 数据探索与相关性分析 这一部分是直接从数据分析工作流程中的 ...

  4. python特征选择后显示选取的特征名_特征选择 (feature_selection)

    特征选择 (feature_selection) 本文主要参考sklearn(0.18版为主,部分0.17)的1.13节的官方文档,以及一些工程实践整理而成. 当数据预处理完成后,我们需要选择有意义的 ...

  5. python 相关性分析_数据分析---用Python进行相关性分析(兼谈假设检验)

    一.相关关系和相关系数 世上除了因果关系,还有相关关系. 有一个叫"相关系数"的指标来量化两个事物之间的相关程度. 其中相关系数用"r"表示,取值范围介于-1和 ...

  6. python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...

    引言 基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET).其中,RFE整合了两种不同的超参数, ...

  7. python 相关性分析原理及代码详细介绍

    一.相关性分析简介 相关性分析(correlation analysis)是指对两个或多个具备相关关系的变量进行线性相关分析,从而衡量变量间的相关程度或密切程度.相关性程度即为相关性系数R,R的取值范 ...

  8. python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

    本文首发地址: https://yishuihancheng.blog.csdn.net/article/details/83547648 欢迎关注我的博客[Together_CZ],我是沂水寒城! ...

  9. python随机森林特征重要性_基于随机森林识别特征重要性(翻译)

    博主Slav Ivanov 的文章<Identifying churn drivers with Random Forests >部分内容翻译.博主有一款自己的产品RetainKit,用A ...

最新文章

  1. openStack高可用性和灾备方案
  2. 浮动5-常用列表显示(案例)
  3. 大型WEB架构概况(笔记整理)一
  4. 信用贷款额度是怎么确定的?
  5. JNI学习积累之一 ---- 常用函数大全
  6. Android数据库Realm实践
  7. hibernate在saveOrUpdate时,update报错:a different object with the same identifier value was already assoc
  8. windows 2008 R2系统安装拨号v p n详细配置
  9. C/C++排序算法(2)希尔排序
  10. C++ 内存分配(new,operator new)详解
  11. auto cad 打印颜色变浅_CAD初学者最容易忽视的CAD打印线宽问题,你“中枪”了吗?...
  12. nginx静态代理设置一:静态文件在本机
  13. 微信模拟地理位置_伪装微信地理位置
  14. 118、交换机配置规范
  15. [35期] 没有硝烟的战争
  16. BiliBili2020校招笔试题
  17. 桌面右下角任务栏图标消失问题解决
  18. 等效结点荷载计算机语言,等效节点荷载,equivalent node load,音标,读音,翻译,英文例句,英语词典...
  19. [论文翻译]V-Net:Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
  20. Procmon 结果列代码及其含义Detail 列使用的文件属性代码

热门文章

  1. PNAS-2018-玉米根际的大规模田间重复研究确定可遗传的微生物
  2. 扩增子文献笔记2拟南芥根微生物组的结构和组成
  3. 16s扩增子分析注意事项和经验总结Tips
  4. R语言ggplot2可视化设置数据点的大小、设置数据点的颜色、设置数据点边缘线条的厚度(point border thickness)实战
  5. R构建多项式回归模型(Polynomial Regression)
  6. Python到底是什么样的语言? Python和Java比谁更快? TensorFlow的主体是用Python写的吗?
  7. 朴素贝叶斯(NBM,Naive Bayesian Model)为什么朴素又有哪些形式?
  8. DESeq2包分析差异表达基因
  9. java 连接池 druid_从零开始学 Java - 数据库连接池的选择 Druid
  10. 为什么RStudio Server这么慢?