1. 引入

从RandomForest的鼻祖Breiman的comments(参考1)中,可以看到他说过:对于RandomForest的validation,没有必要像其他模型一样做cross-validation了,可以直接用RandomForest在内部就提供了out-of-bag (oob) error estimate,用这种方法就可以看出RF的训练效果了。

那我们该怎么理解out-of-bag (oob) error estimate呢?

2. 原理:oob error estimate

首先解释几个概念

  1. bootstrap sampling

bootstrap sampling是自主采样法,指的是有放回的采样。这种采样方式,会导致约有36%的样本永远不会被采样到。

具体计算过程:假设有m个样本,有放回的采样,每次被采样到的概率是(1/m),每次不被采样到的概率是(1-1/m);则(1-1/m)的n次方,当n足够大是,极限为1/e(约等于36%)。

  1. Bagging

Bagging是并行集成学习方法最著名的代表,他是基于bootstrap sampling做的有放回抽样,多次抽样后组成多组训练集,来训练多个模型。

RandomForest就是基于Bagging做了一个扩展:随机选择属性(特征)。

  1. out-of-bag (oob) error

out-of-bag (oob) error是 “包外误差”的意思。

它指的是,我们在从x_data中进行多次有放回的采样,能构造出多个训练集。根据上面1中bootstrap sampling的特点,我们可以知道,在训练RF的过程中,一定会有约36%的样本永远不会被采样到。

注意,这里说的“约36%的样本永远不会被采样到”,并不是针对第k棵树来说的,是针对所有树来说,36%的样本永远不会在任何一棵树的训练集中出现过。

那这36%的样本,就是out-of-bag (oob) data,包外数据。

用这个包外数据来做evaluation,就相当于用测试集来做evaluation。所以RF不需要再用测试集来做evaluation了。

3. 编程:oob error estimate

上面解释清楚了oob error estimate的原理,这里给一段示例代码来说明他的用法。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# step-01: get data
data = load_iris()
x_data=data.data
y_data=data.target
# step-02: train rf
clf = RandomForestClassifier(random_state=0, oob_score=True)
clf.fit(x_data,y_data)
# step-03: oob error estimate
print(clf.oob_score_)# 0.9333333333333333

这里注意4点:

  1. 不需要再划分训练集和测试集
  2. RandomForestClassifier的参数oob_score要设置为True(默认为False)
  3. RandomForestClassifier的参数bootstrap要设置为True(默认为True)
  4. 通过访问RandomForestClassifier对象的实例变量oob_score_就能得到1-oob_error的值

4. 总结

本文描述了参考1中对RandomForest的关键部分out-of-bag (oob) error estimate的理解,也给出了参考代码。

参考

  1. https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
  2. 周志华《机器学习》2.2节“评估方法”
  3. 周志华《机器学习》8.3节“Bagging与随机森林”
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐