Coleção aprendizado

FIGS · soma de árvores

Ajusta uma soma de árvores pequenas sob um orçamento global de divisões para regressão ou classificação binária.

O que o bloco faz

Ajusta uma soma de árvores pequenas sob um orçamento global de divisões para regressão ou classificação binária.

Antes de continuar

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

População
O conjunto completo de unidades sobre o qual se quer concluir algo: todas as propriedades de uma região, todos os alunos de uma escola. Em geral não é possível medir todas, e por isso se mede uma amostra.
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.
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 quando uma explicação aditiva por árvores pequenas atende à pergunta. Para classificação, o suporte é binário. Requer figsr.

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.

  • Na classificação, duas classes: a soma das árvores estima a probabilidade da segunda.

    Verificar:Agrupar e resumir

    Se falhar: Com três ou mais classes, ml/cart, ml/forest ou ml/xgboost.

  • O orçamento de divisões (max_splits) controla a complexidade de todo o modelo; ele não é escolhido pelo bloco.

    Verificar:Ajustar hiperparâmetrosAvaliar previsões

    Se falhar: Escolha max_splits e min_n no ml/tune.

  • A importância (no models/importance) é a redução de erro somada por preditor em todas as árvores, 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

resposta, preditores e tarefa definem dados e tarefa. max_splits limita o total de divisões da soma; min_n controla o tamanho mínimo dos nós conforme figsr; seed reproduz o ajuste.

Exemplo

d <- trama.ml::tr_ml_example("iris_binaria")
m <- trama.ml::tr_ml_figs(d, resposta = "Species", max_splits = 4)
trama.ml::tr_ml_rules(m)

Como interpretar

As regras mostram contribuições por árvore; some as contribuições para obter a previsão. ml/tree_plot desenha uma árvore selecionada, enquanto a saída final permanece a soma.

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

  • figsr::figs() versão 0.1.1mode = "regression" ou "classification" (binária), com max_splits e min_n.

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

A conta é feita nesta chamada:

  • 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

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

  • 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.train(params = params, data = xgboost::xgb.DMatrix(X, label = label), nrounds = nrounds, verbose = 0)

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

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

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

Referências

Teoria

  • Tan, Y. S.; Singh, C.; Nasseri, K.; Agarwal, A.; Duncan, J.; Ronen, O.; Epland, M.; Kornblith, A.; Yu, B. (2025). Fast Interpretable Greedy-Tree Sums. Proceedings of the National Academy of Sciences, 122(7), e2310151122. doi:10.1073/pnas.2310151122

Ver a bibliografia completa do trama