写在前面:健忘星人自学笔记,仅供参考。

另外,感谢大神的博客,受益良多。

Bagging与随机森林演算法原理小结 - 刘建平Pinard - 博客园?

www.cnblogs.com
图标

正文:

前面我们用了三章篇幅详细介绍决策树原理,结束的同时也留下了一些遗憾。寻找最优的决策树是一个NP难的问题,容易陷入局部最优;另外,样本的一点点改动,容易引起决策树结构的剧烈变动,等等。

这时候我们会想,如果单独用一棵树会出现偏差,如果能把很多棵树结合起来呢?

打个形象的比喻:森林中召开会议,讨论某个动物到底是老鼠还是松鼠?

每棵树都要独立地发表自己对这个问题的看法,也就是每棵树都要投票。该动物到底是老鼠还是松鼠,要依据投票情况来确定,获得票数最多的类别就是森林的分类结果。

以上就是「集成学习演算法 * 随机森林「的主要思想。

在更深入学习之前,我们先了解一下「集成学习」的思想:

一、集成学习

集成学习,就是组合多个弱监督模型以期得到一个强监督模型。潜在的思想是,即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。

将多个模型组合起来的集成学习,自然会面对的2个问题是:

 1)怎么训练每个演算法?

 2)怎么融合多个演算法?

1、模型训练

1.1 Bagging

Bagging,Bootstrapped Aggregation的简称。Bootstrap是一种有放回的重复抽样方法,抽样策略就是简单的随机抽样。

另外,Bagging 各个学习器之间没有依赖关系,可以并行生成,在如今大数据大样本的的时代很有诱惑力。

【bootstrap】自助法重采样技术,从训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。

随机森林是bagging的一个「特化进阶"版。

所谓的「特化「是因为随机森林的弱学习器都是决策树。所谓的「进阶「是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。

1.2 Boosting

Boosting 各个学习器之间是串连的关系,每一轮的训练集不变,改变的是样本的权重。

(1)首先从训练集用初始权重训练出一个弱学习器1;

(2)根据学习误差率来更新训练样本的权重误差率高的训练样本赋予更高的权重,这样误差率高的点在后面的弱学习器2中就会得到更多的重视;

(3)然后基于调整权重后的训练集来训练弱学习器2;

……

如此重复进行迭代训练

2. 模型融合

不论采用 Boosting 还是 Bagging,我们都得到了若干个弱学习器,如何将预测结果融合是一下步重点解决的问题。

(1)数值预测问题,可以采用平均值法,包括简单平均,加权平均等。

(2)分类预测问题,一般采用投票法,简单的方法就是「少数服从多数」。复杂一点要求「超过半数」,否则拒绝预测。更加复杂的,要求「加权投票」

(3)Stacking——将弱学习器(初级学习器)的预测结果作为输入,再套上一个模型(次级学习器)预测一次,最终得到输出

以上就是集成学习的核心内容,我们将之前的描述上升华一下:

集成学习的核心内容:

(1)如何构建具有差异性的分类器;(2)如何对这些分类器的结果进行整合。

二、随机森林,Random Forest

决策树和集合学习颇有渊源,将决策树与上面提到的集成学习演算法框架进行结合所得到的新的演算法:

1)Bagging + 决策树 = 随机森林

2)AdaBoost + 决策树 = 提升树

3)Gradient Boosting + 决策树 = GBDT

今天我们主要学习的内容,就是「随机森林「。

2.1 随机森林核心

随机森林,Random Forest 是 Bagging 的一种特化进阶版。

首先,在 Random Forest【森林】里弱学习器全部由CART决策树构成。各个决策树之间没有依赖关系,并列运行。

其次,Random Forest 的 【随机】体现在两个方面:

(1) 随机特征

每棵树训练用的特征不是全部特征,而是随机从M个总特征中选出的m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

选变数个数(m)是决策树的重要参数,对系统的调优非常关键。

如果m=M,M表示全部特征数量,则此时RF的CART决策树和普通的CART决策树没有区别。

m取值越小,则模型约健壮,当然此时对于训练集的拟合程度会变差。也就是说m越小,模型的方差会减小,但是偏倚会增大。在实际案例中,一般会通过交叉验证调参获取一个合适的m值。

(2) 随机数据

如果训练集大小为 N ,对于每棵树而言,随机且有放回地从训练集中的抽取 N 个训练样本,作为该树的训练集。

放回采样,必然导致一部分数据被选中,另外一部分数据没有选中,选中了就放到bag中,没有选中的就是out of bag(oob)。

按照 Random Forest 的采用方式,每个样本每次被采集到的概率为 frac{1}{N} ,不被采集到的概率为 1-frac{1}{N} ,m次采样都没有被采集中的概率是 (1-frac{1}{N})^{N}

当m→∞时, (1-frac{1}{N})^{N}simfrac{1}{e}simeq0.368

即,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样到。也就是说,对于每棵树而言(假设对于第k棵树),大约36.8%的训练实例没有参与第k棵树的生成,它们称为第k棵树的 oob 样本(袋外样本)。

由于袋外样本的存在,这些没有选中的数据不参与建模,所以可以作为验证数据,评估模型效果。因此,随机森林没有必要再进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计,可以用 oob error 替代。

oob error 计算步骤:

  1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);  2)然后以简单多数投票作为该样本的分类结果;  3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。

举例,

上图中,每行代表一个样本,每列代表一棵树,* 表示参与了模型训练。

观察到,Data 1 参加了 Tree 2,4,6 的训练,没有参加 Tree 1,3,5,7 的训练;

首先将 Data 1 投入没有参与训练的模型中,即 Tree 1,3,5,7 的树模型中,得到4个分类结果,按照简单多数投票,预测Data 1的分类;

在 Data 2,3,4 ,5重复上述过程,取得全部Data的预测分类;

将全部Data的预测分类和实际分类作比较,错误预测Data数 div Data总数,即全部样本的oob误分率。

【随机特征】和【随机数据】这两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对预设值不敏感)。

也正因为如此,随机森林相比CART决策树还有另外一个特点,那就是:通常情况下, 随机森林不需要剪枝。

回想一下,我们在学习决策树时剪枝的目的,是为了防止过度拟合。随机森林里面每棵树的产生通过选特征、选数据的随机性,已经考虑了避免过拟合。剩下的每棵树需要做的,就是尽可能的在自己所对应的数据(特征)集情况下做到最好的预测结果。

因此,随机森林中的每棵树都尽最大程度的生长,并没有剪枝过程。

2.2 影响性能因素

随机森林模型特别让人稀罕的一点,就是基本不需要调参。

但我们仍需要了解影响模型性能的因素,方便我们应对实际情况中难以预测的问题。

影响随机森林性能的因素包括:

(1)森林面积越越大,分类效果越好;(2)森林中的每棵树越茂盛,分类效果就越好;(3)森林中任意两棵树的相关性越大,错误率越大;

对应需要调整的参数有:

(1) 决策树的个数 n_estimators

(2) 递归次数(即决策树的深度)max_depth

(3) 特征属性的个数 max_features

—— n_estimators,因为有随机因素,n_estimators越多结果越稳定,所以只要允许内,决策树的数目越大越好。通常随著树的数量的增加,test error 会逐渐减小,当达到足够大的时候,test error的变化变得很小,这时候就可以确定较为合理的树的数量。

—— max_depth,一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。深度越小,计算量越小,速度越快。常用的可以取值10-100之间。

—— max_features,减小max_features不仅会提升演算法速度,也有可能降低测试误差;通常使用的值可以是全部特征值M的开方,或者取对数,即 sqrt{M} 或者 log_{2}M ;或者,逐一尝试max_features的值,直到找到比较理想的数。

2.3 特征重要性

基于树的集成演算法还有一个很好的特性,就是模型训练结束后可以输出模型所使用的特征的相对重要度,便于我们选择特征,理解哪些因素是对预测有关键影响。

在随机森林中,简单来说,当某一特征在所有树中离树根的平均距离越近,这一特征在给定的分类或回归问题中就越重要。

一般有两种计算特征重要性的方法:基于基尼系数、基于oob 袋外数据

(1)基于基尼系数

随机森林中每棵树都是CART决策树,因此树在选择向下分裂的特征时,都是基于基尼系数。

假设某特征的在某一棵树上的节点m向下分裂,

分裂前的基尼系数为 GI ,分裂后,左右分支的基尼系数分别为 GIL 、GIR

则,VIm = GI - (GIL+GIR)

假设在这棵数上,该特征分裂了k次,则在这棵树上的重要性为 sum_{i=1}^{k}{VIm}

假设随机森林中,共有n棵数用到该特征,则整个森林中整个特征的重要性为 sum_{i=1}^{n}sum_{i=1}^{k}{VIm}

最后把所有求得的M个特征重要性评分进行归一化处理就得到重要性的评分:

frac{单特征重要性}{所有特征重要性之和}

(2)基于袋外数据

1:对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.

2: 随机地对袋外数据OOB所有样本的特征X加入杂讯干扰,再次计算它的袋外数据误差,记为errOOB2.3:假设随机森林中有N棵树,那么对于特征X的重要性=∑(errOOB2-errOOB1)/N

之所以可以用这个表达式来作为相应特征的重要性的度量值是因为:若给某个特征随机加入杂讯之后,袋外的准确率大幅度降低,则说明这个特征对于样本的分类结果影响很大,也就是说它的重要程度比较高。

而该方法中涉及到的对数据增加噪音或者进行打乱的方法通常有两种:

1)是使用uniform或者gaussian抽取随机值替换原特征;2)是通过permutation的方式将原来的所有N个样本的第 i 个特征值重新打乱分布(相当于重新洗牌)。

一般来说,第二种方法使用得更多。

2.4 随机森林优缺点

优点:

(1)可以高度并行化运算,大样本运算有速度优势

(2)由于采用了随机采样,泛化能力强,对缺失值不敏感

(3)训练后可以输出特征重要性

(4)调参较为简单

缺点:

(1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。

(2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

今天就学习到这里,感谢观看~~

后面预计继续学习决策树+集成学习组合的模型,再加上实践的内容


推荐阅读:
相关文章