十一城

跬步千里,小流江海。

Home Linux ML Python Java Thoughts KmKg BookCan Links About

2018-03-15
机器学习-决策树-随机森林

• 分类: ml • 标签:

随机森林 2009

随机森林,顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

在建立每一棵决策树的过程中,有两点需要注意:采样与完全分裂。

首先是两个随机采样的过程,random forest对输入的数据要进行“行”、“列”的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都有一个重要的步骤 ——剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。

按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。

样本抽样是针对单棵决策树的,特征抽样是针对单棵决策树上的节点的。

优点与缺点

决策树的优点

  • 不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作
  • 容易理解和解释,树可以被可视化
  • 能够处理feature很多的数据,并且不用做特征选择
  • 隐含地创造了多个联合特征,并能够解决非线性问题,在训练过程中,能够检测到feature间的互相影响
  • 在训练完后,它能够给出哪些feature比较重要

随机森林的优点:

  1. 泛化能力较强,和决策树模型,GBDT模型相比,随机森林模型不容易过拟合
  2. 自带out-of-bag (oob)错误评估功能
  3. 易于并行化
  4. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择
  5. 在创建随机森林的时候,对generlization error使用的是无偏估计
  6. 模型简单,易于实现
  7. 计算开销小,训练速度快

随机森林的缺点:

  1. 不适合小样本,只适合大样本
  2. 大多数情况下,RF模型的精度略低于GBDT模型
  3. 适合决策边界是矩形的,不适合对角线型的

随机森林与GBDT

GBDT和随机森林的相同点:

  1. 都是由多棵树组成
  2. 最终的结果都是由多棵树一起决定

GBDT和随机森林的不同点:

  1. 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
  2. 组成随机森林的树可以并行生成;而GBDT只能是串行生成
  3. 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
  4. 随机森林对异常值不敏感,GBDT对异常值非常敏感
  5. 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
  6. 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

参考

  1. Lior Rokach的《Data Mining with Decision Trees: Theory and Application》
  2. Microsoft Research的Decision Forests for Classification, Regression, Density Estimation, Manifold Learning, and Semi-Supervised Learning
  3. Random Forests

dzzxjl

Home Linux ML Python Java Thoughts KmKg BookCan Links About