随机森林袋外误差估计

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将演示如何使用 Python 的 scikit-learn 库来测量随机森林模型的袋外(OOB)错误率。OOB 错误率是指使用各自自助抽样样本中不包含该观测值的树的预测结果计算出的每个训练观测值的平均误差。这使得随机森林模型在训练时就能进行拟合和验证。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入所需库

我们将首先导入所需的库,包括 scikit-learn、NumPy 和 Matplotlib。我们还将设置一个随机状态值以确保可重复性。

import matplotlib.pyplot as plt
from collections import OrderedDict
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier

RANDOM_STATE = 123

生成二元分类数据集

接下来,我们将使用 scikit-learn 提供的 make_classification 函数生成一个二元分类数据集。这个函数允许我们指定样本数量、特征数量、每个类别的簇数以及信息性特征的数量。我们将使用固定的随机状态值以确保可重复性。

X, y = make_classification(
    n_samples=500,
    n_features=25,
    n_clusters_per_class=1,
    n_informative=15,
    random_state=RANDOM_STATE,
)

定义集成分类器

我们将定义一个包含三个随机森林分类器的列表,每个分类器的 max_features 参数都有不同的值。我们会将 warm_start 构造参数设置为 True,以便在训练期间跟踪袋外(OOB)错误率。我们还会将 oob_score 参数设置为 True,以启用 OOB 错误率计算。

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,
        ),
    ),
]

计算袋外(OOB)错误率

对于每个分类器,我们将在一系列 n_estimators 值的范围内进行循环,并将分类器拟合到数据集上。我们会记录每个 n_estimators 值对应的 OOB 错误率,并将其存储在一个 OrderedDict 对象中。

error_rate = OrderedDict((label, []) for label, _ in ensemble_clfs)

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)

        oob_error = 1 - clf.oob_score_
        error_rate[label].append((i, oob_error))

可视化袋外(OOB)错误率

最后,我们将绘制每个分类器的 OOB 错误率与估计器数量的函数关系图。这将使我们能够确定错误率趋于稳定时的估计器数量。我们将使用 Matplotlib 来生成该图。

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()

总结

在本实验中,我们展示了如何使用 scikit-learn 来测量随机森林模型的袋外(OOB)错误率。我们生成了一个二元分类数据集,定义了一个集成分类器列表,计算了每个分类器的 OOB 错误率,并对结果进行了可视化。这种技术使我们能够在无需单独验证集的情况下估计随机森林模型的错误率。