Примечание
Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder
Регрессия с градиентным бустингом
Этот пример демонстрирует регрессию с градиентным бустингом для создания предсказательной модели из ансамбля слабых предсказательных моделей. Градиентный бустинг может использоваться для задач регрессии и классификации. Здесь мы обучим модель для решения задачи регрессии диабета. Мы получим результаты из GradientBoostingRegressor с потерей наименьших квадратов и 500 регрессионных деревьев глубины 4.
Примечание: для больших наборов данных (n_samples >= 10000), пожалуйста, обратитесь к HistGradientBoostingRegressor. См. Особенности деревьев градиентного бустинга на основе гистограмм для примера, демонстрирующего некоторые другие преимущества HistGradientBoostingRegressor.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause import matplotlib import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, ensemble from sklearn.inspection import permutation_importance from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split from sklearn.utils.fixes import parse_version
Загрузка данных
Сначала нам нужно загрузить данные.
diabetes = datasets.load_diabetes() X, y = diabetes.data, diabetes.target
Предобработка данных
Далее мы разделим наш набор данных, чтобы использовать 90% для обучения и оставить остальную часть для тестирования. Мы также установим параметры регрессионной модели. Вы можете экспериментировать с этими параметрами, чтобы посмотреть, как изменятся результаты.
n_estimators : число этапов бустинга, которые будут выполнены. Позже мы построим отклонение по отношению к итерациям бустинга.
max_depth : ограничивает количество узлов в дереве. Лучшее значение зависит от взаимодействия входных переменных.
min_samples_split : минимальное число образцов, необходимое для разделения внутреннего узла.
learning_rate : насколько будет уменьшен вклад каждого дерева.
loss : функция потерь, которую нужно оптимизировать. В данном случае используется функция наименьших квадратов, однако существует множество других вариантов (см. GradientBoostingRegressor).
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.1, random_state=13
)
params = {
"n_estimators": 500,
"max_depth": 4,
"min_samples_split": 5,
"learning_rate": 0.01,
"loss": "squared_error",
}
Обучение регрессионной модели
Теперь мы инициализируем регрессоры градиентного бустинга и обучим их на наших обучающих данных. Давайте также посмотрим на среднеквадратичную ошибку на тестовых данных.
reg = ensemble.GradientBoostingRegressor(**params)
reg.fit(X_train, y_train)
mse = mean_squared_error(y_test, reg.predict(X_test))
print("The mean squared error (MSE) on test set: {:.4f}".format(mse))
The mean squared error (MSE) on test set: 3010.2061
Построение графика отклонения обучения
Наконец, мы визуализируем результаты. Для этого мы сначала вычислим отклонение тестового набора, а затем построим его по отношению к итерациям бустинга.
test_score = np.zeros((params["n_estimators"],), dtype=np.float64)
for i, y_pred in enumerate(reg.staged_predict(X_test)):
test_score[i] = mean_squared_error(y_test, y_pred)
fig = plt.figure(figsize=(6, 6))
plt.subplot(1, 1, 1)
plt.title("Deviance")
plt.plot(
np.arange(params["n_estimators"]) + 1,
reg.train_score_,
"b-",
label="Training Set Deviance",
)
plt.plot(
np.arange(params["n_estimators"]) + 1, test_score, "r-", label="Test Set Deviance"
)
plt.legend(loc="upper right")
plt.xlabel("Boosting Iterations")
plt.ylabel("Deviance")
fig.tight_layout()
plt.show()

Построение графика важности признаков
Предупреждение
Обратите внимание, что основанные на нечистотах показатели важности признаков могут быть вводящими в заблуждение для признаков с высокой кратностью (много уникальных значений). В качестве альтернативы, показатели важности перестановки reg могут быть вычислены на отдельном тестовом наборе. См. Важность признаков при перестановке для получения более подробной информации.
В этом примере основанные на нечистотах и методы перестановки определяют одни и те же 2 сильно предсказывающих признака, но не в том же порядке. Третий по значимости признак, «bp», также одинаков для двух методов. Остальные признаки менее предсказуемы, и погрешности графика перестановки показывают, что они перекрываются с 0.
feature_importance = reg.feature_importances_
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + 0.5
fig = plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.barh(pos, feature_importance[sorted_idx], align="center")
plt.yticks(pos, np.array(diabetes.feature_names)[sorted_idx])
plt.title("Feature Importance (MDI)")
result = permutation_importance(
reg, X_test, y_test, n_repeats=10, random_state=42, n_jobs=2
)
sorted_idx = result.importances_mean.argsort()
plt.subplot(1, 2, 2)
# `labels` argument in boxplot is deprecated in matplotlib 3.9 and has been
# renamed to `tick_labels`. The following code handles this, but as a
# scikit-learn user you probably can write simpler code by using `labels=...`
# (matplotlib < 3.9) or `tick_labels=...` (matplotlib >= 3.9).
tick_labels_parameter_name = (
"tick_labels"
if parse_version(matplotlib.__version__) >= parse_version("3.9")
else "labels"
)
tick_labels_dict = {
tick_labels_parameter_name: np.array(diabetes.feature_names)[sorted_idx]
}
plt.boxplot(result.importances[sorted_idx].T, vert=False, **tick_labels_dict)
plt.title("Permutation Importance (test set)")
fig.tight_layout()
plt.show()

Общее время выполнения скрипта: (0 минут 1,404 секунды)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/ensemble/plot_gradient_boosting_regression.html