随机森林是一种集成学习方法,它通过构建多个决策树来进行分类或回归。在训练过程中,每棵树都是从训练数据的一个自助样本(bootstrap sample)中生长出来的。OOB(Out-of-Bag)误差是指在自助样本中未被选中的数据点上,使用其他树进行预测的平均误差。这种方法允许在训练过程中对随机森林分类器进行拟合和验证,而无需单独的测试集。
下面的例子展示了如何在训练过程中,随着每棵新树的添加,测量OOB误差。通过生成的图表,实践者可以估计一个合适的n_estimators值,在这个值下误差趋于稳定。
为了生成一个二分类数据集,首先使用sklearn库中的make_classification函数。然后,创建了三个不同参数设置的RandomForestClassifier实例,并记录了随着n_estimators增加,每个实例的OOB误差。
from collections import OrderedDict
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
RANDOM_STATE = 123
# 生成一个二分类数据集
X, y = make_classification(
n_samples=500,
n_features=25,
n_clusters_per_class=1,
n_informative=15,
random_state=RANDOM_STATE,
)
ensemble_clfs = [
("RandomForestClassifier, max_features='sqrt'", RandomForestClassifier(warm_start=True, oob_score=True, max_features="sqrt", random_state=RANDOM_STATE)),
("RandomForestClassifier, max_features='log2'", RandomForestClassifier(warm_start=True, max_features="log2", oob_score=True, random_state=RANDOM_STATE)),
("RandomForestClassifier, max_features=None", RandomForestClassifier(warm_start=True, max_features=None, oob_score=True, random_state=RANDOM_STATE)),
]
error_rate = OrderedDict((label, []) for label, _ in ensemble_clfs)
# 探索n_estimators的值范围
min_estimators = 15
max_estimators = 150
for label, clf in ensemble_clfs:
for i in range(min_estimators, max_estimators + 1, 5):
clf.set_params(n_estimators=i)
clf.fit(X, y)
# 记录每个n_estimators=i设置的OOB误差
oob_error = 1 - clf.oob_score_
error_rate[label].append((i, oob_error))
# 生成"OOB误差率"与"n_estimators"的图表
for label, clf_err in error_rate.items():
xs, ys = zip(*clf_err)
plt.plot(xs, ys, label=label)
plt.xlim(min_estimators, max_estimators)
plt.xlabel("n_estimators")
plt.ylabel("OOB error rate")
plt.legend(loc="upper right")
plt.show()
这段代码首先导入了必要的库,并设置了随机状态以确保结果的可重复性。然后,它生成了一个具有500个样本和25个特征的二分类数据集。接着,定义了三个不同的随机森林分类器,每个分类器都有不同的max_features参数。
在训练过程中,代码通过设置warm_start=True来启用OOB误差的跟踪。对于每个分类器,代码遍历了从15到150的n_estimators值,每次增加5。对于每个n_estimators值,代码训练了分类器并记录了相应的OOB误差。
最后,代码使用matplotlib库生成了一个图表,显示了不同n_estimators值下的OOB误差率。这个图表可以帮助理解随着树的数量增加,模型性能如何变化,并帮助选择一个合适的n_estimators值。