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

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом лабораторном задании мы будем использовать Gradient Boosting для построения прогнозирующей модели для задачи регрессии диабета. Мы обучим модель на наборе данных о диабете и получим результаты с помощью sklearn.ensemble.GradientBoostingRegressor с квадратичной функцией потерь и 500 решающими деревьями глубиной 4.

Советы по использованию ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с использованием Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка данных

Сначала мы загрузим набор данных о диабете.

diabetes = datasets.load_diabetes()
X, y = diabetes.data, diabetes.target

Предварительная обработка данных

Далее мы разделим наш набор данных, используя 90% для обучения и оставив остаток для тестирования. Также мы установим параметры регрессионной модели.

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

Построение графика отклонения при обучении

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

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

Построение графика важности признаков

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

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)
plt.boxplot(
    result.importances[sorted_idx].T,
    vert=False,
    labels=np.array(diabetes.feature_names)[sorted_idx],
)
plt.title("Permutation Importance (test set)")
fig.tight_layout()
plt.show()

Резюме

В этом практическом занятии мы использовали градиентный бустинг для построения прогнозирующей модели для задачи регрессии диабета. Мы загрузили данные, предобработали их, настроили регрессионную модель и визуализировали результаты, построив график отклонения при обучении, важности признаков и важности перестановки признаков.