1
resposta

Validação cruzada no XGBoost do curso

No curso "Regressão: aprimorando os resultados com XGBoost", é utilizada na aula 3, item 04 a validação cruzada. No exercício a instrutora utiliza o seguinte código baixo:

params = {'objective': 'reg:squarederror'}
cv_resultados = xgb.cv(dtrain=dtreino, params=params, nfold=5, num_boost_round=1000,
                       early_stopping_rounds=10, metrics='rmse', as_pandas=True, seed=4789)

cv_resultados

Notar que se vai haver validação cruzada em em X folds, para ser possível fazer a validação, o conjunto utilizado no parâmetro dtrain NÃO deveria ser somente o dtreino, mas o dtreino + dteste, ou seja, a matriz D para o conjunto todo de dados, pois, a partir desse conjunto, é que haverá a divisão em X folds.

*Importante observar que esse procedimento é repetido em outras partes do curso.

Observar que na aula 4, item 02 pode-se observar no código abaixo:

from sklearn.model_selection import GridSearchCV
import numpy as np

param_grid = {
    'colsample_bytree': [0.6, 1],  # Define quantas colunas, featuras serão consideradas 
    'subsample': [0.5, 0.8, 1],  # Número de linhas (amostras) que serão utilizadas
    'max_depth': [3, 5, 10],
    'learning_rate': [0.1,0.2,0.3]
}

gbm = xgb.XGBRegressor(enable_categorical=True)

grid = GridSearchCV(
    estimator = gbm,
    param_grid = param_grid,
    scoring = 'neg_mean_squared_error',
    cv = 5,
    verbose = 1
)

grid.fit(X, y)

print('Melhores hiperparâmetros encontrados: ', grid.best_params_)
print('Menor RMSE encontrado: ', np.sqrt(np.abs(grid.best_score_)))

Nota-se no código acima que aqui também tem validação cruzada e são utilizados todos os dados e não somente os de treinamento.

1 resposta

Olá Vagner, tudo bem?

A validação cruzada, tanto no caso do xgb.cv quanto no GridSearchCV, segue o princípio de dividir os dados em k-folds para avaliar o modelo. Mas, os dados utilizados em cada caso variam dependendo do objetivo.

No primeiro exemplo, o xgb.cv faz a validação cruzada automaticamente. Ou seja, o próprio método divide esse conjunto em partes menores (os famosos "folds") e realiza os testes em cada uma dessas partes. O objetivo é verificar o desempenho do modelo sem tocar no conjunto de teste. Isso é super importante, porque o conjunto de teste deve ficar reservado para a avaliação final do modelo, para que ele não tenha "visto" esses dados antes.

Já no segundo exemplo com GridSearchCV, o procedimento é semelhante. O GridSearchCV também realiza a validação cruzada internamente, mas ele faz isso em cima de todos os dados fornecidos (X e y), para otimizar os hiperparâmetros do modelo.

A diferença principal entre os dois exemplos é o momento e o propósito do uso da validação cruzada. No primeiro caso, é para determinar o número ideal de iterações de boosting, enquanto no segundo é para encontrar os melhores hiperparâmetros.

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado