随机森林分类器的OOB误差分析

随机森林是一种集成学习方法,它通过构建多个决策树来进行分类或回归。在训练过程中,每棵树都是从训练数据的一个自助样本(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值。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485