Neste post daremos início a nossa trilogia de posts sobre os algoritmos de gradiente boosting, que são o state of the art em Machine Learning quando se pensa em dados tabulares, pois apresentam um bom equilíbrio entre tempo de processamento e performance.

Na primeira parte, falaremos sobre o que são métodos de ensemble e um pouco da história de desenvolvimento de alguns modelos de boosting. A segunda parte será dedicada exclusivamente ao XGBoost, que é provavelmente o mais conhecido desses modelos. No último post será feita uma comparação deste com o LightGBM e o CatBoost, de modo a fornecer um guia de quando usar cada um destes algoritmos.

Nesse e nos próximos posts vamos assumir que você já tenha alguns conhecimentos prévios sobre conceitos de aprendizado supervisionado e modelos de machine learning baseados em árvores de decisão. Caso queira uma introdução rápida e intuitiva sobre os assuntos, recomendamos dar uma olhada aqui e aqui.

Sem mais delongas, vamos direto à explicação!

 

Introdução ao Ensemble Learning

Vamos começar com uma introdução intuitiva do que métodos de ensemble são. Quando você está construindo um modelo, você quer escolher aquele com a melhor performance de acordo com alguma métrica. Considere este exemplo.

 

Aqui treinamos uma Árvore de Decisão, uma Regressão Logística e um KNN. Se acurácia fosse nossa métrica escolhida, então a Árvore de Decisão seria nossa melhor escolha, certo? O problema de fazer isso é que estamos descartando os outros modelos, que foram capazes de aprender diferentes padrões que podem ter propriedades úteis. O que podemos fazer sobre isso?

Considere outro exemplo.

Quando você conduz uma pesquisa de opinião, você não aceita apenas uma “melhor” resposta. Você considera uma resposta combinada de todos os participantes, e usa estatísticas como a moda ou a média para representar as respostas. As respostas combinadas provavelmente vão levar a uma decisão melhor do que confiar em apenas uma resposta. É o princípio da wisdom of the crown (sabedoria das multidões) entrando em prática. 

O mesmo princípio se aplica aos métodos de ensemble, onde podemos formar um novo modelo combinado os existentes.

Esse agrupamento objetiva, ao juntar múltiplos modelos mais fracos, diminuir a suscetibilidade geral deles ao viés e a variância, tornando-os mais robustos. Portanto, os métodos de Ensemble devem levar em conta a maneira com a qual eles agrupam os modelos, associando os algoritmos de forma a minimizar suas desvantagens individuais no modelo final.

Isto é ensemble learning, uma das técnicas mais efetivas em Machine Learning. Existem variados métodos de ensemble, mas neste texto focaremos principalmente em Bagging, Boosting e Stacking, os tipos mais utilizados em Data Science. 

 

Bagging

Antes de entendermos Bagging precisamos primeiro entender o que é Bootstrapping. Essa técnica consiste em subdividir nosso dataset, tomando elementos de forma aleatória e com reposição.  

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. 

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. Isso nos permite, por exemplo, entender melhor o comportamento da média e do desvio padrão dos dados que estão além do dataset.

O bagging treina modelos individuais usando uma amostra aleatória para cada. Depois dos modelos individuais serem treinados com suas respectivas amostras, eles são agregados usando uma média nos problemas de regressão ou uma votação nos problemas de classificação. Essa é a técnica usada no Random Forest, por exemplo, que usa diversas árvores de decisão como modelos individuais, além de fazer uma seleção aleatória de variáveis também.

Mas por que usar o bagging é útil?

Primeiro, ajuda a reduzir a variância, já que a amostragem é aleatória. O viés também pode ser reduzido, já que usamos uma média ou votação para combinar os modelos. Por causa do alto número de estimadores usados, bagging fornece estabilidade e robustez. 

Por outro lado, o realizar o bagging tem um custo computacional alto, em termos de espaço e tempo, pois cada nova iteração é criada uma amostra diferente. Além disso, essa técnica só funciona se o modelo base já tem uma boa performance. Usar o bagging em um modelo base ruim pode fazer com que o modelo final fique ainda pior. Por último, por se tratar de um preditor homogêneo, ou seja, os modelos individuais usam o mesmo algoritmo, o bagging pode não reconhecer alguns padrões de decisão da base.

 

Boosting

Os métodos de Boosting formam uma outra categoria de Ensemble Learning, com foco principalmente em diminuir o viés dos modelos iniciais. Esse tipo de aprendizado se tornou muito conhecido no meio de Data Science nos últimos anos por obter ótimos resultados em competições de Machine Learning, devido a sua grande adaptabilidade. Mas qual a teoria por trás desse algoritmo?

Assim como Bagging, os métodos de Boosting têm como base treinar várias modelos mais simples com a finalidade de produzir um modelo final mais robusto. No entanto, nos algoritmos de Boosting, os modelos não são mais treinados de forma independente entre si, mas de maneira sequencial, a partir de uma ajuste  dos modelos treinados previamente.

Para maximizar o desempenho do preditor final, o Boosting treina iterativamente novos modelos com um enfoque nas observações que os modelos anteriores erraram mais, tornando a predição mais resistente ao viés. Em seguida, atualiza-se o modelo para priorizar as predições com maior erro nas observações da base de teste. O modo como ocorre esse treinamento e essa atualização é onde diferem os diferentes algoritmos de Boosting.

Como o principal foco dos métodos de Boosting é de reduzir o viés dos weak learners (modelos simples), é ideal escolher como base para a agregação um modelo simples com alto viés e baixa variância. Decorrente disso, geralmente escolhemos árvores de decisão de baixa profundidade para compor o preditor final.

AdaBoost

Adaptive Boosting é um algoritmo que consiste em combinar de forma sequencial vários modelos mais fracos. Sendo assim, o weak learner subsequente leva em consideração as predições do anterior, para formar um preditor mais conciso. O diferencial desse algoritmo é que as predições mais difíceis (aquelas em que o weak learner da iteração atual mal previu) recebem um peso maior no preditor seguinte, buscando assim uma maior otimização do algoritmo final.

Noutros termos, cada modelo é inicializado com um peso padrão, que define seu poder de decisão no modelo final. A partir disso, conforme vamos treinando esses modelos simples, cada weak learner ganha um peso maior para as observações que ele prevê corretamente, e um peso menor para as observações em que ele possui um alto índice de erro.

Repare aqui que existem dois pesos. O primeiro é o peso para cada observação que representa o grau de foco que a iteração em questão deve dar para aquela observação. A cada novo modelo treinado, esses pesos das amostras são atualizados. Já o segundo é um peso para cada modelo que representa seu poder de decisão quando os modelos combinados. Eles são atribuídos apenas uma vez para cada estimador.

Dessa forma, os weak learners com maior precisão terão maior poder de decisão no modelo final.

Gradient Boosting

O Gradient Boosting é um outro tipo de algoritmo de Boosting, que difere do Adaboost quanto à maneira com a qual os modelos são treinados com relação aos anteriores.

Ao invés de estabelecer pesos para os weak learners, o Gradient Boosting treina novos modelos diretamente no erro dos modelos anteriores. Ou seja, os novos modelos tentam prever o erro dos modelos anteriores em vez de prever independentemente o target. Dessa forma, obtemos a predição final somando a predição de todos os weak learners.

O algoritmo do Gradient Boosting funciona assim: o primeiro modelo faz uma aproximação bem simples da predição, e obtemos os nossos erros residuais (observado menos o previsto); depois, treinamos mais modelos nesses erros residuais, para tentar predizer o erro do primeiro modelo. Dessa forma, quando somamos as predições de cada modelo para obter a predição final, obtemos uma versão mais corrigida da primeira predição:

Repetimos esse processo por várias iterações, obtendo erros residuais cada vez menores.

 

Stacking

Para explicar como o stacking funciona, vamos usar uma analogia esportiva.

Considere uma corrida em grupo, onde os corredores correm até passar o bastão para o próximo no caminho. Este é um bom exemplo de trabalho em equipe. Enquanto todos os membros do time devem ser competidores fortes, cada indivíduo tem um papel especial baseado em suas habilidades. Por exemplo, o âncora é o último membro a receber o bastão e aquele que completa a corrida. Em algum nível, ele é como o líder do time. Para ser efetivo nessas corridas, o âncora deve: saber as forças e fraquezas de cada membro do time, definir responsabilidades para cada membro e por fim, participar da corrida.

Métodos de stacking levam esta ideia das corridas em grupo. Ao invés de passar um bastão, modelos individuais passam suas predições para o próximo modelo. Abaixo temos um diagrama ilustrando a arquitetura de ensembles de stacking.

Cada modelo individual usa o mesmo dataset e input features. Esses são os estimadores da primeira camada. Então, os estimadores passam suas predições como features adicionais para o estimador da segunda camada.

Até agora, vimos métodos de ensemble que usam simples operações aritméticas como a média ou a moda para combinar os modelos. No entanto, no stacking, o combinador é por si só um modelo passível de ser treinado. Além disso, o modelo combinador não tem apenas as predições como features, mas também o dataset original. Isto permite determinar qual estimador é mais acurado dependendo das features de input. 

O modelo agregador desempenha um papel similar ao âncora na corrida. É também o último membro da equipe, e aquele que fornece a predição final. Para ser efetivo, o modelo combinador deve dispor das mesmas características que o âncora: deve aprender a identificar as forças e fraquezas dos estimadores individuais, escolhe qual modelo fornece a melhor predição dependendo das features de input, e por fim, é também um modelo útil para aprender padrões com o objetivo de prever o target.

Conclusão

Chegamos ao fim do nosso primeiro post sobre a série de Gradient Boostings. Esperamos que tenha ficado claro o que são métodos de ensemble learning e como eles contribuir na tarefa de construir um modelo com a melhor performance possível. O próximo post será dedicado exclusivamente ao XGBoost, explicando como ele constrói suas árvores de decisão em cada iteração, além de algumas melhorias que o tornam um algoritmo extremamente eficiente quando comparado ao Gradient Boosting, por exemplo.