Uma breve introdução ao algoritmo de Machine Learning Gradient Boosting utilizando a biblioteca Scikit-Learn

Jonhy Silva
Equals Lab
Published in
7 min readJun 22, 2020

Antigamente, tínhamos a visão de que a Inteligência Artificial só servia para criar soluções totalmente futurísticas e bem distantes da nossa realidade. Essa visão com o tempo foi caindo por terra, hoje sabemos que podemos usar algoritmos de Machine Learning para resolver problemas e criar soluções palpáveis e condizentes com a nossa realidade.

Técnicas de Machine Learning estão cada vez mais inseridas em nosso dia a dia, e consequentemente, mais acessíveis. A criação de algumas bibliotecas contribuíram bastante para isso, deixando-as simples de serem estudadas e utilizadas por qualquer pessoa.

Eu sou uma dessas pessoas!!

Gif retirado do site https://giphy.com/

Sempre gostei muito de estudar, entender e tentar resolver problemas utilizando algoritmos de Machine Learning. Ultimamente, decidi conhecer um pouco mais um algoritmo que já me chamava a atenção há um tempo: o Gradient Boosting.

Nesse artigo, tenho como objetivo trazer de uma forma simples e didática uma breve introdução do que é algoritmo, sua classe e seu funcionamento. Utilizarei como biblioteca o Scikit-Learn. Vem comigo?

Algoritmos Boosting

O algoritmo Gradient Boosting é um técnica Boosting, incluída dentro do grupo de classificadores Ensemble. Esses classificadores são métodos que utilizam uma combinação de resultados de preditores fracos, com o objetivo de produzir um melhor modelo preditivo. Os preditores fracos são modelos que, quando utilizados individualmente possuem uma acurácia abaixo do esperado.

Na construção do modelo, geralmente, são utilizadas árvores de decisão como modelo fraco. Porém, não existe uma restrição quanto ao uso de outros algoritmos na construção de um classificador Ensemble.

Na técnica de Boosting, cada classificador fraco é treinado com um conjunto de dados, de forma sequencial e de uma maneira adaptativa, onde um modelo base depende dos anteriores, e no final são combinados de uma maneira determinística. Diferente de algoritmos de Bagging (outro algoritmo Ensemble tradicional), por exemplo, onde os preditores fracos são treinados de forma individual e paralela, e ao final são combinados seguindo um processo determinístico de média, como uma votação.

Exemplo de funcionamento do Algoritmo Boosting

Agora que sabemos um pouco mais da classe em que o algoritmo está inserido, vamos falar um pouco sobre ele.

Gradient Boosting

O algoritmo Gradient Boosting é uma técnica de aprendizado de máquina para problemas de regressão e classificação, que produz um modelo de previsão na forma de um conjunto de modelos de previsão fracos, geralmente árvores de decisão. Ele constrói o modelo em etapas, como outros métodos de reforço, e os generaliza, permitindo a otimização de uma função de perda diferenciável arbitrária.

O objetivo do algoritmo é criar uma corrente de modelos fracos, onde cada um tem como objetivo minimizar o erro do modelo anterior, por meio de uma função de perda.

Aos ajustes de cada modelo fraco é multiplicado um valor chamado de taxa de aprendizagem. Esse valor, tem como objetivo determinar o impacto de cada árvore no modelo final. Quanto menor o valor, menor a contribuição de cada árvore.

Então, como funciona o algoritmo?

  • Um primeiro modelo é criado com uma aproximação simples. Dessa aproximação, temos o resíduo, que é a distância entre o que foi previsto e o valor real:
  • Um próximo modelo é criado e ajustado em cima do resíduo gerado pelo modelo anterior. Em seguida, um novo resíduo é calculado com esse segundo modelo:
  • Essas interações são repetidas por um determinado número de vezes, buscando minimizar o resíduo gerado pelos modelos fracos, ou seja, até que a distância entre o previsto e o valor real seja o menor possível. O modelo final é a soma dos ajustes de todos os modelos fracos:

Entendido o conceito do algoritmo, vamos para uma implementação de um exemplo utilizando o Scikit-Learn.

Exemplo do algoritmo utilizando o Scikit-Learn

O Scikit-Learn dispõe de uma implementação do algoritmo Gradient Boosting preciso e eficaz para a resolução de problemas de classificação e regressão. Nesse exemplo, iremos analisar o algoritmo Gradient Boosting em um modelo de classificação.

Utilizaremos os dados disponibilizados pela própria biblioteca, que possui um pacote de Datasets. Trata-se de dados de classificação de câncer de mama, no qual o objetivo é avaliar se um nódulo é maligno ou benigno.

De acordo com a documentação do Scikit-Learn, os parâmetros mais importantes na concepção do modelo são:

  • learning_rate: Taxa de aprendizado que determina a importância de cada árvore na concepção do modelo final e na minimização do resíduo gerado. Deve ser um valor no intervalo de 0.0 a 1.
  • n_estimators: Número de árvores ou estágios utilizados na construção e treinamento do modelo.

Também é possível controlar o tamanho de cada árvore através dos parâmetros:

  • max_depth: A profundidade máxima da árvore.
  • max_leaf_nodes: Número máximo de folhas.

Existem outros parâmetros que podem ser observados na documentação oficial. Vamos criar um modelo simples com alguns desses parâmetros definidos de forma default, pelo próprio algoritmo:

Nesse primeiro passo, obtemos uma acurácia de 95,74%.

Podemos analisar o comportamento do algoritmo em cada etapa de ajuste através de um método chamado staged_predict. Uma característica interessante desse método é que ele possibilita que façamos análises de desempenho que poderiam ser realizadas somente no modelo final, como medir a acurácia ou o erro médio do modelo. Essas análises são importantes, pois, pode nos auxiliar a determinar melhores parâmetros para o modelo.

Vimos na demonstração teórica do algoritmo, que a taxa de aprendizado determina a importância de cada árvore na concepção do modelo final e na minimização do resíduo gerado. Agora, utilizando o método staged_predict, vamos analisar o comportamento do algoritmo com alguns valores de learning_rate e analisar qual estágio o algoritmo irá atingir a minimização máxima do resíduo:

Segundo a documentação do algoritmo, existe uma troca entre os parâmetros n_estimators e learning_rate é evidente pelo gráfico gerado pelo algoritmo, que, em modelos treinados com uma taxa de aprendizado muito pequena, são necessários mais estágios para se chegar ao resíduo mínimo.

Número de estágios para atingir o resíduo mínimo por taxa de aprendizado

É recomendado a utilização de valores pequenos para o parâmetro learning_rate, visando manter a estabilidade do erro. Os valores recomendados são menores ou igual a 0.1, valor default definido pela biblioteca.

Se no exemplo anterior conseguimos identificar em qual estágio obtivemos o menor resíduo para cada taxa de aprendizado, então também podemos utilizar esse método para obter o número de ajustes ideal para o nosso modelo. Vamos demonstrar no exemplo abaixo.

Treinamos nosso modelo com 200 árvores com a taxa de 0.1 e limitamos a profundidade da árvore a 2. Nessa execução, obtemos uma acurácia de 95,25%.

Analisando o gráfico, notamos que realmente um valor pequeno de taxa de aprendizado traz uma maior estabilidade no erro encontrado em cada estágio.

Porém, podemos ter uma acurácia melhor se treinássemos o modelo com um número menor de árvores, é perceptível que o resíduo mínimo é alcançado bem no início das interações. Pois bem, mas como podemos forçar o algoritmo a utilizar o melhor número de árvores, e então alcançar o menor erro possível?

Temos a lista de resíduos encontrados em cada etapa do exemplo anterior. Então, podemos verificar em qual etapa o menor resíduo foi obtido e treinar um novo modelo, limitando o número de ajustes ao estágio em que encontramos o menor resíduo:

Precisamos de apenas seis estágios de ajustes para melhorar nosso modelo, a acurácia agora foi de 96.27%, uma diferença pequena mas que pode ser um diferencial em problemas mais robustos.

O número de estágios que definimos no início funcionará como um número máximo de estágios e o nosso algoritmo sempre decidirá qual é o número ideal de estágios para uma melhor performance do nosso modelo.

Meu objetivo com esse artigo foi demonstrar um pouco do que aprendi estudando o algoritmo Gradient Boosting, de forma bem simples e introdutória. O Scikit-Learn possui uma documentação muito completa e simples do algoritmo e de diversos outros de Machine Learning, além de ferramentas importantes para facilitar o desenvolvimento. Como mencionei no início desse artigo, tudo muito acessível para que qualquer pessoa consiga iniciar nesse mundo. Espero que meus estudos, demonstrados nesse artigo, possa contribuir com os seus! Um abraço e até a próxima!

--

--