ML Atlas

Machine learning do zero · Aula 5.2 · 27 de 33 aulas prontas · 10 min

Ensembles: por que muitas árvores vencem uma só

Em resumo

Um ensemble combina vários modelos imperfeitos cujos erros se anulam em parte. Por isso uma random forest ganha acurácia e estabilidade ao receber mais árvores.

Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Da aula 5.1: Árvores de decisão: vinte perguntas com dados Uma árvore sem limite de profundidade atinge acurácia de treino quase perfeita. Por que isso é um sinal de alerta?

Ver a resposta

Resposta certa: Porque ela provavelmente decorou passageiros específicos do treino, então vai generalizar pior

Uma árvore que divide até toda folha ficar pura se ajusta ao ruído da amostra de treino, o sinal clássico de overfitting.

Da aula 4.6: Pipeline: da tabela à previsão O que faz a validação cruzada no treino quando o scaler está dentro do pipeline?

Ver a resposta

Resposta certa: Ajusta o scaler de novo em cada fold, só na parte desse fold usada para aprender

Um pipeline é um modelo só, então em cada fold a máquina inteira aprende do zero. O fold que faz o papel de teste não toca nem o scaler nem o kNN.

Peça a uma pessoa para adivinhar quantas balas há num pote grande, e o palpite pode errar feio. Peça a algumas centenas de pessoas e tire a média dos palpites, e o resultado costuma ficar espantosamente perto. Ninguém ficou mais esperto. Os erros simplesmente apontavam para lados diferentes e se anularam. Dá para construir um modelo do mesmo jeito, a partir de vários modelos medianos?

Preveja, depois confira Uma floresta aleatória com uma só árvore (amostra aleatória de passageiros, 2 atributos para escolher em cada divisão) e uma árvore comum crescida até o fim: qual se sai melhor nos passageiros de teste?
Qual é o seu grau de certeza?

Experimento interativo

Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.

Ver a resposta

Resposta certa: A árvore comum

A floresta de uma árvore acerta 70,9% dos passageiros de teste e a árvore comum 73,9%: uma única árvore aleatorizada é até mais fraca. O que ajuda é tirar a média de muitas árvores: 10 árvores dão 76,1% e 100 árvores 76,9%.

Experimente

  • Comece com o controle do número de árvores em um e compare a floresta com a árvore única. Com uma árvore só, a “floresta” é apenas uma árvore aleatorizada.
  • Aumente aos poucos o número de árvores e observe a acurácia de teste da floresta. Repare onde ela para de melhorar de forma perceptível.
  • Continue aumentando o número de árvores. A acurácia da floresta começa a cair, como a da árvore profunda na lição 9, ou se estabiliza?
  • Compare a árvore única com a floresta grande. Em qual você confiaria para um caso que nunca viu?

A ideia em poucas palavras

Vamos ver agora, em palavras simples, o que você acabou de manipular.

Um ensemble é um modelo feito de vários modelos cujas previsões são combinadas, por votação no caso de categorias ou por média no caso de números. O ensemble mais famoso é a floresta aleatória (random forest), apresentada por Leo Breiman em 2001: um grande número de árvores de decisão, cada uma crescida de um jeito um pouco diferente, votando juntas.

A lição 9 terminou com uma fraqueza das árvores: uma pequena mudança nos dados pode produzir uma árvore completamente diferente. Uma única árvore profunda é como um palpiteiro confiante demais — afiado, mas instável. Uma floresta transforma essa instabilidade numa vantagem. Se cada árvore comete erros diferentes, a votação por maioria acerta com mais frequência que uma árvore típica.

Por que funciona

A palavra-chave é diferentes. Tirar a média de modelos idênticos não muda nada; os erros são os mesmos. Uma random forest faz as árvores diferirem de duas maneiras. Primeiro, cada árvore é treinada numa amostra bootstrap: linhas sorteadas do conjunto de treino com reposição, então cada árvore vê um conjunto de dados um pouco diferente, com algumas linhas repetidas e outras de fora. Essa ideia se chama bagging. Segundo, em cada divisão a árvore só pode escolher entre um subconjunto aleatório dos atributos, para que nem todas se apoiem no mesmo atributo mais forte.

A estatística nos diz quanto isso ajuda. Se o erro de cada árvore tem variância σ² e os erros de duas árvores quaisquer têm correlação ρ, a média de n árvores tem variância

ρ·σ² + (1 − ρ)·σ² / n

O segundo termo encolhe conforme você adiciona árvores e desaparece para n grande. O primeiro, não: é a parte do erro que todas as árvores compartilham. É por isso que a aleatoriedade importa. Quanto menos as árvores se parecem entre si (quanto menor o ρ), mais a floresta ganha — e é por isso que adicionar árvores além de certo ponto quase não traz nada.

Uma consequência agradável: adicionar mais árvores não faz uma floresta decorar mais. Cada árvore nova só entra na votação, e as previsões da floresta se estabilizam em vez de ficarem mais malucas. O custo de mais árvores é tempo de computação, não overfitting.

Existe uma segunda grande família de ensembles, o boosting, que funciona ao contrário: em vez de árvores independentes que votam, ele constrói árvores pequenas uma depois da outra, cada uma corrigindo os erros das anteriores. Árvores com gradient boosting vencem com frequência em dados tabulares, inclusive em muitas competições do Kaggle.

Erro comum

Um ensemble não consegue criar informação que não está nos atributos. Se todas as árvores são enganadas do mesmo jeito — por exemplo, por um atributo que vaza a resposta ou por dados que não representam as pessoas para quem você vai prever —, a votação só repete o mesmo erro com mais confiança. O termo correlacionado da fórmula é exatamente esse erro compartilhado. Outro erro é supor que mais árvores sempre ajudam: depois que os ganhos se achatam, árvores extras só custam tempo. Por fim, uma floresta é muito mais difícil de ler que uma árvore única; você troca o fluxograma por acurácia.

Árvores e florestas dividem o espaço de atributos em caixas. Na próxima lição conhecemos um modelo que, em vez disso, curva a fronteira suavemente: a rede neural.

Quiz

Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.

1. Por que tirar a média de muitas árvores só ajuda se as árvores forem diferentes?
Ver a resposta

Resposta certa: Porque árvores idênticas cometem erros idênticos, então a média não anula nada

Os erros só se anulam quando apontam para lados diferentes; a parte compartilhada do erro continua depois da média.

2. O que é uma amostra bootstrap?
Ver a resposta

Resposta certa: Linhas sorteadas do conjunto de treino com reposição

Sortear com reposição dá a cada árvore um conjunto de dados um pouco diferente, o que faz as árvores discordarem de forma útil.

3. Você aumenta uma random forest de 300 para 3.000 árvores. Qual é o efeito mais provável?
Ver a resposta

Resposta certa: A acurácia fica mais ou menos igual, enquanto o treino demora muito mais

Depois que a parte independente do erro já se diluiu na média, mais árvores acrescentam computação, mas pouca acurácia e nenhuma memorização extra.

Pontos-chave

  • Um ensemble combina vários modelos; erros que apontam para lados diferentes se anulam.
  • Uma random forest faz as árvores diferirem com amostras bootstrap e subconjuntos aleatórios de atributos.
  • O erro compartilhado por todas as árvores não some na média, então os ganhos se achatam conforme se adicionam árvores.
  • Mais árvores custam tempo, mas não causam overfitting na floresta; o boosting é uma segunda família de ensembles, sequencial.

Mais a fundo: fórmula, código, prática

A matemática

Uma floresta tira a média das previsões de n árvores. Seja σ² a variância do erro de cada árvore e ρ a correlação entre os erros de quaisquer duas árvores. Então a média tem variância:

  • Var = ρ·σ² + (1 − ρ)·σ² / n
  • O segundo termo, (1 − ρ)·σ² / n, é a parte que diminui quando você acrescenta árvores.
  • O primeiro termo, ρ·σ², é o piso: o erro que todas as árvores compartilham. Nenhum número de árvores o remove.
  • Para árvores independentes (ρ = 0) a variância cai como σ² / n. Para árvores idênticas (ρ = 1) ela não cai nada.
  • Amostras bootstrap e subconjuntos aleatórios de variáveis existem para reduzir ρ.
  • Tirar a média reduz apenas a parte de variância do erro. O viés que todas as árvores compartilham permanece, então uma floresta de árvores enviesadas continua enviesada.
No código (Python)

Uma floresta aleatória de verdade nos passageiros do Titanic, testando 2 variáveis em cada divisão. Ela usa a mesma divisão do código da lição 9, não a do lab, então os números diferem dos 73,9% e 76,9% do lab. O notebook indicado abaixo da saída baixa os dados sozinho.

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

df = pd.read_csv("data/raw/titanic.csv")
X = pd.DataFrame({"female": (df["sex"] == "female").astype(int)}).join(df[["pclass", "age", "sibsp", "parch", "fare"]])
Xtr, Xte, ytr, yte = train_test_split(X, df["survived"], test_size=0.3, stratify=df["survived"], random_state=1)
Xtr, Xte = Xtr.fillna({"age": Xtr["age"].median()}), Xte.fillna({"age": Xtr["age"].median()})  # mediana do treino para ambos
tree = DecisionTreeClassifier(random_state=0).fit(Xtr, ytr)
print(f"one full tree: test {tree.score(Xte, yte):.3f}")
for n in (1, 10, 100, 500):
    forest = RandomForestClassifier(n_estimators=n, max_features=2, random_state=0).fit(Xtr, ytr)
    print(f"forest of {n:3d}: test {forest.score(Xte, yte):.3f}")
oob = RandomForestClassifier(n_estimators=500, max_features=2, oob_score=True, random_state=0).fit(Xtr, ytr)
print(f"out-of-bag estimate (500 trees, training rows only): {oob.oob_score_:.3f}")

Saída

one full tree: test 0.780
forest of   1: test 0.754
forest of  10: test 0.806
forest of 100: test 0.802
forest of 500: test 0.802
out-of-bag estimate (500 trees, training rows only): 0.809

Uma árvore aleatorizada (0,754) é pior que uma árvore completa (0,780), mas a votação supera as duas: 10 árvores dão 0,806, e 100 e 500 árvores dão 0,802. A floresta se estabiliza em vez de cair como a árvore profunda na lição 9. A estimativa out-of-bag, 0,809, é calculada apenas com as linhas de treino.

Para quem pratica
  • Comece com os padrões, por exemplo de 100 a 500 árvores, e depois verifique com dados de validação onde a curva se achata. Depois desse ponto, mais árvores só custam tempo e memória.
  • Ajuste o número de variáveis testadas por divisão e a profundidade ou o tamanho das folhas antes de ajustar o número de árvores. Eles mudam o quanto as árvores são correlacionadas.
  • Use a pontuação out-of-bag (oob_score=True) como estimativa gratuita: cada linha de treino é prevista apenas pelas árvores cuja amostra bootstrap a deixou de fora, e essas previsões são avaliadas. Não ajuste com o conjunto de teste.
  • Verifique de onde vêm os dados antes de confiar na votação. Se uma variável com vazamento engana todas as árvores, a floresta repete o erro com mais confiança.
  • Uma floresta é difícil de ler. A importância das variáveis dá um ranking aproximado, mas favorece variáveis com muitos valores distintos; a importância por permutação em dados separados é uma verificação mais segura.

Vá mais fundo no Atlas

Verbetes da enciclopédia sobre as ideias desta aula: