1. Вычислим остаток:

25 − 19 = 6.

Предположим, что новое дерево предлагает корректировку h₁(x) = 6.

Тогда:

F₁(x) = 19 + 0.3 × 6 = 20.8.

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

actual = 25

prediction = 19

learning_rate = 0.3

 

residual = actual - prediction

 

new_prediction = (

    prediction + learning_rate * residual

)

 

print("Остаток:", residual)

print("Новый прогноз:", new_prediction)

Результат:

Остаток: 6

Новый прогноз: 20.8

Скорость обучения определяет величину корректировки, вносимой новым деревом.

2. Сравним модели с разными значениями learning_rate и n_estimators.

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

)

 

for rate in [0.1, 0.01]:

    for trees in [50, 200]:

        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,

            "n_estimators:", trees,

            "MSE:", round(mse, 2)

        )

При меньшем learning_rate вклад каждого дерева уменьшается, поэтому для достижения сопоставимого качества часто требуется больше деревьев.

Однако оптимальное сочетание параметров зависит от данных. Гиперпараметры следует выбирать по валидационной выборке или с помощью перекрёстной проверки, а не по итоговой тестовой оценке.

3. Сравним глубину деревьев при включённой ранней остановке.

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=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

)

 

for depth in [2, 4]:

    model = GradientBoostingRegressor(

        n_estimators=300,

        learning_rate=0.1,

        max_depth=depth,

        validation_fraction=0.2,

        n_iter_no_change=10,

        random_state=42

    )

 

    model.fit(X_train, y_train)

 

    predictions = model.predict(X_test)

 

    mse = mean_squared_error(y_test, predictions)

 

    print("Глубина:", depth)

    print("Использовано деревьев:", model.n_estimators_)

    print("MSE:", round(mse, 2))

    print()

Глубина базовых деревьев контролирует сложность разбиений и взаимодействия признаков, которые может учитывать модель.

Ранняя остановка прекращает добавление новых деревьев, когда качество на валидационных данных перестаёт улучшаться в соответствии с заданным критерием.

Оба механизма помогают контролировать сложность ансамбля и предотвращать чрезмерное обучение.