方差特征选择的原理与使用

VarianceThreshold 是特征选择的一个简单基本方法,其原理在于–底方差的特征的预测效果往往不好。而VarianceThreshold会移除所有那些方差不满足一些阈值的特征。默认情况下,它将会移除所有的零方差特征,即那些在所有的样本上的取值均不变的特征。

例如,假设我们有一个特征是布尔值的数据集,我们想要移除那些在整个数据集中特征值为0或者为1的比例超过80%的特征。布尔特征是伯努利( Bernoulli )随机变量,变量的方差为


Var[X] = p(1-p)

因此,我们可以使用阈值.8*(1-.8)进行选择:

from sklearn.feature_selection import *X = [[100, 1, 2, 3],[100, 4, 5, 6],[100, 7, 8, 9],[100, 11, 12, 13],[100, 11, 12, 13],[101, 11, 12, 13]]threshold = .8*(1-.8)def test_VarianceThreshold(X,threshold):selector = VarianceThreshold(threshold)selector.fit(X)print("Variances is %s" % selector.variances_)print("After transform is %s" % selector.transform(X))print("The surport is %s" % selector.get_support(True))print("After reverse transform is %s" %selector.inverse_transform(selector.transform(X)))return selector.transform(X)test_VarianceThreshold(X=X,threshold=threshold)
Variances is [  0.13888889  15.25        15.25        15.25      ]
After transform is [[ 1  2  3][ 4  5  6][ 7  8  9][11 12 13][11 12 13][11 12 13]]
The surport is [1 2 3]
After reverse transform is [[ 0  1  2  3][ 0  4  5  6][ 0  7  8  9][ 0 11 12 13][ 0 11 12 13][ 0 11 12 13]]array([[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9],[11, 12, 13],[11, 12, 13],[11, 12, 13]])

但是对于实际的数据集而言,很多时候底方差的数据并不代表着其不是有效的数据,在很多时候移除底方差的数据带来的可能并不是模型性能的提升,而是下降。下面的实验就证明力这一现象

方差特征选择的缺陷

首先,加载数据

from sklearn import datasets,model_selection
def load_data():iris=datasets.load_iris() # scikit-learn 自带的 iris 数据集X_train=iris.datay_train=iris.targetreturn model_selection.train_test_split(X_train, y_train,test_size=0.25,random_state=0,stratify=y_train)

然后定义一个用来比较性能差距的类,在之后的测试中我们将会一直使用这两个类:

def show_tree(X_train,X_test,y_train,y_test):from sklearn.tree import DecisionTreeClassifiercriterions=['gini','entropy']for criterion in criterions:clf = DecisionTreeClassifier(criterion=criterion)clf.fit(X_train, y_train)print("    ",criterion,"Training score:%f"%(clf.score(X_train,y_train)))print("    ",criterion,"Testing score:%f"%(clf.score(X_test,y_test)))def comparison_tree(selector):X_train,X_test,y_train,y_test=load_data()print("\nBefore feture selection :\n")show_tree(X_train,X_test,y_train,y_test)print("\nAfter feture selection :\n")selector.fit(X_train)new_X_train = selector.transform(X_train)new_X_test = selector.transform(X_test)show_tree(new_X_train,new_X_test,y_train,y_test)comparison_tree(selector=VarianceThreshold(.8*(1-.8)))
Before feture selection :gini Training score:1.000000gini Testing score:0.947368entropy Training score:1.000000entropy Testing score:0.947368After feture selection :gini Training score:1.000000gini Testing score:0.947368entropy Training score:1.000000entropy Testing score:0.921053

由上面的实验可以证明,移除底方差的数据并不一定会带来模型性能的性能提升,甚至可能是下降。

其他方法

参考

  • fit_transform : 使用数据并转换
  • get_params : 获取参数
  • get_support :获取所选元素的整数索引
  • inverse_transform : 反转换
  • set_params : 设置参数

本文参考

  • sklearn官方文档
  • sklearn ApacheCN 官方翻译

方差过滤: Removing features with low variance相关推荐

  1. Scikit-learn学习系列 | 4. sklearn特征降维方法汇总(方差过滤,卡方,F过滤,互信息,嵌入法)

    如有错误,恳请指出. 以下内容整理自专栏:博主"文火冰糖的硅基工坊"的专栏--机器学习与scikit-learn,对部分的文章的简化与整理. 文章目录 1. 常见的降维方法简介 1 ...

  2. 机器学习(5)降维 -- 特征选择(低方差过滤与相关系数)与主成分分析(PCA降维)

    目录 一.基础理论 1.降维定义 2.降维对象及目标 二.低方差过滤 1.基础理论 2.API 过程: 1.读取待处理数据集 2.创建低方差过滤转换器(设置过滤阈值) 3.低方差过滤处理 代码 三.相 ...

  3. R计算方差膨胀因子(VIF,Variance Inflation Factor)计算并解读VID与共线性(Multicollinearity)的关系实战

    R计算方差膨胀因子(VIF,Variance Inflation Factor)计算并解读VID与共线性(Multicollinearity)的关系实战 目录

  4. 特征选择过滤法-方差过滤、F检验、互信息法

    过滤法 过滤法通常用作预处理步骤,特征选择完全独立于任何机器学习算法.它是根据各种统计检验分数和相关性指标来选择特征.         全部特征--->最佳特征子集--->算法---> ...

  5. sklearn.feature_selection.VarianceThreshold 方差过滤踩过的坑

    报错信息: Input contains NaN, infinity or a value too large for dtype('float64'). Input X must be non-ne ...

  6. 数据预处理之方差过滤

    数据预处理之方差过滤 在机器学习的数据预处理的过程中常常会是使用到过滤法,而方差过滤是过滤法之一.所谓的方差过滤就是过滤掉那些特征方差较小的特征.比如一个特征本身的方差很小,就表示样本在这个特征上基本 ...

  7. 特征选择/筛选方法总结

    作者:jliang https://blog.csdn.net/jliang3 1.特征选择介绍 1)特征分类 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果: 无关特征:对于我 ...

  8. 数据挖掘:特征工程——特征提取与选择

    数据挖掘:特征工程--特征提取与选择 特征的处理和构建已经在上一篇特征处理和构建文章中有所总结.接来下对特征提取和选择进行说明. 注:特征提取的范围很大,一般理解的话,它提取的对象是原始数据,目的就是 ...

  9. 机器学习 基础理论 学习笔记 (8)特征选择(feature selection)(一)

    0.说明 本文也许比较乱,请看目录再食用. 后续会 出文 机器学习 基础理论 学习笔记 (8)特征选择(feature selection)(二) 将 分类问题 和 回归问题 分开总结. 以及或将出文 ...

最新文章

  1. 阿里巴巴达摩院ICLR 2020论文:从群体动态中认知个体
  2. Linux 网络 IO 模型
  3. 利用visio在软件开发中各种图
  4. linux卸载模块驱动程序,Linux设备驱动程序 之 装载和卸载模块
  5. 华为云推UGO:一手抓结构迁移,一手抓SQL转换
  6. pyqt5 qscrollarea到达_PyQt5如何用QPainter在QScrollArea上画线?
  7. 附录-系统环境、系统属性
  8. 让ubuntu使用root帐号并让winscp以root身份登录
  9. python 小程序搜索排名-用python2.7.9 写个小程序搜索某个目录下行有某关键字
  10. SAP NOTE远程下载及电子证书配置
  11. txt转excel的工具
  12. android贪吃蛇设计报告,基于android的贪吃蛇游戏设计与开发
  13. python 代码检查工具
  14. CentOS7镜像安装与下载
  15. 计算机房等电位接地规范,一个实例全面讲解机房如何做防雷接地?
  16. 计算机管理下的打印机参数设置,提高办公效率 11种方法设置打印参数
  17. 0基础能不能转行做网络安全?网络安全人才发展路线
  18. 【YOLOV5-5.x 源码解读】common.py
  19. linux中mtd是什么目录,Linux mtd system
  20. Google Play 应用上架(二)

热门文章

  1. 怎么样用 Python 实现读写锁
  2. Linux基础命令---zip
  3. 爬虫普及,Web安全更需注意
  4. 《C语言课程设计》一3.1 文件复制
  5. k8s项目(弹性云实战)
  6. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!
  7. 单日2000W+订单,如何忙中不错?美团外卖业务异常检测实践详解
  8. 技术生涯二三事(上)
  9. Redis 分布式缓存 Java 框架
  10. docker运行prometheus