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