Het aantal boosting-rondes afstemmen
Laten we beginnen met het afstemmen van parameters door te kijken hoe het aantal boosting-rondes (het aantal bomen dat je bouwt) de out-of-sample-prestaties van je XGBoost-model beïnvloedt. Je gebruikt xgb.cv() binnen een for-lus en bouwt één model per waarde van de parameter num_boost_round.
Hier werk je verder met de Ames-housinggegevensset. De features staan in de array X, en de doelvector staat in y.
Deze oefening maakt deel uit van de cursus
Extreme Gradient Boosting met XGBoost
Oefeninstructies
- Maak een
DMatrixmet de naamhousing_dmatrixop basis vanXeny. - Maak een parameterdictionary
paramsen geef de juiste"objective"("reg:squarederror") en"max_depth"(stel in op3) mee. - Itereer over
num_roundsin eenfor-lus en voer 3-voudige cross-validatie uit. Geef in elke iteratie van de lus het huidige aantal boosting-rondes (curr_num_rounds) door aanxgb.cv()als argument voornum_boost_round. - Voeg de RMSE van de laatste boosting-ronde voor elk gevalideerd XGBoost-model toe aan de lijst
final_rmse_per_round. num_roundsenfinal_rmse_per_roundzijn samengevoegd metzipen omgezet naar een DataFrame, zodat je makkelijk kunt zien hoe het model presteert bij elke boosting-ronde. Klik op 'Antwoord verzenden' om de resultaten te zien!
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# 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"]))