Ir para o conteúdo

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 é

\[ \operatorname{Var}\big(\bar{f}\big) = \rho \sigma^2 + \frac{1 - \rho}{B}\, \sigma^2 \]

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]

Árvore de decisão única vs fronteira de decisão da random forest

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


Quiz