Feinabstimmung der Anzahl der Boosting-Runden
Lass uns mit dem Tuning beginnen und untersuchen, wie sich die Anzahl der Boosting-Runden (Anzahl der gebauten Bäume) auf die Out-of-Sample-Performance deines XGBoost-Modells auswirkt. Du wirst xgb.cv() in einer for-Schleife verwenden und pro num_boost_round-Parameter ein Modell bauen.
Hier arbeitest du weiter mit dem Ames-Housing-Datensatz. Die Features liegen im Array X vor, und der Zielvektor befindet sich in y.
Diese Übung ist Teil des Kurses
Extreme Gradient Boosting mit XGBoost
Anleitung zur Übung
- Erstelle eine
DMatrixnamenshousing_dmatrixausXundy. - Erstelle ein Parameter-Dictionary namens
paramsund übergib die passenden Werte für"objective"("reg:squarederror") und"max_depth"(setze es auf3). - Iteriere über
num_roundsin einerfor-Schleife und führe eine 3-fache Kreuzvalidierung durch. Übergib in jeder Iteration die aktuelle Anzahl der Boosting-Runden (curr_num_rounds) anxgb.cv()als Argument fürnum_boost_round. - Hänge die RMSE der letzten Boosting-Runde für jedes kreuzvalidierte XGBoost-Modell an die Liste
final_rmse_per_roundan. num_roundsundfinal_rmse_per_roundwurden bereits gepairt (zip) und in ein DataFrame konvertiert, sodass du leicht sehen kannst, wie das Modell mit jeder Boosting-Runde abschneidet. Klicke auf "Antwort senden", um die Ergebnisse zu sehen!
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
# 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"]))