Ajustar el número de rondas de boosting
Empecemos con el ajuste de parámetros viendo cómo el número de rondas de boosting (el número de árboles que construyes) afecta al rendimiento fuera de muestra de tu modelo XGBoost. Usarás xgb.cv() dentro de un bucle for y construirás un modelo por cada valor del parámetro num_boost_round.
Aquí seguirás trabajando con el conjunto de datos de viviendas de Ames. Las características están disponibles en el array X, y el vector objetivo está contenido en y.
Este ejercicio forma parte del curso
Extreme Gradient Boosting con XGBoost
Instrucciones del ejercicio
- Crea un
DMatrixllamadohousing_dmatrixa partir deXyy. - Crea un diccionario de parámetros llamado
params, pasando el"objective"apropiado ("reg:squarederror") y"max_depth"(ponlo en3). - Itera sobre
num_roundsdentro de un buclefory realiza una validación cruzada de 3 particiones. En cada iteración del bucle, pasa el número actual de rondas de boosting (curr_num_rounds) axgb.cv()como argumento denum_boost_round. - Añade el RMSE de la última ronda de boosting de cada modelo XGBoost validado cruzadamente a la lista
final_rmse_per_round. num_roundsyfinal_rmse_per_roundse han combinado conzipy convertido en un DataFrame para que puedas ver fácilmente cómo rinde el modelo con cada ronda de boosting. Pulsa "Enviar respuesta" para ver los resultados.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
# 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"]))