Введение
В этом лабораторном задании мы сравним производительность двух популярных ансамблевых моделей, Случайный лес (Random Forest, RF) и Градиентный бустинг с гистограммами (Histogram Gradient Boosting, HGBT), для датасета регрессии по показателям качества и времени вычислений. Мы будем изменять параметры, которые контролируют количество деревьев для каждого оценивателя, и построить графики результатов, чтобы визуализировать компромисс между затраченным временем вычислений и средним значением тестового качества.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка датасета
Мы загрузим датасет по недвижимости в Калифорнии с использованием функции 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, как с использованием стандартных гиперпараметров, так и с учетом стоимости настройки гиперпараметров.