Ajustarea numărului de runde de boosting
Să începem reglarea parametrilor analizând cum influențează numărul de runde de boosting (adică numărul de arbori construiți) performanța modelului XGBoost pe date nevăzute. Vei folosi xgb.cv() într-o buclă for și vei construi câte un model pentru fiecare valoare a parametrului num_boost_round.
Vei continua să lucrezi cu setul de date Ames housing. Caracteristicile sunt disponibile în array-ul X, iar vectorul țintă se află în y.
Acest exercițiu face parte din cursul
Gradient Boosting Extrem cu XGBoost
Instrucțiuni pentru exercițiu
- Creează un
DMatrixnumithousing_dmatrixdinXșiy. - Creează un dicționar de parametri numit
params, specificând"objective"corespunzător ("reg:squarederror") și"max_depth"(setează-l la3). - Iterează peste
num_roundsîntr-o buclăforși efectuează validare încrucișată cu 3 fold-uri. La fiecare iterație, transmite numărul curent de runde de boosting (curr_num_rounds) cătrexgb.cv()ca argument pentrunum_boost_round. - Adaugă RMSE-ul rundei finale de boosting pentru fiecare model XGBoost validat încrucișat în lista
final_rmse_per_round. num_roundsșifinal_rmse_per_roundau fost combinate cuzipși convertite într-un DataFrame, astfel încât să poți vedea cu ușurință cum performează modelul la fiecare rundă de boosting. Apasă Trimite răspunsul pentru a vedea rezultatele!
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
# 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"]))