Coleção aprendizado

Random forest

Combina árvores aleatorizadas e agrega suas previsões para regressão ou classificação.

O que o bloco faz

Combina árvores aleatorizadas e agrega suas previsões 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.

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.
Matriz de confusão
A tabela que cruza a classe verdadeira com a classe prevista. Dela saem acurácia, sensibilidade, especificidade e precisão, que podem contar histórias diferentes quando as classes têm tamanhos muito diferentes.

Quando usar

Use para modelar relações não lineares e interações com um conjunto de árvores. Requer ranger.

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.

  • As árvores são muitas o bastante para a média estabilizar; o mtry (preditores sorteados por corte) e o min_n regulam a correlação entre elas e o sobreajuste.

    Verificar:Ajustar hiperparâmetrosAvaliar previsões

    Se falhar: Escolha mtry, min_n e max_depth no ml/tune; mais árvores só custam tempo.

  • A importância (no models/importance) segue importancia: impureza (padrão) soma a redução de Gini/variância e favorece preditores contínuos ou com muitos valores distintos (Strobl et al. 2007); permutacao mede o aumento do erro fora da bolsa ao embaralhar o preditor (Breiman 2001) — na classificação, o erro de Brier que o ranger usa na floresta de probabilidade, média de (1 − p da classe observada)², e não a queda de acurácia; na regressão, o erro quadrático médio e impureza_corrigida (AIR) subtrai a importância de uma cópia permutada, sem esse viés (Nembrini et al. 2018). Todas descrevem o ajuste, não o efeito, e preditores correlacionados repartem a importância entre si; as duas últimas podem dar valores negativos (preditor sem informação).

    Verificar:Resumo

    Se falhar: Com preditores de tipos ou números de valores diferentes, use impureza_corrigida ou permutacao; leia o ranking como resumo, não como causa.

  • O resultado depende da semente: outra semente muda a divisão, os folds ou o próprio ajuste, e com poucos dados a diferença pode ser grande.

    Se falhar: Repita com outras sementes e leia a variação; não escolha a semente pelo resultado.

Configuração

trees define o número de árvores; mtry define preditores candidatos por divisão (0 usa piso da raiz quadrada do número de preditores); min_n é o tamanho mínimo do nó a dividir; max_depth limita profundidade; importancia escolhe a medida lida no models/importance — impureza (padrão), permutacao ou impureza_corrigida. Também recebe resposta, preditores, tarefa e seed.

Exemplo

d <- trama.ml::tr_ml_example("mtcars")
m <- trama.ml::tr_ml_forest(d, resposta = "mpg", preditores = "wt, hp, disp", trees = 100)
trama.models::tr_models_predict(m, d[1:3, ])

Como interpretar

A floresta retorna um ajuste agregado. Importância resume o motor; não é regra individual nem medida causal.

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

  • ranger::ranger() versão 0.18.0num.trees = trees, mtry (0 = ⌊√p⌋), min.node.size = min_n, max.depth, importance = "impurity", "permutation" ou "impurity_corrected" conforme importancia, seed do bloco; na classificação, floresta de probabilidade (probability = TRUE).

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

A conta é feita nesta chamada:

  • 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

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

  • 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

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
  • Wright, M. N.; Ziegler, A. (2017). ranger: A Fast Implementation of Random Forests for High Dimensional Data in C++ and R. Journal of Statistical Software, 77(1), 1-17. doi:10.18637/jss.v077.i01

Ver a bibliografia completa do trama