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

Ранняя остановка помогает ограничить сложность ансамбля и снизить риск переобучения.