随机森林分类器(RandomForestClassifier)在训练时采用了自助采样聚合方法,即每棵树都是基于训练样本的一个自助样本来拟合的。所谓的袋外误差(out-of-bag, OOB),是指在计算每个训练样本z_i = (x_i, y_i)
的平均误差时,只使用那些在构建树时没有包含z_i
的自助样本中的树来进行预测。这种方法允许在训练过程中同时完成模型的拟合和验证。
下面的例子展示了在训练过程中,每增加一棵树时如何测量OOB误差。通过生成的图表,实践者可以估计一个合适的n_estimators
值,在这个值下误差趋于稳定。
为了实现这一过程,首先需要生成一个二分类数据集。然后,创建了几个不同参数设置的随机森林分类器,并在训练过程中跟踪它们的OOB误差轨迹。通过这种方式,可以观察到随着树的数量增加,误差是如何变化的,并据此选择一个合适的树的数量。
在下面的Python代码示例中,首先导入了必要的库,并设置了随机状态以确保结果的可重复性。然后,生成了一个具有500个样本和25个特征的二分类数据集。接着,定义了几个随机森林分类器,每个分类器都有不同的max_features
参数设置,并启用了warm_start
和oob_score
选项。
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,
)),
]
# 将分类器名称映射到(n_estimators, 错误率)对的列表。
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错误率")
plt.legend(loc="upper right")
plt.show()
通过上述代码,可以看到随着树的数量增加,OOB错误率是如何变化的。这有助于选择一个合适的树的数量,以达到较好的模型性能。此外,通过观察OOB错误率的下降趋势,还可以对模型的泛化能力有一个初步的估计。
总的来说,随机森林的OOB误差是一个有用的工具,它允许在不使用单独的验证集的情况下,对模型进行有效的验证。这种方法特别适合于那些难以划分出独立验证集的场景,或者当希望简化模型训练和验证流程时。