Построение сравнения между лесом и гистограммным градиентным бустингом

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном задании мы сравним производительность двух популярных ансамблевых моделей, Случайный лес (Random Forest, RF) и Градиентный бустинг с гистограммами (Histogram Gradient Boosting, HGBT), для датасета регрессии по показателям качества и времени вычислений. Мы будем изменять параметры, которые контролируют количество деревьев для каждого оценивателя, и построить графики результатов, чтобы визуализировать компромисс между затраченным временем вычислений и средним значением тестового качества.

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

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49130{{"Построение сравнения между лесом и гистограммным градиентным бустингом"}} sklearn/model_selection -.-> lab-49130{{"Построение сравнения между лесом и гистограммным градиентным бустингом"}} sklearn/datasets -.-> lab-49130{{"Построение сравнения между лесом и гистограммным градиентным бустингом"}} ml/sklearn -.-> lab-49130{{"Построение сравнения между лесом и гистограммным градиентным бустингом"}} end

Загрузка датасета

Мы загрузим датасет по недвижимости в Калифорнии с использованием функции fetch_california_housing из scikit-learn. Этот датасет содержит 20640 образцов и 8 признаков.

from sklearn.datasets import fetch_california_housing

X, y = fetch_california_housing(return_X_y=True, as_frame=True)
n_samples, n_features = X.shape

print(f"Датасет содержит {n_samples} образцов и {n_features} признаков")

Определение моделей и сеток параметров

Мы определим две модели, Случайный лес и Градиентный бустинг с гистограммами, с соответствующими сетками параметров с использованием классов RandomForestRegressor, HistGradientBoostingRegressor и GridSearchCV из scikit-learn. Также мы установим количество физических ядер на хост-машине для параллельной обработки.

import joblib
import pandas as pd
from sklearn.ensemble import HistGradientBoostingRegressor, RandomForestRegressor
from sklearn.model_selection import GridSearchCV, KFold

N_CORES = joblib.cpu_count(only_physical_cores=True)

models = {
    "Случайный лес": RandomForestRegressor(
        min_samples_leaf=5, random_state=0, n_jobs=N_CORES
    ),
    "Градиентный бустинг с гистограммами": HistGradientBoostingRegressor(
        max_leaf_nodes=15, random_state=0, early_stopping=False
    ),
}

param_grids = {
    "Случайный лес": {"n_estimators": [10, 20, 50, 100]},
    "Градиентный бустинг с гистограммами": {"max_iter": [10, 20, 50, 100, 300, 500]},
}

cv = KFold(n_splits=4, shuffle=True, random_state=0)

results = []

for name, model in models.items():
    grid_search = GridSearchCV(
        estimator=model,
        param_grid=param_grids[name],
        return_train_score=True,
        cv=cv,
    ).fit(X, y)

    result = {"model": name, "cv_results": pd.DataFrame(grid_search.cv_results_)}
    results.append(result)

Вычисление оценок и времени вычислений

Мы вычислим среднее время обучения и оценки для каждой комбинации гиперпараметров с использованием атрибута cv_results_ объекта GridSearchCV. Затем мы построим графики результатов с использованием plotly.express.scatter и plotly.express.line, чтобы визуализировать компромисс между затраченным временем вычислений и средним тестовым качеством.

import plotly.express as px
import plotly.colors as colors
from plotly.subplots import make_subplots

fig = make_subplots(
    rows=1,
    cols=2,
    shared_yaxes=True,
    subplot_titles=["Время обучения vs качество", "Время предсказания vs качество"],
)
model_names = [result["model"] for result in results]
colors_list = colors.qualitative.Plotly * (
    len(model_names) // len(colors.qualitative.Plotly) + 1
)

for idx, result in enumerate(results):
    cv_results = result["cv_results"].round(3)
    model_name = result["model"]
    param_name = list(param_grids[model_name].keys())[0]
    cv_results[param_name] = cv_results["param_" + param_name]
    cv_results["model"] = model_name

    scatter_fig = px.scatter(
        cv_results,
        x="mean_fit_time",
        y="mean_test_score",
        error_x="std_fit_time",
        error_y="std_test_score",
        hover_data=param_name,
        color="model",
    )
    line_fig = px.line(
        cv_results,
        x="mean_fit_time",
        y="mean_test_score",
    )

    scatter_trace = scatter_fig["data"][0]
    line_trace = line_fig["data"][0]
    scatter_trace.update(marker=dict(color=colors_list[idx]))
    line_trace.update(line=dict(color=colors_list[idx]))
    fig.add_trace(scatter_trace, row=1, col=1)
    fig.add_trace(line_trace, row=1, col=1)

    scatter_fig = px.scatter(
        cv_results,
        x="mean_score_time",
        y="mean_test_score",
        error_x="std_score_time",
        error_y="std_test_score",
        hover_data=param_name,
    )
    line_fig = px.line(
        cv_results,
        x="mean_score_time",
        y="mean_test_score",
    )

    scatter_trace = scatter_fig["data"][0]
    line_trace = line_fig["data"][0]
    scatter_trace.update(marker=dict(color=colors_list[idx]))
    line_trace.update(line=dict(color=colors_list[idx]))
    fig.add_trace(scatter_trace, row=1, col=2)
    fig.add_trace(line_trace, row=1, col=2)

fig.update_layout(
    xaxis=dict(title="Время обучения (с) - меньше лучше"),
    yaxis=dict(title="Тестовое качество R2 - выше лучше"),
    xaxis2=dict(title="Время предсказания (с) - меньше лучше"),
    legend=dict(x=0.72, y=0.05, traceorder="normal", borderwidth=1),
    title=dict(x=0.5, text="Компромисс между скоростью и качеством для ансамблей деревьев"),
)

Интерпретация результатов

Мы можем наблюдать, что модели HGBT и RF улучшаются при увеличении количества деревьев в ансамбле. Однако, оценки достигают плато, где добавление новых деревьев только делает процесс обучения и оценки медленнее. Модель RF достигает такого плато раньше и никогда не может достичь тестовой оценки самой большой модели HGBDT. Модели HGBT однозначно доминируют над моделями RF в "компромиссе между тестовым качеством и скоростью обучения" и "компромиссе между тестовым качеством и скоростью предсказания" также может быть более благоприятным для HGBT. HGBT практически всегда предлагает более благоприятный компромисс между скоростью и точностью по сравнению с RF, как с использованием стандартных гиперпараметров, так и с учетом стоимости настройки гиперпараметров.

Обзор

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