Ajustando o número de rounds de boosting
Vamos começar o ajuste de parâmetros observando como o número de rounds de boosting (número de árvores construídas) impacta o desempenho fora da amostra do seu modelo XGBoost. Você usará xgb.cv() dentro de um for e vai construir um modelo por valor do parâmetro num_boost_round.
Aqui, você continuará trabalhando com o conjunto de dados de habitação de Ames. As variáveis estão no array X, e o vetor alvo está em y.
Este exercício faz parte do curso
Extreme Gradient Boosting com XGBoost
Instruções do exercício
- Crie um
DMatrixchamadohousing_dmatrixa partir deXey. - Crie um dicionário de parâmetros chamado
params, passando o"objective"apropriado ("reg:squarederror") e"max_depth"(defina como3). - Itere sobre
num_roundsem um laçofore realize validação cruzada com 3 folds. Em cada iteração do laço, passe o número atual de rounds de boosting (curr_num_rounds) paraxgb.cv()como argumento denum_boost_round. - Acrescente o RMSE do round final de boosting para cada modelo XGBoost com validação cruzada à lista
final_rmse_per_round. num_roundsefinal_rmse_per_roundforam combinados comzipe convertidos em um DataFrame para que você veja facilmente como o modelo se sai em cada round de boosting. Clique em "Enviar Resposta" para ver os resultados!
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
# 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"]))