Пример 1. Корректировка прогноза в градиентном бустинге
Градиентный бустинг строит ансамбль последовательно. Каждое
новое дерево приближает направление уменьшения текущей функции потерь.
Модель записывается следующим образом:
Fₘ(x) = Fₘ₋₁(x) + ηhₘ(x),
где:
Рассмотрим пример из лекции.
Исходный прогноз равен 10, фактическое значение — 14, а
скорость обучения η = 0.2.
Для квадратичной ошибки остаток:
14 − 10 = 4.
Новый прогноз:
F₁ = 10 + 0.2 × 4 = 10.8.
Реализация на Python:
actual = 14
prediction = 10
learning_rate = 0.2
residual = actual - prediction
new_prediction = (
prediction +
learning_rate * residual
)
print("Остаток:", residual)
print("Новый прогноз:", new_prediction)
Результат:
Остаток: 4
Новый прогноз: 10.8
Таким образом, модель постепенно корректирует прогноз, а не
заменяет его полностью.
Пример 2. Влияние learning_rate и количества деревьев
Скорость обучения определяет величину вклада каждого нового
дерева в итоговый прогноз.
Снижение learning_rate обычно требует большего количества
деревьев.
Рассмотрим применение GradientBoostingRegressor.
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
X, y = make_regression(
n_samples=300,
n_features=5,
noise=15,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42
)
settings = [
(0.1, 50),
(0.1, 100),
(0.01, 100),
(0.01, 300)
]
for rate, trees in settings:
model =
GradientBoostingRegressor(
learning_rate=rate,
n_estimators=trees,
max_depth=2,
random_state=42
)
model.fit(X_train,
y_train)
predictions =
model.predict(X_test)
mse =
mean_squared_error(y_test, predictions)
print(
"learning_rate:",
rate,
"Деревьев:", trees,
"MSE:", round(mse, 2)
)
Эксперимент позволяет сравнить влияние скорости обучения и
числа деревьев на качество прогнозирования.
Меньшее значение learning_rate не гарантирует более высокое
качество само по себе. Его необходимо рассматривать совместно с количеством
деревьев.
Пример 3. Ранняя остановка при обучении
При увеличении количества деревьев модель может чрезмерно
подстраиваться под обучающие данные.
Ранняя остановка позволяет прекратить обучение, если
качество на валидационных данных перестаёт улучшаться.
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X, y = make_regression(
n_samples=400,
n_features=6,
noise=20,
random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42
)
model = GradientBoostingRegressor(
n_estimators=300,
learning_rate=0.1,
max_depth=2,
validation_fraction=0.2,
n_iter_no_change=10,
random_state=42
)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print("Использовано деревьев:",
model.n_estimators_)
print(
"Тестовая
MSE:",
round(mean_squared_error(y_test, predictions), 2)
)
Параметр n_iter_no_change задаёт количество последовательных
итераций без достаточного улучшения валидационной функции потерь, после
которого обучение прекращается.
Ранняя остановка помогает ограничить сложность ансамбля и
снизить риск переобучения.