特征选择-随机森林可以衡量特征的重要程度

参考:
http://www.17bigdata.com/%e9%9a%8f%e6%9c%ba%e6%a3%ae%e6%9e%97%e8%bf%9b%e8%a1%8c%e7%89%b9%e5%be%81%e9%87%8d%e8%a6%81%e6%80%a7%e5%ba%a6%e9%87%8f%e7%9a%84%e8%af%a6%e7%bb%86%e8%af%b4%e6%98%8e/

https://www.baidu.com/link?url=boyy4MZW0bk2sByOVZr5tdekS_dnr-Q9lIMZtY6NFnTbguWVH43Pbk-b7-XscMvT&wd=&eqid=d0496b7b0006c658000000035daee8c9

https://www.baidu.com/link?url=V3XjRzifgSVzhRmUVntzCkojPjSz_zdedSb0GrWjpPIbP2GMjyHvfhDhQjBeqo2ifJNjpDtZ9j1nAiaQLusyba&wd=&eqid=d0496b7b0006c658000000035daee8c9

https://www.baidu.com/link?url=UrPCCgEZXSL_swkam5Hq3id-X4HOK3ZJ0Gi3fULTL1WDp9bS3F3KvulAvn0cryRtY5xbYwUy_cBC15NUrZ5UODVmmOZgQ7UAaA2EPVx8KYO&wd=&eqid=d0496b7b0006c658000000035daee8c9

https://www.baidu.com/link?url=HHOCABNztkHxNFOggE0DcgGdbZWKF6Z3kfhs69P65Q7KmZt7lhtxfhceZFBNYU0qxVqhamASwSFLPSE5GRC6kRvXD2kwRqVzQ0VhG_6yeIq&wd=&eqid=d0496b7b0006c658000000035daee8c9
https://www.jianshu.com/p/591523125637

https://www.baidu.com/link?url=aYtsrAatdiNrBNM3kVY5GJ6z4CNkphKZz5rE2aY8-p1wmK8nKonqU9s8LNC7OoNohmuYUFGCMASvnHk6C8iB3oLXCke7oY9TuAhhO8U-C3e&wd=&eqid=8073226c000ee337000000035daee733

https://www.baidu.com/link?url=fvGSBq5NeKyy7mgnEN4MdmJBkO0bMl7mtZQ8xkcBNWqwSKjeWmbdi-P0DjXYNgGOtn3wwDg_RYXursHa8kp5U4ewIttTIlGPRlClxCuePEK&wd=&eqid=8073226c000ee337000000035daee733

https://www.cnblogs.com/tan2810/p/10594710.html

https://www.cnblogs.com/yszd/p/9583420.html

https://blog.csdn.net/weixin_40848065/article/details/87825538

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。

特征选择:区别于特征抽取,通过选择原始特征数据的子集,以提高后面分类器的性能,或者加深整体上对问题的理解(某特征或者某属性对输出变量的影响)
选择特征的过程,就是评估特征的过程,哪一个特征对输出变量的影响大,就选择哪一个;这个时候就涉及到各种评价指标,那么选取不同的,有些论文也会涉及这种不同的评价指标来进行测试。

特征选择方法中,有一种方法是利用随机森林,进行特征的重要性度量,选择重要性较高的特征。下面对如何计算重要性进行说明。
1 特征重要性​度量 计算某个特征X的重要性时,具体步骤如下:
1)对每一颗决策树,选择相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1. 所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。 ​这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
​2)随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。 3)​假设森林中有N棵树,则特征X的重要性=∑(errOOB2-errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。

​2 特征选择 在特征重要性的基础上,特征选择的步骤如下:

1)计算每个特征的重要性,并按降序排序
2)确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
3)用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)。
4)根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集。​

step1 通过方差选择特征

最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。sklearn中的VarianceThreshold类可以很方便的完成这个工作。

step 2

第三个可以使用的是假设检验,比如卡方检验。卡方检验可以检验某个特征分布和输出值分布之间的相关性。个人觉得它比比粗暴的方差法好用。如果大家对卡方检验不熟悉,可以参看这篇卡方检验原理及应用,这里就不展开了。在sklearn中,可以使用chi2这个类来做卡方检验得到所有特征的卡方值与显著性水平P临界值,我们可以给定卡方值阈值, 选择卡方值较大的部分特征。     除了卡方检验,我们还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif和f_regression,分别在分类和回归特征选择时使用。   

  第四个是互信息,即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中我们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分类)和mutual_info_regression(回归)来计算各个输入特征和输出值之间的互信息。     '

以上就是过滤法的主要方法,个人经验是,在没有什么思路的 时候,可以优先使用卡方检验和互信息来做特征选择(摘自: https://www.baidu.com/link?url=V3XjRzifgSVzhRmUVntzCkojPjSz_zdedSb0GrWjpPIbP2GMjyHvfhDhQjBeqo2ifJNjpDtZ9j1nAiaQLusyba&wd=&eqid=d0496b7b0006c658000000035daee8c9)

2.3 嵌入法选择特征     

嵌入法也是用机器学习的方法来选择特征,但是它和RFE的区别是它不是通过不停的筛掉特征来进行训练,而是使用的都是特征全集。在sklearn中,使用SelectFromModel函数来选择特征。     

最常用的是使用L1正则化和L2正则化来选择特征。在之前讲到的用scikit-learn和pandas学习Ridge回归第6节中,我们讲到正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。     

此外也可以使用决策树或者GBDT。那么是不是所有的机器学习方法都可以作为嵌入法的基学习器呢?也不是,一般来说,可以得到特征系数coef或者可以得到特征重要度(feature importances)的算法才可以做为嵌入法的基学习器。‘

3.  寻找高级特征     
在我们拿到已有的特征后,我们还可以根据需要寻找到更多的高级特征。比如有车的路程特征和时间间隔特征,我们就可以得到车的平均速度这个二级特征。根据车的速度特征,我们就可以得到车的加速度这个三级特征,根据车的加速度特征,我们就可以得到车的加加速度这个四级特征。。。也就是说,高级特征可以一直寻找下去。     

在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面做文章。所以寻找高级特征是模型优化的必要步骤之一。当然,在第一次建立模型的时候,我们可以先不寻找高级特征,得到以后基准模型后,再寻找高级特征进行优化。     

寻找高级特征最常用的方法有:     

若干项特征加和: 我们假设你希望根据每日销售额得到一周销售额的特征。你可以将最近的7天的销售额相加得到。     

若干项特征之差: 假设你已经拥有每周销售额以及每月销售额两项特征,可以求一周前一月内的销售额。     

若干项特征乘积: 假设你有商品价格和商品销量的特征,那么就可以得到销售额的特征。     

若干项特征除商: 假设你有每个用户的销售额和购买的商品件数,那么就是得到该用户平均每件商品的销售额。
    
当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。个人经验是,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。’

https://www.baidu.com/link?url=UrPCCgEZXSL_swkam5Hq3id-X4HOK3ZJ0Gi3fULTL1WDp9bS3F3KvulAvn0cryRtY5xbYwUy_cBC15NUrZ5UODVmmOZgQ7UAaA2EPVx8KYO&wd=&eqid=d0496b7b0006c658000000035daee8c9

基于树的特征选择 (Tree-based feature selection) 基于树的预测模型(见 sklearn.tree 模块,森林见 sklearn.ensemble 模块)能够用来计算特征的重要程度,因此能用来去除不相关的特征(结合 sklearn.feature_selection.SelectFromModel):

决策树是各种机器学习任务的常用方法。 决策树是比较能满足于数据挖掘的方法,因为它在特征值的缩放和其他各种转换下保持不变,对无关特征是可靠的,而且能生成可被检查的模型。 然而,生长很深的树容易学习到高度不规则的模式,即过学习,在训练集上具有低偏差和高方差的特点。随机森林是平均多个深决策树以降低方差的一种方法,其中,决策树是在一个数据集上的不同部分进行训练的。这是以偏差的小幅增加和一些可解释性的丧失为代价的,但是在最终的模型中通常会大大提高性能。

简单来说,随机森林是一堆的决策树组成的,每一个决策树有一个结果,看有多少个决策树对同一个Y进行了投票我们就可以确定Y。分类就是少数服从多数,回归就是各个决策树去平均值。 随机森林是在机器学习里面是一个能达到非常非常好的分类回归结果的模型,大家经常看到的datacastle的那类的数据比赛,也是非常多使用随机森林的。我们直接拿随机森林进行分类或回归,一般也能得到比较好的结果。绝大多数情况下,随机森林都会比线性回归、logistic分类、K近邻、决策树要好。 在python的sklearn中,随机森林的实现是非常简单的。

简单实现:https://www.jianshu.com/p/591523125637

随机森林对特征重要性排序:https://blog.csdn.net/qq_15111861/article/details/80366787

python实现随机森林:https://www.baidu.com/link?url=fvGSBq5NeKyy7mgnEN4MdmJBkO0bMl7mtZQ8xkcBNWqwSKjeWmbdi-P0DjXYNgGOtn3wwDg_RYXursHa8kp5U4ewIttTIlGPRlClxCuePEK&wd=&eqid=8073226c000ee337000000035daee733

性能及优缺点
优点:
1.很多的数据集上表现良好;
2.能处理高维度数据,并且不用做特征选择;
3.训练完后,能够给出那些feature比较重要;
4.训练速度快,容易并行化计算。

缺点:
1.在噪音较大的分类或回归问题上会出现过拟合现象;
2.对于不同级别属性的数据,级别划分较多的属性会对随机森林有较大影响,则RF在这种数据上产出的数值是不可信的。

定义:

随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器。可回归可分类。 所以随机森林是基于多颗决策树的一种集成学习算法,常见的决策树算法主要有以下几种:

  1. ID3:使用信息增益g(D,A)进行特征选择
  2. C4.5:信息增益率 =g(D,A)/H(A)
  3. CART:基尼系数 一个特征的信息增益(或信息增益率,或基尼系数)越大,表明特征对样本的熵的减少能力更强,这个特征使得数据由不确定性到确定性的能力越强。

随机森林属于集成学习(Ensemble Learning)中的bagging算法。在集成学习中,主要分为bagging算法和boosting算法。我们先看看这两种方法的特点和区别。
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT

代码实现参考:
https://www.cnblogs.com/yszd/p/9583420.html
https://www.cnblogs.com/tan2810/p/10594710.html

猜你喜欢

转载自www.cnblogs.com/Ann21/p/11722339.html