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
首先解释几个概念
- bootstrap sampling
bootstrap sampling
是自主采样法,指的是有放回的采样。这种采样方式,会导致约有36%的样本永远不会被采样到。
具体计算过程:假设有m个样本,有放回的采样,每次被采样到的概率是(1/m),每次不被采样到的概率是(1-1/m);则(1-1/m)的n次方,当n足够大是,极限为1/e(约等于36%)。
- Bagging
Bagging
是并行集成学习方法最著名的代表,他是基于bootstrap sampling
做的有放回抽样,多次抽样后组成多组训练集,来训练多个模型。
RandomForest就是基于Bagging
做了一个扩展:随机选择属性(特征)。
- 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点:
- 不需要再划分训练集和测试集
- RandomForestClassifier的参数oob_score要设置为True(默认为False)
- RandomForestClassifier的参数bootstrap要设置为True(默认为True)
- 通过访问RandomForestClassifier对象的实例变量oob_score_就能得到1-oob_error的值
4. 总结
本文描述了参考1中对RandomForest的关键部分out-of-bag (oob) error estimate
的理解,也给出了参考代码。
参考
- https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
- 周志华《机器学习》2.2节“评估方法”
- 周志华《机器学习》8.3节“Bagging与随机森林”