Dostrajanie liczby rund boostingu
Zacznijmy dostrajanie parametrów od sprawdzenia, jak liczba rund boostingu (czyli liczba budowanych drzew) wpływa na wydajność modelu XGBoost na danych spoza zbioru treningowego. Użyjesz xgb.cv() wewnątrz pętli for i zbudujesz jeden model dla każdej wartości parametru num_boost_round.
W tym ćwiczeniu kontynuujesz pracę ze zbiorem danych dotyczącym cen nieruchomości w Ames. Cechy są dostępne w tablicy X, a wektor docelowy – w zmiennej y.
To ćwiczenie jest częścią kursu
Extreme Gradient Boosting with XGBoost
Instrukcje do ćwiczenia
- Utwórz obiekt
DMatrixo nazwiehousing_dmatrixna podstawieXiy. - Utwórz słownik parametrów o nazwie
params, przekazując odpowiednią wartość"objective"("reg:squarederror") oraz"max_depth"(ustaw na3). - Iteruj po
num_roundswewnątrz pętlifori przeprowadź 3-krotną walidację krzyżową. W każdej iteracji przekaż bieżącą liczbę rund boostingu (curr_num_rounds) doxgb.cv()jako argumentnum_boost_round. - Dodaj wartość RMSE z ostatniej rundy boostingu dla każdego modelu XGBoost walidowanego krzyżowo do listy
final_rmse_per_round. - Wartości
num_roundsifinal_rmse_per_roundzostały połączone i przekonwertowane do postaci DataFrame, dzięki czemu możesz łatwo zobaczyć, jak model radzi sobie przy każdej liczbie rund boostingu. Kliknij „Prześlij odpowiedź", aby zobaczyć wyniki!
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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"]))