Random Forest
As árvores de decisão são acuradas nos dados de treino mas instáveis — alta variância. A percepção de Leo Breiman (2001): não lute contra a variância de uma árvore; faça a média de muitas árvores diversas e deixe seus erros se cancelarem. O resultado é um dos algoritmos mais confiáveis de todo o ML — um padrão quase imbatível para dados tabulares, com praticamente nenhum ajuste.
A estatística da média
Faça a média de \(B\) estimadores, cada um com variância \(\sigma^2\) e correlação par a par \(\rho\). A variância do ensemble é
O segundo termo some conforme \(B\) cresce — mas o primeiro não. Fazer a média de árvores idênticas não conquista nada (\(\rho = 1\)); todo o jogo é tornar as árvores acuradas mas descorrelacionadas. As random forests injetam aleatoriedade duas vezes:
1. Bagging (bootstrap aggregating)
Cada árvore treina em uma amostra bootstrap: \(n\) linhas sorteadas com reposição do conjunto de treino. Cada amostra deixa de fora cerca de \(1 - (1 - 1/n)^n \approx 1/e \approx 37\%\) das linhas, então cada árvore vê um conjunto de dados perturbado diferente.
2. Subamostragem de atributos
Em cada divisão, apenas um subconjunto aleatório de atributos é elegível (tipicamente \(\sqrt{d}\) para classificação, \(d/3\) para regressão). Sem isso, todas as árvores começariam com o mesmo atributo dominante e permaneceriam altamente correlacionadas; restringir os candidatos força árvores diferentes a descobrir estruturas diferentes — este é o passo que transforma o bagging em uma random forest.
Previsão: voto majoritário (classificação) ou média (regressão) sobre todas as árvores.
flowchart TD
D[Dados de treino] --> B1[bootstrap 1] & B2[bootstrap 2] & B3[bootstrap ...B]
B1 --> T1[árvore 1<br><small>√d atributos/divisão</small>]
B2 --> T2[árvore 2]
B3 --> T3[árvore B]
T1 & T2 & T3 --> V[voto / média] A árvore única esculpe ilhas de ruído com confiança dura 0/1; o voto médio da floresta gera uma fronteira suave, de aparência calibrada, que ignora pontos de ruído individuais — a variância visivelmente diluída pela média.
Avaliação out-of-bag: validação de graça
As ~37% de linhas que uma árvore nunca viu são suas amostras out-of-bag (OOB). Preveja cada linha usando apenas as árvores que não treinaram nela, e você obtém uma estimativa honesta de generalização sem uma divisão de validação — conceitualmente uma validação cruzada embutida:
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=300, # mais = melhor, estabiliza; nunca sobreajusta via B
max_features='sqrt', # o botão de descorrelação
min_samples_leaf=1, # controle de profundidade da árvore se necessário
oob_score=True,
n_jobs=-1, # as árvores treinam em paralelo
random_state=0,
)
rf.fit(X_train, y_train)
rf.oob_score_ # ≈ estimativa honesta de acurácia, sem gastar divisão
Fatos-chave sobre \(B\) (n_estimators): adicionar árvores não pode sobreajustar — apenas estabiliza a média (o termo \((1-\rho)\sigma^2/B\) encolhe). O desempenho estabiliza num platô; o único custo de mais árvores é o processamento. O sobreajuste, quando ocorre, vem de as árvores individuais serem profundas demais em dados ruidosos demais — controle com min_samples_leaf ou max_depth.
Importância de atributos
Duas medidas padrão:
- Baseada em impureza (
rf.feature_importances_): redução total de impureza contribuída por cada atributo em todas as árvores. Rápida, mas enviesada em favor de atributos de alta cardinalidade (mais limiares possíveis = mais chances de parecer útil) e calculada em dados de treino; - Importância por permutação: embaralhe a coluna de um atributo em dados de validação e meça a queda no escore. Mais lenta, agnóstica ao modelo e mais confiável — a ponte para a Explicabilidade.
from sklearn.inspection import permutation_importance
imp = permutation_importance(rf, X_val, y_val, n_repeats=10, random_state=0)
Perfil prático
| Pontos fortes | acurácia excelente com configurações padrão; robusto a outliers/ruído; sem escalonamento; lida com altas dimensões e interações; estimativa OOB; treino paralelo; difícil de usar errado |
| Fraquezas | mais lento/pesado que uma árvore; perde a legibilidade da árvore única; não consegue extrapolar (herda as folhas da árvore); costuma ser superado por gradient boosting ajustado em benchmarks tabulares |
| Recorra a ele quando | você quer uma baseline tabular forte em uma linha; atributos e amostras estão bagunçados; o tempo de ajuste é escasso |
Bagging vs boosting
O bagging constrói árvores independentemente, em paralelo, e faz a média para cortar variância. O boosting — próxima aula — as constrói sequencialmente, cada uma corrigindo suas antecessoras, atacando o viés. Mesmo bloco de construção, filosofias opostas.
Material de aula
Notebook da aula (em português)
Notebook prático usado em sala — Aula 20 — Random Forest: abrir no Colab