Настройка количества раундов бустинга
Начнём настройку параметров с изучения того, как количество раундов бустинга (то есть количество построенных деревьев) влияет на качество модели XGBoost на отложенных данных. Вы будете использовать xgb.cv() внутри цикла for и строить по одной модели для каждого значения параметра num_boost_round.
В этом упражнении вы продолжите работу с набором данных о жилье Ames. Признаки хранятся в массиве X, а целевой вектор — в y.
Это упражнение является частью курса
Экстремальный градиентный бустинг с XGBoost
Инструкции к упражнению
- Создайте объект
DMatrixс именемhousing_dmatrixизXиy. - Создайте словарь параметров
params, передав соответствующие значения"objective"("reg:squarederror") и"max_depth"(установите равным3). - Выполните итерацию по
num_roundsв циклеforи проведите 3-кратную кросс-валидацию. На каждой итерации передавайте текущее количество раундов бустинга (curr_num_rounds) вxgb.cv()в качестве аргументаnum_boost_round. - Добавляйте значение RMSE последнего раунда бустинга для каждой кросс-валидированной модели XGBoost в список
final_rmse_per_round. - Значения
num_roundsиfinal_rmse_per_roundобъединены с помощьюzipи преобразованы в DataFrame, чтобы вы могли удобно оценить качество модели при каждом количестве раундов. Нажмите «Отправить ответ», чтобы увидеть результаты!
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# Create the DMatrix: housing_dmatrix
housing_dmatrix = ____
# Create the parameter dictionary for each tree: params
params = {"____":"____", "____":____}
# Create list of number of boosting rounds
num_rounds = [5, 10, 15]
# Empty list to store final round rmse per XGBoost model
final_rmse_per_round = []
# Iterate over num_rounds and build one model per num_boost_round parameter
for curr_num_rounds in num_rounds:
# Perform cross-validation: cv_results
cv_results = ____(dtrain=____, params=____, nfold=3, num_boost_round=____, metrics="rmse", as_pandas=True, seed=123)
# Append final round RMSE
____.____(cv_results["test-rmse-mean"].tail().values[-1])
# Print the resultant DataFrame
num_rounds_rmses = list(zip(num_rounds, final_rmse_per_round))
print(pd.DataFrame(num_rounds_rmses,columns=["num_boosting_rounds","rmse"]))