【机器学习】集成学习ensemble之随机森林

Bootstrapping

Bootstrapping从字面意思翻译是拔靴法,从其内容翻译又叫自助法,是一种再抽样的统计方法。自助法的名称来源于英文短语“to pull oneself up by one’s bootstrap”,表示完成一件不能自然完成的事情。1977年美国Standford大学统计学教授Efron提出了一种新的增广样本的统计方法,就是Bootstrap方法,为解决小子样试验评估问题提供了很好的思路。

算法流程

  1. 从N个样本中有放回的随机抽取n个样本。
  2. 用n个样本计算统计量\theta_i
  3. 重复1,2步骤m次,得到统计量$ \theta_1,\theta_2,...,\theta_m $
  4. 计算统计量\theta序列的方差,则可得到统计量\theta方差的无偏估计。(均值也是,bootstrapping方法就是通过多次的随机采样得到可以代表母体样本分布的子样本分布)

Bagging策略(bootstrap aggregating)套袋法

  1. 从N个样本中有放回的随机抽取n个样本。
  2. 用这n个样本的所有属性构建基分类器(LR,ID3,C4.5,SVM)
  3. 重复1,2两步m次,构建m个基分类器
  4. 投票得出分类结果,哪个票最多就是哪一类。对回归模型,取多有基分类器结果的均值。总而言之就是所有基分类器的权重相同。

【机器学习】集成学习ensemble之随机森林_第1张图片

随机森林

bagging方法可以有效降低模型的方差。随机森林每棵子树不需要剪枝,是低偏差高方差的模型,通过bagging降低方差后使得整个模型有较高的性能。

随机森林其实很简单,就是在bagging策略上略微改动了一下。

  1. 从N个样本中有放回的随机抽样n个样本。
  2. 如果每个样本的特征维度为M,指定一个常数m<
  3. 每棵树都尽最大程度的生长,并且没有剪枝过程。
  4. 最后采用投票表决的方式进行分类。

特征m个数的选取:

用作分类时,m默认取\sqrt{M},最小取1.

用作回归时,m默认取M/3,最小取5.

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

随机森林分类效果(错误率)与两个因素有关:

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

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

OOB(Out Of Bag)袋外错误率

在bootstrapping的过程中,有些数据可能没有被选择,这些数据称为out-of-bag(OOB) examples。

【机器学习】集成学习ensemble之随机森林_第2张图片

解释一下上面这张图。一眼看还是挺难理解的,用白话讲一下。

1/N是什么?

随机森林中每一次样本抽样(不是特征抽样),就是bootstrapping方法,是有放回的随机抽样,所以每一次抽的时候,对于一个特定的样本(X_n,Y_n),抽到它的概率就是1/N,很好理解,N个样本里随机抽取一个,抽到的概率当然是1/N,因为是有放回的抽样,所以分母永远是N。

1/e是什么?

既然(X_n,Y_n)被抽到的概率是1/N,那不被抽到的概率就是1-1/N,很好理解。那指数大N又是什么呢?其实就是抽样的次数。假设我们的随机森林一共有A颗树,每棵树抽了B个样本,那么指数大N就是A*B,是不是感觉指数大N应该和分母的那个N一样?其实这里只是为了方便,它表达的意思就是抽了很多次。

搞明白了那个公式之后,就可以开始计算了。要用到数学分析中的极限知识。一步步推一下。

这是基本公式:\lim_{N\to\infty}{(1+\frac{1}{N})^{N}}=e 后面的都是基于这个变形

\lim_{N\to\infty}{(1-\frac{1}{N})^{N}} = \lim_{N\to\infty}{\frac{1}{(\frac{N}{N-1})^{N}}} = \frac{1}{\lim_{N\to\infty}{(1+\frac{1}{N-1})^{N}}}=\frac{1}{e}

这说明了什么呢?就是你随机森林已经造好了,但是即使你的训练集是整个样本集,其中也会有1/e的样本你抽不到。为什么抽不到,上面的公式就是告诉你为什么抽不到。这些抽不到的样本就叫做out-of-bag(OOB) examples

好了,到这里已经能搞懂什么是out-of-bag(OOB) examples了。那这些样本能用来做什么呢?下面就介绍oob袋外错误率。

袋外错误率的应用

正常情况下,我们训练一个模型,怎么验证它好不好。是不是要拿出一部分的数据集当作验证集,更好的还要拿出一部分当作测试集,一般是6:2:2。

在随机森林中,有了out-of-bag(OOB) examples,我们就不需要拿出一部分数据了,out-of-bag(OOB) examples就是那部分没有用到的数据,我们可以直接当成验证集来使用。

obb error = 被分类错误数 / 总数

随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

Breiman [1996b]在对 bagged 分类器的错误率估计研究中, 给出实证证据显示,out-of-bag 估计 和使用与训练集大小一致的测试集所得到的错误率一样精确. 所以, 使用out-of-bag error 估计可以不在另外建立一个测试集.

特征重要性度量

计算某个特征X的重要性时,具体步骤如下:

  1. 对整个随机森林,得到相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1.

    所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。

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

  2. 随机对袋外数据OOB所有样本的特征X加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB2。

  3. ​假设森林中有N棵树,则特征X的重要性=(∑errOOB2−errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。

特征选择

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

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

优点

  • 在数据集上表现良好
  • 在当前的很多数据集上,相对其他算法有着很大的优势
  • 它能够处理很高维度(feature很多)的数据,并且不用做特征选择
  • 在训练完后,它能够给出哪些feature比较重要
  • 在创建随机森林的时候,对generlization error使用的是无偏估计
  • 训练速度快
  • 在训练过程中,能够检测到feature间的互相影响
  • 容易做成并行化方法
  • 实现比较简单
  • 可以得到变量重要性排序(两种:基于OOB误分率的增加量和基于分裂时的GINI下降量

随机森林有许多优点:

  • 具有极高的准确率
  • 随机性的引入,使得随机森林不容易过拟合
  • 随机性的引入,使得随机森林有很好的抗噪声能力
  • 能处理很高维度的数据,并且不用做特征选择
  • 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
  • 训练速度快,可以得到变量重要性排序
  • 容易实现并行化

随机森林的缺点:

  • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
  • 随机森林模型还有许多不好解释的地方,有点算个黑盒模型

你可能感兴趣的:(机器学习)