Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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: 3009.3069

График девианса на обучении

Наконец, визуализируем результаты. Для этого сначала вычислим девианс на тестовом наборе, а затем построим его график в зависимости от числа итераций бустинга.

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()
Deviance

График важности признаков

Предупреждение

Обратите внимание: важность признаков на основе impurity может вводить в заблуждение для признаков с большим количеством уникальных значений. В качестве альтернативы можно вычислить важность признаков на основе перестановок для reg на отложенном тестовом наборе. Подробнее см. в разделе Важность признаков на основе перестановок.

В этом примере методы на основе impurity и перестановок определяют одни и те же 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()
Feature Importance (MDI), Permutation Importance (test set)

Общее время выполнения скрипта: (0 минут 1.351 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_gradient_boosting_regression.ipynb

Download Python source code: plot_gradient_boosting_regression.py

Download zipped: plot_gradient_boosting_regression.zip

Связанные примеры

Регуляризация градиентного бустинга

Важность признаков в лесу деревьев

Важность признаков на основе перестановок и важность признаков в случайном лесу (MDI)

Важность на основе перестановок для мультиколлинеарных или коррелирующих признаков

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/ensemble/plot_gradient_boosting_regression.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API