随机森林(RF),Bagging思想

2019-11-20 22:35:42 浏览数 (1)

目录

  • 1.什么是随机森林
    • 1.1 Bagging思想
    • 1.2 随机森林
  • 2. 随机森林分类效果的影响因素
  • 3. 随机森林有什么优缺点
  • 4. 随机森林如何处理缺失值?
  • 5. 什么是OOB?随机森林中OOB是如何计算的,它有什么优缺点?
  • 6. 随机森林的过拟合问题
  • 7. 代码实现

视频讲解

机器学习实战-集成算法和随机森林

1.什么是随机森林

1.1 Bagging思想

Bagging是bootstrap aggregating。思想就是从总体样本当中随机取一部分样本进行训练,通过多次这样的结果,进行投票获取平均值作为结果输出,这就极大可能的避免了不好的样本数据,从而提高准确度。因为有些是不好的样本,相当于噪声,模型学入噪声后会使准确度不高。

举个例子:

假设有1000个样本,如果按照以前的思维,是直接把这1000个样本拿来训练,但现在不一样,先抽取800个样本来进行训练,假如噪声点是这800个样本以外的样本点,就很有效的避开了。重复以上操作,提高模型输出的平均值。

1.2 随机森林

Random Forest(随机森林)是一种基于树模型的Bagging的优化版本,一棵树的生成肯定还是不如多棵树,因此就有了随机森林,解决决策树泛化能力弱的特点。(可以理解成三个臭皮匠顶过诸葛亮)

而同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3C4.5CARTSVMLOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。

每棵树的按照如下规则生成:

  1. 如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本,作为该树的训练集;
  2. 如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;
  3. 每棵树都尽最大程度的生长,并且没有剪枝过程。

一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。

总的来说就是随机选择样本数,随机选取特征,随机选择分类器,建立多颗这样的决策树,然后通过这几课决策树来投票,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)

如何构建一棵树

假设共有个样本,M个特征。 这里我们讲“随机”的含义。对于每棵树都有放回的随机抽取训练样本,这里抽取随机抽取的样本作为训练集,再有放回的随机选取个特征作为这棵树的分枝的依据,这里要注意。这就是“随机”两层含义,一个是随机选取样本,一个是随机选取特征。这样就构建出了一棵树,需要注意的是这里生成的树都是完全生长的树(关于为什么是要完全生长的树,我认为的原因是便于计算每个特征的重要程度,剪枝的话将无法进行计算,一棵树的构建方式如下图所示:

按照这种方法,可以构建出很多棵树,那么这么多棵树综合评判的结果可以作为最后的结果吗?

当然不是的,随机森林真正厉害的地方不在于它通过多棵树进行综合得出最终结果,而是在于通过迭代使得森林中的树不断变得优秀(森林中的树选用更好的特征进行分枝)。上面的一个森林相当于第一次迭代得到的森林。那么随机森林是怎么往后迭代的呢?

如何选出优秀的特征

随机森林的思想是构建出优秀的树,优秀的树需要优秀的特征。那我们需要知道各个特征的重要程度。 对于每一棵树都有个特征,要知道某个特征在这个树中是否起到了作用,可以随机改变这个特征的值,使得“这棵树中有没有这个特征都无所谓”,之后比较改变前后的测试集误差率,误差率的差距作为该特征在该树中的重要程度,测试集即为该树抽取样本之后剩余的样本(袋外样本)(由袋外样本做测试集造成的误差称为袋外误差)。 在一棵树中对于个特征都计算一次,就可以算法个特征在该树中的重要程度。我们可以计算出所有树中的特征在各自树中的重要程度。但这只能代表这些特征在树中的重要程度不能代表特征在整个森林中的重要程度。那我们怎么计算各特征在森林中的重要程度呢?每个特征在多棵数中出现,取这个特征值在多棵树中的重要程度的均值即为该特征在森林中的重要程度。如下式:

这样就得到了所有特征在森林中的重要程度。将所有的特征按照重要程度排序,去除森林中重要程度低的部分特征,得到新的特征集。这时相当于我们回到了原点,这算是真正意义上完成了一次迭代。

如何选出最优秀的森林

按照上面的步骤迭代多次,逐步去除相对较差的特征,每次都会生成新的森林,直到剩余的特征数为为止。最后再从所有迭代的森林中选出最好的森林。迭代的过程如下图所示:

得到了每次迭代出的森林之后,我们需要选择出最优秀的森林(随机森林毕竟是集成学习,所以最后的森林不一定是最优的。

那么我们怎么比较这些森林的好坏呢?这时我们需要引入一个指标来评价一个森林的好坏,上面的用于评价套外样本在树中的误差率,这里的评价套外样本在森林中的误差率。(因为都是利用套外样本,所以名字都是(out-of-bag)) 每个样本在多棵树中是套外样本,通过多棵树的预测这个样本的结果。预测方式如下图所示:

预测出所有所有样本的结果之后与真实值进行比较,就可以得到这个森林的套外误差率。

选择套外误差率最小的森林作为最终的随机森林模型。

2. 随机森林分类效果的影响因素

  • 森林中任意两棵树的相关性:相关性越大,错误率越大;
  • 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。

减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

3. 随机森林有什么优缺点

优点:

  • 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好。
  • 它能够处理很高维度(feature很多)的数据,并且不用做特征选择(因为特征子集是随机选择的)。
  • 在训练完后,它能够给出哪些feature比较重要。
  • 训练速度快,容易做成并行化方法(训练时树与树之间是相互独立的)。
  • 在训练过程中,能够检测到feature间的互相影响。
  • 对于不平衡的数据集来说,它可以平衡误差。
  • 如果有很大一部分的特征遗失,仍可以维持准确度。

缺点:

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  • 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

4. 随机森林如何处理缺失值?

根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的。

  • 首先,给缺失值预设一些估计值,比如数值型特征,选择其余数据的中位数或众数作为当前的估计值
  • 然后,根据估计的数值,建立随机森林,把所有的数据放进随机森林里面跑一遍。记录每一组数据在决策树中一步一步分类的路径.
  • 判断哪组数据和缺失数据路径最相似,引入一个相似度矩阵,来记录数据之间的相似度,比如有N组数据,相似度矩阵大小就是N*N
  • 如果缺失值是类别变量,通过权重投票得到新估计值,如果是数值型变量,通过加权平均得到新的估计值,如此迭代,直到得到稳定的估计值。

其实,该缺失值填补过程类似于推荐系统中采用协同过滤进行评分预测,先计算缺失特征与其他特征的相似度,再加权得到缺失值的估计,而随机森林中计算相似度的方法(数据在决策树中一步一步分类的路径)乃其独特之处。

5. 什么是OOB?随机森林中OOB是如何计算的,它有什么优缺点?

OOB:

上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。

bagging方法中Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据oob(out of bag),它可以用于取代测试集误差估计方法。

袋外数据(oob)误差的计算方法如下:

  • 对于已经生成的随机森林,用袋外数据测试其性能,假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类
  • 因为这O条数据的类型是已知的,则用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小=X/O

优缺点:

这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

6. 随机森林的过拟合问题

  1. 你已经建了一个有10000棵树的随机森林模型。在得到0.00的训练误差后,你非常高兴。但是,验证错误是34.23。到底是怎么回事?你还没有训练好你的模型吗? 答:该模型过度拟合,因此,为了避免这些情况,我们要用交叉验证来调整树的数量。

7. 代码实现

0 人点赞