Ottimizzare il numero di boosting rounds
Iniziamo con il tuning dei parametri osservando come il numero di boosting rounds (il numero di alberi che costruisci) influisca sulle prestazioni out-of-sample del tuo modello XGBoost. Userai xgb.cv() all'interno di un ciclo for e costruirai un modello per ciascun valore del parametro num_boost_round.
Qui continuerai a lavorare con il dataset Ames housing. Le feature sono disponibili nell'array X, e il vettore target è contenuto in y.
Questo esercizio fa parte del corso
Extreme Gradient Boosting con XGBoost
Istruzioni dell'esercizio
- Crea un
DMatrixchiamatohousing_dmatrixa partire daXey. - Crea un dizionario di parametri chiamato
params, passando l'"objective"appropriato ("reg:squarederror") e"max_depth"(impostalo a3). - Itera su
num_roundsin un ciclofored esegui una cross-validation a 3 fold. A ogni iterazione del ciclo, passa il numero corrente di boosting rounds (curr_num_rounds) axgb.cv()come argomento dinum_boost_round. - Aggiungi l'RMSE dell'ultimo boosting round per ciascun modello XGBoost validato incrociatamente alla lista
final_rmse_per_round. num_roundsefinal_rmse_per_roundsono stati zippati e convertiti in un DataFrame così puoi vedere facilmente come il modello si comporta con ciascun boosting round. Premi "Invia risposta" per vedere i risultati!
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
# 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"]))