Modelos de Predição | Random Forest

Quem disse que as árvores não entram em consenso?

Fernando Matsumoto
Turing Talks
6 min readSep 15, 2019

--

Escrito por Fernando Matsumoto e Guilherme Fernandes.

Imagem por Sebastian Unrau em Unsplash (modificada). Embora essa imagem possa parecer um ótimo habitat para qualquer um dos livros de machine learning da O’Reilly, este post não será tão abrangente assim.

Bem vindos a mais um post entusiastas de inteligência artificial.

Até agora na série de modelos de predição do Turing Talks temos abordado algoritmos de aprendizado que atuam sozinhos, isto é, apenas um procedimento é aplicado sobre os dados para realizar predições. Mas será que é possível combinar modelos? Isso poderia trazer resultados melhores?

Sim, é possível combinar modelos e essa técnica é chamada de ensemble learning (aprendizado conjunto). Em linhas gerais ela combina um número finito de modelos para obter uma melhor performance preditiva.

Random Forest (Floresta Aleatória) é um método de aprendizado conjunto. A ideia, porém, é treinar várias árvores de decisão (descorrelacionadas), obtidas a partir de amostras do dataset, e fazer predições utilizando os resultados que mais aparecem em caso de um problema de classificação, ou a média dos valores obtidos em caso de regressão.

À primeira vista, essa parece uma ideia bem simples e intuitiva: gerar vários modelos e combinar as suas predições. Mas pensemos no caso das árvores. Se criarmos várias árvores e treinarmos todas elas no mesmo dataset, suas predições serão idênticas. A alternativa mais imediata seria dividir o dataset em várias partes, uma para cada árvore. Dessa forma, cada árvore teria o seu próprio dataset e, portanto, geraria predições diferentes. O problema dessa abordagem é o que cada árvore teria muitos poucos dados de treino.

Bootstrapping

A solução para esse problema vem do campo da estatística. Quando fazemos uma análise estatística, é muito comum termos acesso à apenas uma parte dos dados. Por exemplo, pesquisas de intenção de voto são feitas com uma pequena amostra da população, visto que seria quase impossível entrevistar todos os brasileiros. Nesses casos, é importante entender as propriedades estatísticas da amostra utilizada em relação à população. Por exemplo, será que as intenções da amostra entrevistada são boas aproximações das intenções da população como um todo?

Assumindo que a amostra é representativa da população (ambas têm a aproximadamente a mesma distribuição), podemos “reconstruir” a população criando várias (infinitas) cópias da amostra. Como a população deve ser parecida com a amostra, esperamos que essa “reconstrução” se aproxime da população inteira, como representado abaixo:

A amostra.
A população “reconstruída”.

Em estatística, a partir dessa população reconstruída, podemos criar novas amostras e, dessa forma, estudar as propriedades das amostras em relação à população. Esse processo é chamado de bootstrapping, e as novas amostras são chamadas de bootstrap samples (amostras de bootstrap).

Observe que o processo de criar novas amostras a partir da população reconstruída é equivalente a pegar elementos aleatórios da amostra inicial com reposição. Ou seja, escolhemos um elemento da amostra inicial, anotamos ele e colocamos ele de volta na amostra inicial antes de escolher o próximo elemento.

Bagging

Lembre-se de que o nosso problema era como criar datasets diferentes para cada árvore. Utilizando bootstrapping, podemos fazer exatamente isso: primeiro, criamos uma bootstrap sample para cada modelo; depois agregamos (combinamos) esses modelos. Por isso, essa técnica é chamada de bootstrap aggregating ou bagging.

Computacionalmente, para treinar M árvores em um dataset de tamanho N, faríamos:

Repita M vezes:
Retire com reposição N observações do dataset (bootstrap);
Treine uma árvore com essas observações de bootstrap.

Depois de treinar todas as árvores, a predição é feita tomando a média dos resultados obtidos por todas as árvores, no caso de uma regressão, ou utilizando o valor que aparece mais (votação), em caso de classificação.

Obs: o procedimento de bagging descrito acima é válido para qualquer modelo, e não exclusivamente para árvores.

Random Forests

Essencialmente, ao se aplicar bagging com modelos de árvores de decisão se obtém por sua vez um modelo de aprendizado conjunto. Porém, é necessário mais um fator para definir uma floresta aleatória.

Além do fato das florestas aleatórias serem treinadas em diferentes conjuntos de dados, também, é feita uma seleção aleatória das features que vão estar contidas nesse conjunto de dados; isso é chamado de feature randomness. Ou seja, a árvore é “duplamente aleatória”, graças ao bagging e a aleatoriedade das features. Mas por que isso é necessário?

O ponto principal é garantir a baixa correlação entre as árvores. Isso significa que queremos que qualquer duas árvores de decisão escolhidas ao acaso não consigam se descrever por meio de uma relação linear. Quando utilizamos bootstrapping já conseguimos diminuir esse fator, isso devido a alta sensibilidade das árvores de decisão, isto é, pequenas alterações no dataset causam mudanças significativas no modelo gerado. E ao fazer seleção de features aleatoriamente corroboramos para as árvores serem mais diversificadas.

Mas você deve estar se perguntando, por que a baixa correlação é importante?

Suponha que você acorde de manhã e queira decidir se vai ou não levar seu guarda chuva quando sair. Você decide olhar em alguns jornais e considera que a combinação dos resultados vai garantir uma maior acurácia da previsão do tempo do que somente de um deles. O resultado não seria desfavorecido se ao invés de fornecerem predições diferentes (possivelmente com modelos diferentes) ambos usassem uma cópia de uma terceira fonte?

Quando temos modelos descorrelacionados é mais provável que eles não vão cometer os mesmos erros. A diversificação garante que os erros sejam “cancelados” ou “sobrepostos” por acertos, fornecendo um modelo mais robusto em termos de performance.

Modelos complexos ou modelos simples?

Para acompanhar essa parte, será necessário relembrar os conceitos de variância e viés (bias-variance tradeoff) que vimos no Turing Talks #10. De forma simplificada, o viés é o erro devido à falta de complexidade do modelo (correspondente ao underfitting) e a variância é o erro devido ao excesso de complexidade do modelo (correspondente ao overfitting). Há também um erro intrínseco, ou seja, que vem dos dados.

Como não conseguimos alterar o erro intrínseco, vamos tratar apenas dos outros dois erros. A principal propriedade dessas duas medidas é que conforme uma aumenta a outra diminui. Por quê? Porque o viés é mais alto para modelos menos complexos, e é justamente nesses casos em que a variância é menor. Controlar o erro de um modelo é, portanto, uma questão de balancear esses dois valores.

O cancelamento de erros causado pelo bagging e pela aleatoriedade de features corresponde à redução da variância do modelo e, portanto, do overfitting. Dessa forma, começar com um modelo de alta variância não seria muito problemático. De fato, visto que o viés tende a diminuir conforme a variância aumenta, deve fazer sentido escolher um modelo de alta variância e viés baixo, e utilizar bagging para reduzir essa variância. O modelo resultante teria então viés e variância relativamente reduzidos.

Por outro lado, se escolhermos um modelo com variância alta demais, o bagging pode ser incapaz de reduzir suficientemente a variância. Por isso, ainda que os modelos base devam ter variância intermediária-alta, pode ser benéfico limitá-la pelo menos parcialmente. No caso de random forests, isso corresponde a utilizar árvores com alturas intermediárias, ou utilizar outros hiperparâmetros para controlar as árvores.

Abordagem prática

https://nbviewer.jupyter.org/gist/fernandokm/12f21c927cb500840d48905aae8fc538

Conclusão

Random forest é um modelo versátil, assim como as árvores de decisão, porque o modelo serve tanto para classificação como regressão. Possui viés e variância reduzida o que implica em melhores resultados, consistentemente, além de garantir robustez ao modelo. Por fim, são intuitivos, rápidos para se treinar (quando comparados a outros modelos de mesmo porte como redes neurais, por exemplo) e não precisam de muita alteração para se obter um primeiro modelo razoável.

A relação tempo de treinamento e performance desse algoritmo faz juz a sua popularidade. Já foi implementado em diversas linguagens de programação, então agora é com você!

Chegamos ao final de mais um Turing Talks. Esperamos que tenham curtido a leitura assim como adoramos escrevê-lo.

Lembrando que pra ficar antenado com assuntos de IA no geral basta nos seguir nas redes: Facebook, Instagram e LinkedIn . Assim como não pode deixar de seguir nossa página do Medium.

Por hoje é só!

Abraços

--

--