Оценка ошибки вне пакета (Out-Of-Bag) для Случайного леса

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы покажем, как измерить ошибку вне пакета (Out-Of-Bag, OOB) для модели Случайный лес с использованием библиотеки scikit-learn для Python. Ошибка вне пакета - это средняя ошибка для каждого наблюдения в наборе обучающих данных, вычисленная с использованием предсказаний деревьев, которые не содержат данное наблюдение в своем бутстрап-выборке. Это позволяет оценивать качество модели Случайный лес при обучении.

Советы по использованию ВМ

После запуска виртуальной машины (VM) перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к работе с Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49119{{"Оценка ошибки вне пакета (Out-Of-Bag) для Случайного леса"}} sklearn/datasets -.-> lab-49119{{"Оценка ошибки вне пакета (Out-Of-Bag) для Случайного леса"}} ml/sklearn -.-> lab-49119{{"Оценка ошибки вне пакета (Out-Of-Bag) для Случайного леса"}} end

Импортируем необходимые библиотеки

Начнем с импорта необходимых библиотек, включая 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

Создаем бинарный датасет для классификации

Далее мы создадим бинарный датасет для классификации с использованием функции make_classification, предоставляемой библиотекой scikit-learn. Эта функция позволяет нам указать количество образцов, признаков, кластеров в каждой классе и информативных признаков. Мы будем использовать фиксированное значение случайного состояния, чтобы обеспечить воспроизводимость результатов.

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, чтобы отслеживать ошибку вне пакета (Out-Of-Bag, OOB) во время обучения. Также установим параметр oob_score в значение True, чтобы включить вычисление ошибки вне пакета.

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

Вычисляем ошибку вне пакета (Out-Of-Bag, OOB)

Для каждого классификатора мы пройдем в цикле по диапазону значений n_estimators и подберем классификатор к набору данных. Мы запишем ошибку вне пакета для каждого значения n_estimators и сохраним ее в объекте 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))

Визуализируем ошибку вне пакета (Out-Of-Bag, 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()

Резюме

В этом практическом занятии мы показали, как измерять ошибку вне пакета (Out-Of-Bag, OOB) для модели Случайный лес с использованием scikit-learn. Мы создали бинарный датасет для классификации, определили список ансамблей классификаторов, вычислили ошибку вне пакета для каждого классификатора и визуализировали результаты. Эта техника позволяет нам оценивать ошибку модели Случайный лес без необходимости отдельного набора данных для проверки.