Coleção aprendizado

XGBoost

Ajusta árvores sequencialmente, cada rodada acrescentando correções ao conjunto para regressão ou classificação.

O que o bloco faz

Ajusta árvores sequencialmente, cada rodada acrescentando correções ao conjunto para regressão ou classificação.

Antes de continuar

Termos que esta página usa, em poucas palavras. As definições completas estão no glossário.

Fator
Uma variável explicativa categórica cujo efeito se quer estudar, como adubo, cultivar ou dose. Num experimento fatorial, dois ou mais fatores são combinados.
Treino e teste
Dividir os dados em uma parte para ajustar o modelo (treino) e outra, guardada, para medir o desempenho (teste). O teste só é honesto se o modelo nunca o viu durante o ajuste.
Sobreajuste
Quando o modelo aprende o ruído dos dados de treino junto com o padrão, e por isso acerta muito no treino e pouco em dados novos. Modelos mais flexíveis correm mais esse risco.
Validação cruzada
Repetir a divisão treino/teste várias vezes, cada vez deixando uma parte diferente dos dados de fora, e fazer a média do desempenho. Dá uma estimativa mais estável do erro em dados novos do que uma única divisão.
Hiperparâmetro
Uma configuração do método escolhida antes do ajuste, como a profundidade de uma árvore ou o número de árvores de uma floresta. Costuma ser escolhida por validação cruzada, nunca olhando o conjunto de teste.

Quando usar

Use para modelos de árvores impulsionadas e compare o resultado no mesmo conjunto de teste. Requer xgboost.

Pressupostos

  • O bloco recebe só o treino: o teste foi separado antes (no ml/split) e não entra em nenhuma escolha — nem de preditores, nem de hiperparâmetros, nem de tratamento de faltantes. A saída teste do ml/split vem marcada e é recusada aqui (tr_ml_error_test_leak); a marca sobrevive ao cache e a filtros, mas não a uma divisão feita por fora nem a juntar treino e teste — nesses casos o bloco não tem como saber o que recebeu.

    Se falhar: Refaça o fluxo com o ml/split no início; a saída teste só vai ao models/predict. Hiperparâmetros se escolhem no ml/tune, com validação cruzada dentro do treino.

  • Nenhum preditor revela a resposta (identificador, código que a embute, medida tomada depois do desfecho).

    Verificar:Resumo

    Se falhar: Tire essas colunas de preditores (ou com o data/select antes do ml/split).

  • As linhas são independentes e vêm da mesma população em que o modelo vai ser usado: sem ordem no tempo, sem várias linhas do mesmo indivíduo, lote ou área repartidas entre treino e teste.

    Se falhar: Com tempo, use estrategia = "temporal" no ml/split e no ml/tune (teste sempre posterior ao treino); com indivíduos, lotes ou áreas repetidos, estrategia = "grupo" (nenhum grupo dos dois lados).

  • Os preditores são numéricos, finitos e sem faltantes — o bloco recusa o resto. Fatores entram só depois de codificados em números.

    Verificar:Resumo

    Se falhar: Trate faltantes com o data/drop_na ou o data/replace_na e codifique fatores com o data/mutate. Uma imputação que usa estatísticas (média, mediana) deve sair só do treino.

  • O número de rodadas (nrounds), a profundidade e a taxa de aprendizado (eta) controlam o sobreajuste. O bloco não faz parada antecipada: usa exatamente nrounds.

    Verificar:Ajustar hiperparâmetrosAvaliar previsões

    Se falhar: Escolha os três juntos no ml/tune (eta menor pede mais rodadas); nunca pare pelo desempenho no teste.

  • A importância (no models/importance) é o Gain relativo: a fração do ganho total das divisões que usam cada preditor (soma 1), medida no treino: descreve o ajuste, não o efeito. Tende a favorecer preditores contínuos ou com muitos valores distintos, e preditores correlacionados repartem entre si a importância.

    Verificar:Resumo

    Se falhar: Leia a importância como resumo do modelo, não como ranking de causas. Na ml/forest, importancia = "impureza_corrigida" ou "permutacao" tiram o viés para preditores com muitos valores.

Configuração

nrounds define rodadas; max_depth limita profundidade por árvore; eta controla taxa de aprendizado. Recebe também resposta, preditores, tarefa e seed.

Exemplo

d <- trama.ml::tr_ml_example("mtcars")
m <- trama.ml::tr_ml_xgboost(d, resposta = "mpg", preditores = "wt, hp", nrounds = 50)
trama.models::tr_models_predict(m, d[1:3, ])

Como interpretar

A importância por ganho resume o ajuste e não indica causalidade. O pacote não seleciona rodadas automaticamente; escolha configurações usando treino/validação.

Teste recusado

A saída teste do ml/split é recusada aqui (tr_ml_error_test_leak): ajustar nela treinaria no teste. Ligue a saída treino; o teste vai só ao ml/predict.

Implementação

  • xgboost::xgb.train() versão 3.2.1.1objective = reg:squarederror, binary:logistic ou multi:softprob; max_depth, eta, nrounds, nthread = 1; sem subamostragem de linhas nem de colunas (determinístico).

No código O bloco chama trama.ml::tr_ml_xgboost(), em trama.ml/R/nodes.R:49.

A conta é feita nesta chamada:

  • xgboost::xgb.train(params = params, data = xgboost::xgb.DMatrix(X, label = label), nrounds = nrounds, verbose = 0)

    em tr_ml_fit() · trama.ml/R/model.R:130

Outras funções de pacotes que o bloco usa (11)
  • stats::reformulate(d$internos, response = ".y")

    em tr_ml_fit() · trama.ml/R/model.R:71

  • stats::lm(f, treino)

    em tr_ml_fit() · trama.ml/R/model.R:76

  • stats::glm(f, treino, family = stats::binomial())

    em tr_ml_fit() · trama.ml/R/model.R:76

  • stats::binomial()

    em tr_ml_fit() · trama.ml/R/model.R:76

  • rpart::rpart(f, treino, method = if (d$tarefa == "regressao") "anova" else "class", control = rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, m...

    em tr_ml_fit() · trama.ml/R/model.R:84

  • rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, minsplit = minsplit, cp = cp, xval = if (poda == "nenhuma") 0L else min(10L, nrow(treino)))

    em tr_ml_fit() · trama.ml/R/model.R:84

  • rpart::prune(arvore, cp = extras$poda$cp)

    em tr_ml_fit() · trama.ml/R/model.R:91

  • figsr::figs(f, treino, max_splits = max_splits, min_n = min_n, mode = if (d$tarefa == "regressao") "regression" else "classification")

    em tr_ml_fit() · trama.ml/R/model.R:96

  • ranger::ranger(f, treino, num.trees = trees, mtry = mm, min.node.size = min_n, max.depth = max_depth, probability = d$tarefa == "classificacao", seed = seed,...

    em tr_ml_fit() · trama.ml/R/model.R:104

  • e1071::svm(x = d$x, y = d$y, type = if (d$tarefa == "regressao") "eps-regression" else "C-classification", kernel = kernel, cost = cost, gamma = gamma, proba...

    em tr_ml_fit() · trama.ml/R/model.R:115

  • xgboost::xgb.DMatrix(X, label = label)

    em tr_ml_fit() · trama.ml/R/model.R:130

Referências

Teoria

  • Chen, T.; Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 785-794. doi:10.1145/2939672.2939785

Livro-texto

  • Hastie, T.; Tibshirani, R.; Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction. 2. ed. New York: Springer. doi:10.1007/978-0-387-84858-7
  • James, G.; Witten, D.; Hastie, T.; Tibshirani, R. (2021). An Introduction to Statistical Learning: with Applications in R. 2. ed. New York: Springer. doi:10.1007/978-1-0716-1418-1

Ver a bibliografia completa do trama