Пример 1. Создание бутстреп-выборок

Бэггинг обучает несколько моделей на разных бутстреп-выборках. Бутстреп-выборка формируется случайным выбором наблюдений из исходных данных с возвращением. Поэтому отдельные наблюдения могут повторяться, а некоторые — не попадать в конкретную выборку.

Реализация на Python:

import numpy as np

 

data = np.array([10, 20, 30, 40, 50])

 

rng = np.random.default_rng(42)

 

for i in range(3):

    sample = rng.choice(

        data,

        size=len(data),

        replace=True

    )

    print(f"Bootstrap {i + 1}:", sample)

В результате создаются три бутстреп-выборки. Каждая содержит пять элементов, но состав наблюдений может отличаться.

Именно на таких выборках в бэггинге обучаются отдельные модели, результаты которых затем агрегируются.

Пример 2. Агрегирование прогнозов деревьев

В лекции рассматривается пример, в котором пять деревьев решений выдали следующие прогнозы:

[1, 1, 0, 1, 0].

Для классификации итоговый ответ определяется большинством голосов.

Класс 1 получил три голоса, а класс 0 — два голоса.

Реализация на Python:

import numpy as np

 

predictions = np.array([1, 1, 0, 1, 0])

 

classes, counts = np.unique(

    predictions,

    return_counts=True

)

 

final_class = classes[np.argmax(counts)]

 

print("Прогнозы деревьев:", predictions)

print("Итоговый класс:", final_class)

Результат:

Итоговый класс: 1.

Агрегирование ответов нескольких моделей позволяет уменьшать вариативность нестабильных алгоритмов.

Пример 3. Обучение случайного леса и OOB-оценка

Случайный лес объединяет несколько деревьев решений. Помимо бутстреп-выборок, алгоритм использует случайные подмножества признаков при поиске разбиений.

OOB-оценка использует наблюдения, которые не вошли в бутстреп-выборку конкретного дерева.

Реализация на Python:

from sklearn.datasets import make_classification

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import accuracy_score

 

X, y = make_classification(

    n_samples=300,

    n_features=5,

    n_informative=3,

    n_redundant=0,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    stratify=y,

    random_state=42

)

 

model = RandomForestClassifier(

    n_estimators=100,

    bootstrap=True,

    oob_score=True,

    random_state=42

)

 

model.fit(X_train, y_train)

 

predictions = model.predict(X_test)

 

print("OOB-оценка:", round(model.oob_score_, 3))

print(

    "Тестовая точность:",

    round(accuracy_score(y_test, predictions), 3)

)

 

print("Важность признаков:")

print(model.feature_importances_)

OOB-оценка позволяет получить дополнительную оценку качества по обучающим наблюдениям, не использованным отдельными деревьями.

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

Показатели важности признаков помогают анализировать вклад признаков в построение модели, но требуют осторожной интерпретации.