Aprendizado por Ensembles
Aprendizado por Ensembles é o nome geral dado para quando utilizamos múltiplos modelos em uma mesma tarefa de aprendizado de máquina. O tipo de ensemble mais simples consiste em treinar vários modelos distintos sobre todos os dados disponíveis para treinamento e, então, aplicar todos estes modelos em cada exemplo de teste. Em tarefas de classificação, cada modelo terá uma decisão e podemos, por exemplo, fazer uma votação para decidir a classe resultante. Em tarefas de regressão, uma possibilidade é tomar a média das saídas dos modelos e usar esta média como saída do ensemble.
Uma variação nesta forma de treinamento é fornecer exemplos diferentes para cada modelo. Durante o treinamento de um dos modelos, escolhemos aleatoriamente, com substituição, um subconjunto dos exemplos de treinamento para ser utilizado. Isto permite que modelos tenham “visões” diferentes dos dados; por exemplo, se há alguns poucos dados incorretos, alguns modelos não usarão estes dados durante seu ajuste, melhorando seu desempenho. Esta técnica é conhecida como bagging, uma contração de bootstrap aggregating.
Uma melhoria possível em relação a simplesmente fazer uma votação simples é fazer uma votação ponderada, onde o "voto" de cada modelo é ponderado pela sua acurácia em um conjunto de validação. Assim, é como se cada modelo tivesse pesos diferentes e o número de votos fosse proporcional a sua acurácia, resultando em modelos "ruins" (com baixa acurácia) tendo menos peso no resultado final.
A votação ponderada atribui peso exclusivamente baseado no erro do modelo em todo um conjunto de avaliação. Os exemplos neste conjunto contam igualmente para a composição do erro — errar um exemplo é igual a errar qualquer outro exemplo. Porém, podemos estar interessados em dar ênfase a alguns exemplos, penalizando mais modelos que erram estes exemplos. Para tanto, podemos alterar a métrica de erro para que esta pondere os exemplos por um peso atribuído a cada um, de forma que exemplos com alto peso contribuam mais para o erro. Errar exemplos com alto peso passa a ser mais custoso.
Esta ideia de atribuir pesos a exemplos está por trás da técnica de boosting. Nesta, modelos independentes são treinados de forma sequencial. O primeiro modelo é treinado e, então, aplica-se este modelo sobre os exemplos de treinamento e aumenta-se o peso dos exemplos incorretamente classificados. Então, um segundo modelo é introduzido e treinado, levando em conta os pesos estabelecidos pelo modelo anterior; este segundo modelo é aplicado sobre os exemplos e os pesos são novamente alterados baseado nos erros e acertos. Segue-se introduzindo novos modelos até algum critério de parada seja atingido (um erro mínimo ou um número máximo de modelos, tipicamente).
A maneira com que os modelos levam em conta os pesos dos exemplos pode ocorrer de duas formas. Na mais comum, os pesos são introduzidos no próprio algoritmo de treinamento do modelo. Por exemplo, no caso de árvores de decisão usando ID3, alteramos o cálculo do ganho de informação para decidir os atributos em cada nó de forma que este seja ponderado pelos pesos dos exemplos (relembre que o cálculo da entropia utiliza a proporção do número de exemplos em cada classe; podemos alterá-la para ser a proporção da soma dos pesos dos exemplos). Outra alternativa, aplicada quando não há uma maneira razoável de introduzir pesos a exemplos no algoritmo de treinamento, é selecionar subconjuntos dos exemplos para treinar o modelo, favorecendo exemplos com peso alto; uma forma de bagging ponderado. De qualquer forma, o efeito é cada modelo subsquente se ver forçado a dar atenção a exemplos que os modelos anteriores classificaram incorretamente. Depois de todos modelos terem sido treinados, eles são utilizados conjuntamente por votação ponderada pelos seus erros.
Os modelos utilizados tipicamente são modelos bastante simples. A motivação é construir modelos "fortes" a partir de modelos "fracos", pouco expressivos. Por exemplo, no AdaBoost os modelos podem ser tão simples quanto árvores de decisão compostas apenas da raíz (i.e. apenas um atributo é considerado por árvore).
Boosting pode ser compreendido matematicamente como uma descida por gradiente. Dada uma função de loss (contínua) que se deseja minimizar, cada modelo introduzido pode ser visto como uma função que reduz a loss na direção do gradiente. Esta compreensão pode ser generalizada para uma variação chamada Gradient Boosting Machines (GBM). Na metodologia GBM, cada modelo é ajustado ao resíduo do modelo anterior. O resíduo é a diferença da saída do modelo e o valor correto. Em uma GBM, não há necessidade de manter pesos para exemplos no conjunto de treinamento. Considerando exemplos (x,y), o laço principal de uma GBM opera, conceitualmente, da seguinte forma:
- Treina-se um modelo M1 sobre os exemplos (x,y)
- Treina-se um modelo R sobre o resíduo y — M1(x)
- Cria-se um novo modelo M2(x) = M1(x) + 𝛾R(x)
Onde 𝛾 é o peso dado ao modelo, baseado na loss deste. Esta formalização permite compreender GBM como um processo de modelagem aditiva, onde uma função é aproximada pela soma de múltiplos termos simples. Um exemplo de modelagem aditiva, em outro contexto, é a série de Fourier onde qualquer sinal periódico pode ser aproximado por uma combinação linear de sinais sinusoidais simples. Da mesma forma, aproximamos o modelo global de forma aditiva, com múltiplos modelos simples.
Quando aplicado o conceito de GBM a modelos baseados em árvores, pode-se fazer uma melhoria no processo de forma que no lugar de ter um 𝛾 global que aplica-se ao modelo como um todo, tem-se diferentes 𝛾 para cada decisão possível da árvore — isto é, estabelece-se diferentes pesos para diferentes regiões de decisão, que podem ter diferente níveis de confiança. Esta modificação leva o nome de Gradient Boosted Trees.
Aqui um bom recurso para mais detalhes sobre o funcionamento de Gradient Boosted Trees.
Gradient Boosted Trees é um dos algoritmos mais utilizados atualmente para dados tabulares, tanto em problemas de regressão como de classificação. As suas formas mais populares são o XGBoost (Extreme Gradient Boosting) ou LGBM (Light Gradient Boosting Machines). Ambas são bibliotecas que fornecem alto desempenho na execução do método.