林轩田之机器学习课程笔记( combining predictive features之 random forest)(32之26)

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen
对于模型融合可以参考:
http://scikit-learn.org/stable/modules/ensemble.html
随机森林参考:
分类:
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier
回归:
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor
题目可能不全,因为有字数限制,不好意思,可以参考:
https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/

概要

上节讲到了决策树模型,随机森林是个什么鬼东西呢,当然是很多树啦。决策时是一种stacking 模型,同时我们还学习了bagging算法,通过放回抽样达到模型的差异性。本节要讲的是将两种算法合并起来。

随机森

我们首先来看看bagging和决策树两种算法。
对于bagging,是同归拔靴法进得到不同样本,然后得到不同模型,最后将模型融合起来。而决策时是一种将模型堆叠起来的方式,核心在于如何切分数据,每条路径都可以看做一个非线性的函数。
两者对比如下:

这里写图片描述
bagging最后通过多个模型投票方式,减少方差。而决策树模型当不断的进行切分的过程中,数据不一样切分方式也不一样,数据量越来越少,会造成过拟合,特别是当一个完全的生成树的时候,这样会导致方差越来越大。

所以能不能将两种方法结合,这就是随机森林。
随机森林=bagging+完全生成的cart树
其过程如下:
1)通过拔靴法抽出一堆的数据集
2)在这些数据集中生成cart树
3)将生成的cart树通过投票机制融合成最后的模型

这样的算法有如下的特点:
1)这样的算法便于平行化处理,而决策树又比较有效率,所以两者结合速度蛮快。不过单机上的话还是很慢的,个人测试过,特别是调参的时候,半天出不来啊。
2)继承了cart树的优点,可以处理数值以及类别型变量
3)继承了bagging的优点,降低方差。

在随机森林中,为了得到不一样的模型,采用了以下办法:
1)拔靴法抽取样本,每次抽取样本只是原始样本的一个子集。
2)随机抽取特征的子集来构造一个树。
3)1和2组成数据的子空间,相当于采用了自然的坐标进行投影。这里还可以通过矩阵变换,投影到另外的子空间,不一定采用自然投影
4)在生成cart树的时候,每次进行切割的时候,都可以将数据随机的投影道另外的空间,然后进行切割。

这种低维度的投影方式相当于不仅是垂直或者水平切割,还有斜线切割。

袋外估计

首先我们看看在随机森林中的样本抽取:
这里写图片描述
在每次进行随机抽取样本的时候,总有部分样本是没用被抽取的。假设经过N轮抽取,其中一笔资料始终不曾被抽取的概率是:

(11N)N=1(NN1)N=1(1+1N1)N1e

当数据量足够大的时候。所以其中任意一笔资料经过N次抽取,不被抽取到的概率是 1e 。这样就有大约 13 的数据不曾被抽取到。
那么这些资料也不能被浪费了哇,对比下验证的过程。
这里写图片描述
所以我们可以将没有抽取到的数据拿去做验证。当然可以去验证每一个树,做剪枝处理等,但是最后的目的是要得到融合得到的模型,所以我们想直接对融合之后的模型进行验证。
我们可以这么做。
对任意一笔资料,我们都可以用没有选取该笔资料的基本模型拿去做验证。比如对于 (xn,yn) 这样一笔资料,只有 g1 有选取。那么就可以:
Gn=avg(g1,g3,gT)

最后由于每笔资料基本都可以拿去做验证,所以这相当于是留一法:
Eoob(G)=1Nn=1Nerr(yn,Gn(xn))

这就袋外估计,可以用这个值来进行超参数的选择,不用再次进行训练。
对比下以前的处理和随机森林的情况:
这里写图片描述

特征选择

首先说说为什么要做特征选择,比如有冗余的特征,既有生日又有年龄,有的特征是无用的,比如预测一个人得病的概率和是否有保险应该是没有什么关系的。当特征维度很多,训练或者测试都非常耗时的时候,可能需要选择特征。当数量不是太大,而维度又很多的时候,这个时候就会采用复杂的模型,容易造成过拟合,这样也是需要进行特征选。

比如有N个特征,到底该选择哪些特征呢?比如选择M个特征,如果做特征组合,就是有: CMN 个组合。这个貌似是不太可能的啊。

那么我们可不可以给每个特征一个重要度,根据这个重要度进行排序,然后挑选重要的特征就好了?
比如看看线性模型:

score=n=1Nwnxn

这里我们就可以根据特征前面的系数来判断模型的重要度 |wn|

在随机森林里面呢,通过另外的方法来实现。
基本思想:如果一个特征很重要,那么在往一个模型中填充一些该特征的噪音,一定会导致该模型变差。

那么如何填充这些噪音呢
1)比如采用平均分布或者高斯分布,但是这样就是预先假设了该特征应该服从这样的分布,可能不是很好。
2)借鉴从拔靴法的思想,每次都从样本中随机抽取,这样抽取出来的数据分布大致还是没有改变的。
在随机森林里面采用置换校验的方式。
比如给了一堆资料,我们将该资料的其中一个特征的值提取出来,然后做随机,最后放回原始资料。就像在做病人的预测的时候,将A病人的资料填入到B病人的资料。这就是置换校验。
这样特征的重要度就可以根据置换前和置换后的差异来做分析。如下;
这里写图片描述
但是如果仅仅只是用置换校验的话,会导致需要不断的重复训练,进行验证,然后查看性能差异。
在随机森林里面呢,做了一些trick。
1)这里一方面需要进行验证
2)数据需要重新训练。
这两个问题,对于验证,在随机森林里面可以采用OOB的资料,因为上面我们已经证明,总是有资料没有被抽取到。
对于数据需要重新训练,这里又采用另外的投机的方式。还是用原来的模型,还是拿去OOB中去验证,只是在验证的时候,将计算好的值进行打乱。

importance(i)=Eoob(G)Eoob(Gp)importance(i)=Eoob(G)Epoob(G)

Epoob(G) 是在模型G在树模型进行特征划分的时候,将特征值进行打乱。
随机森林特征重要度:置换校验+oob

这个用的还是挺广泛的,可以参考:
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
这里写图片描述

不过很多人也喜欢用Xgboost来查看重要度。

随机森林实战

这里看看随机森林在实际中的表现,如下图:
这里写图片描述
随着随机森林的树越来越多,发现分割线逐渐的分布在两类数据的中间,类似于SVM的最大分割边界。
即使在数据中添加了部分的噪音:
这里写图片描述
即使添加了噪音,也表现不错。

随机森林的树木,当然是越多越好。到底多大呢?在于我们的模型足够的平滑。
比如台湾大学在2013年的kddcup获得第一名,采用了12000棵树。

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值