特征选择的几种方法[通俗易懂]

目录1过滤法(Filter)1.1方差选择法1.2相关系数法1.3卡方检验1.4互信息法1.5relief算法2包裹法(Wrapper)2.1递归特征消除法2.2特征干扰法3嵌入法(Embedded)3.1基于惩罚项的特征选择法3.2基于树模型的特征选择法4特征选择方法的优…

大家好,又见面了,我是你们的朋友全栈君。

目录

1、 过滤法(Filter)

1.1 方差选择法

1.2 相关系数法

1.3 卡方检验

1.4 互信息法

1.5 relief算法

2、包裹法(Wrapper)

2.1 递归特征消除法

2.2 特征干扰法

3、嵌入法(Embedded)

3.1 基于惩罚项的特征选择法

3.2 基于树模型的特征选择法

4、机器学习中的特征选择和优缺点


1、 过滤法(Filter)

1.1 方差选择法

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

from sklearn.feature_selection import VarianceThreshold

#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)

1.2 相关系数法

  使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr

#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

1.3 卡方检验

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

特征选择的几种方法[通俗易懂]

  不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

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

1.4 互信息法

  经典的互信息也是评价定性自变量对定性因变量的相关性的(例如决策树ID3算法),互信息计算公式如下:

特征选择的几种方法[通俗易懂]

  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:

 from sklearn.feature_selection import SelectKBest
 from minepy import MINE
 
 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
 def mic(x, y):
     m = MINE()
     m.compute_score(x, y)
     return (m.mic(), 0.5)

#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

1.5 relief算法

      Relief算法最早由Kira提出. 基本内容:从训练集D中随机选择一个样本R, 然后从和R同类的样本中寻找k最近邻样本H,从和R不同类的样本中寻找k最近邻样本M, 最后按照公式更新特征权重.

        特征选择的几种方法[通俗易懂]

Relief算法python实现:https://blog.csdn.net/qq_40871363/article/details/86511843 

2、包裹法(Wrapper)

2.1 递归特征消除法

  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用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)

2.2 特征干扰法

特征选择原理:用加上噪声的特征和原特征下的误差对比来评价特征重要性,误差越大,说明特征越重要。以随机森林为例:

  1. 对随机森林中的每一颗决策树,用OOB(袋外数据)计算误差errOOB1;
  2. 对OOB所有样本特征X加上噪声干扰,再次计算误差errOOB2;
  3. N棵树,特征X的重要性=\frac{\sum (errOOB1-errOOB2)}{N}
  4. 若某个特征加上噪声后,袋外的准确率大幅度降低,说明此特征对于样本的分类结果影响很大,即重要程度越高。

sklearn中会对每个特征赋予一个分数,分数越大,特征越重要,因此,可以根据特征重要性排序,然后选择最佳特征组合;

RandomForestClassifier(n_estimators=200,oob_score=True)

oob_score : bool (default=False) Whether to use out-of-bag samples to estimate the generalization accuracy.

oob_score:  bool(默认=False) 是否使用袋外样品进行估算 泛化精度。

3、嵌入法(Embedded)

嵌入特征选择方法和算法本身紧密结合,在模型训练过程中完成特征选择。例如,

决策树算法每次都选择分类能力最强的特征;

线性回归+L2正则化:某些信号比较弱的特征权重减小;

线性回归+L1正则化:某些信号比较弱的特征权重为0;

弹性网络:L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。

3.1 基于惩罚项的特征选择法

  使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

3.2 基于树模型的特征选择法

  树模型中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)

4、机器学习中的特征选择和优缺点

参考:https://blog.csdn.net/piaodexin/article/details/77203696

——————————————————————

参考:

https://www.cnblogs.com/bonelee/p/8632866.html 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126695.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言 数组倒序输出数字「建议收藏」

    C语言 数组倒序输出数字「建议收藏」引用一维数组元素对10个数组元素依次赋值为1,2,3,4,5,6,7,8,9,10要求按逆序输出#include<stdio.h>intmain(){ inti,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=10;i>0;i–) printf(“%d\n”,i); return0;}小剧场:不能随波逐流。Don’tgowiththeflow….

    2022年7月22日
    12
  • (Java实现) N皇后问题[通俗易懂]

    (Java实现) N皇后问题[通俗易懂]n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行、纵行或斜线上。蛮力法思想:解决n皇后问题的思想本质上就是蛮力法,生成所有可能的摆放情况,并判断该情况是否满足要求,我们以树结构来表示解决问题的方法。以4*4的棋盘为例,第0层的根节点为空白的棋盘,第1层为只在棋盘的第一行摆放的四种…

    2022年9月30日
    3
  • 2014年度工作总结

    2014年度工作总结虽然还有一段时间真正的变成中国人的2015年了,回首这2年的工作,时间一晃真的很快。转眼间到鼎峰已经2年了,这是我人生中弥足珍贵的一段经历。感谢,感恩鼎峰的每一个人,因为有你们我才能快速的成长积累,这2年有硕果累累的喜悦,有工作当中的艰辛,也有遇到困难和挫折时的惆怅。在项目可开发和处理问题的过程中,难题一个接一个的出现,自信心不止一次的受到过打击,虽然自己早就知道,要做到符合公司的要求,做一名合格

    2022年7月26日
    7
  • MySQL 数据库备份(完全备份与恢复)

    MySQL 数据库备份(完全备份与恢复)前言随着办公自动化和电子商务的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的核心,担当者重要的角色数据库备份,是在数据丢失的情况下,能及时恢复重要数据,防止数据丢失的一种重要手段一个合理的数据库备份方案,能够在数据丢失时,有有效地恢复数据,而且也需要考虑技术实现难度和有效地利用资源一、MySQL完全备份1.数据库备份方式精讲1.1数据库备份的重要性生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果数据库备份的重要性主要体现在:提高系

    2022年5月14日
    30
  • scanf的常见用法

    scanf的常见用法

    2021年9月27日
    77
  • 详解银行家算法「建议收藏」

    详解银行家算法「建议收藏」简述:银行家算法是一种可以避免死锁的方法就是以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源就相当于用户向银行家贷款。实现方法:为保证资金的安全,银行家规定:(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(即当资源池中剩余的可利用资源>=线…

    2022年7月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号