Coleção aprendizado

CART · árvore de decisão

Ajusta uma árvore de decisão para regressão ou classificação; cada caminho até uma folha corresponde a uma regra.

O que o bloco faz

Ajusta uma árvore de decisão para regressão ou classificação; cada caminho até uma folha corresponde a uma regra.

Antes de continuar

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

Erro padrão
O desvio padrão de uma estimativa: quanto ela variaria se o estudo fosse repetido com outra amostra. Diminui quando a amostra cresce e é a base dos intervalos de confiança e dos testes.
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 quiser inspecionar decisões locais por limiares e folhas.

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.

  • A árvore cresce até max_depth, min_n e cp e é podada por custo-complexidade: entre as subárvores aninhadas, a validação cruzada do rpart com min(10, n) folds (dentro do treino, com a semente do bloco; com n ≤ 10 vira deixa-um-fora, e com poucas dezenas de linhas o erro de validação é muito variável e a poda, instável) escolhe a menor cujo erro não passa do mínimo mais um erro-padrão (regra 1-EP, poda = "1ep"). poda = "minimo" fica com a de menor erro, maior e mais variável; "nenhuma" desliga a poda.

    Verificar:Ajustar hiperparâmetrosAvaliar previsões

    Se falhar: Se a árvore podada ficar só com a raiz, os preditores não reduziram o erro de validação além do ruído; confira o desempenho no teste antes de afrouxar a poda. max_depth e min_n ainda se escolhem no ml/tune.

  • Uma árvore única é instável: pequenas mudanças nos dados (outra semente no ml/split) podem trocar os cortes e as regras.

    Se falhar: Refaça com outra semente e compare as regras; para previsão estável, ml/forest.

  • A importância (no models/importance) é a redução de impureza somada nos cortes (inclusive substitutos) de cada preditor, 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 a resposta, preditores numéricos e tipo de tarefa. max_depth limita a profundidade; min_n define o mínimo de observações por folha; seed reproduz o ajuste. Requer rpart.

Exemplo

d <- trama.ml::tr_ml_example("iris_binaria")
m <- trama.ml::tr_ml_cart(d, resposta = "Species", preditores = "Petal.Length, Petal.Width", max_depth = 3)
trama.ml::tr_ml_rules(m)

Como interpretar

Cada linha de regras representa uma folha e seu valor previsto. ml/tree_plot mostra a estrutura e models/importance resume importância do motor.

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 models/predict.

Implementação

  • rpart::rpart() versão 4.1.24method = "anova" na regressão e "class" (Gini) na classificação; rpart.control(maxdepth, minbucket = min_n, minsplit = 2·min_n, cp, xval = min(10, n)); depois prune(cp) com o CP da linha do cptable escolhida pela regra 1-EP (ou do mínimo de xerror).

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

A conta é feita nesta chamada:

  • 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

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.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.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

  • Breiman, L.; Friedman, J. H.; Olshen, R. A.; Stone, C. J. (1984). Classification and Regression Trees. Belmont: Wadsworth; reimpressão New York: Routledge, 2017. doi:10.1201/9781315139470

Livro-texto

  • 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
  • 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

Complementar

  • Strobl, C.; Boulesteix, A.-L.; Zeileis, A.; Hothorn, T. (2007). Bias in random forest variable importance measures: Illustrations, sources and a solution. BMC Bioinformatics, 8, 25. doi:10.1186/1471-2105-8-25

Ver a bibliografia completa do trama