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 doml/splitvem 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/splitno início; a saída teste só vai aomodels/predict. Hiperparâmetros se escolhem noml/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 odata/selectantes doml/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"noml/splite noml/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_naou odata/replace_nae codifique fatores com odata/mutate. Uma imputação que usa estatísticas (média, mediana) deve sair só do treino.A árvore cresce até
max_depth,min_necpe é podada por custo-complexidade: entre as subárvores aninhadas, a validação cruzada dorpartcom 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_depthemin_nainda se escolhem noml/tune.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)); depoisprune(cp)com o CP da linha docptableescolhida pela regra 1-EP (ou do mínimo dexerror).
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...
Outras funções de pacotes que o bloco usa (11)
stats::reformulate(d$internos, response = ".y")stats::lm(f, treino)stats::glm(f, treino, family = stats::binomial())stats::binomial()rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, minsplit = minsplit, cp = cp, xval = if (poda == "nenhuma") 0L else min(10L, nrow(treino)))rpart::prune(arvore, cp = extras$poda$cp)figsr::figs(f, treino, max_splits = max_splits, min_n = min_n, mode = if (d$tarefa == "regressao") "regression" else "classification")ranger::ranger(f, treino, num.trees = trees, mtry = mm, min.node.size = min_n, max.depth = max_depth, probability = d$tarefa == "classificacao", seed = seed,...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...xgboost::xgb.train(params = params, data = xgboost::xgb.DMatrix(X, label = label), nrounds = nrounds, verbose = 0)xgboost::xgb.DMatrix(X, label = label)
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