Пример 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-оценка позволяет получить дополнительную оценку качества
по обучающим наблюдениям, не использованным отдельными деревьями.
Однако она не заменяет окончательную проверку на независимой
тестовой выборке.
Показатели важности признаков помогают анализировать вклад
признаков в построение модели, но требуют осторожной интерпретации.