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 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.As árvores são muitas o bastante para a média estabilizar; o
mtry(preditores sorteados por corte) e omin_nregulam a correlação entre elas e o sobreajuste.Verificar:Ajustar hiperparâmetrosAvaliar previsões
Se falhar: Escolha
mtry,min_nemax_depthnoml/tune; mais árvores só custam tempo.A importância (no
models/importance) segueimportancia: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);permutacaomede o aumento do erro fora da bolsa ao embaralhar o preditor (Breiman 2001) — na classificação, o erro de Brier que orangerusa 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 eimpureza_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_corrigidaoupermutacao; 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"conformeimportancia,seeddo 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,...
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(f, treino, method = if (d$tarefa == "regressao") "anova" else "class", control = rpart::rpart.control(maxdepth = max_depth, minbucket = min_n, m...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")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. (2001). Random Forests. Machine Learning, 45(1), 5-32. doi:10.1023/A:1010933404324
- Nembrini, S.; König, I. R.; Wright, M. N. (2018). The revival of the Gini importance?. Bioinformatics, 34(21), 3711-3718. doi:10.1093/bioinformatics/bty373
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