Experimentação e Otimização de Modelos
Continuando a série sobre a predição de abstenção de eleitores nas Eleições brasileiras, nesse post vamos falar sobre a experimentação de diferentes modelos de aprendizado de máquina e a otimização realizada para ajustar os parâmetros dos modelos.
Teste Inicial
Para viabilizar o tempo dos testes, foi separada uma amostra de 30% dos dados. Sobre essa amostra testei os principais algoritmos de regressão, com a configuração padrão dos parâmetros, para uma análise inicial do desempenho. Os resultados foram medidos utilizando validação cruzada k-fold com 4 folds.
Na primeira e segunda colunas temos a duração média do teste e treino dos modelos em segundos. Na terceira e quarta colunas temos o erro médio utilizando a métrica MSE nos dados de teste e treino. E na última coluna a variação do erro nos dados de teste.
Analisando os resultados podemos ver que alguns modelos alcançaram resultados ainda melhores que o RandomForest utilizado inicialmente. Com a otimização dos parâmetros dos modelos pode nos entregar resultados ainda melhores. Por uma questão de restrição de recursos, selecionei os 6 primeiros modelos da tabela para a otimização.
Otimização dos Modelos
Algoritmos de aprendizado de máquina são parametrizados e o ajuste desses parâmetros pode influenciar o resultado do processo de aprendizagem. O objetivo da otimização dos modelos é encontrar o melhor conjunto de parâmetros que ajuste o algoritmo ao problema.
Para encontrar o melhor conjunto de parâmetros precisamos testar o modelo com diferentes combinações deles. Esse é um processo demorado e repetitivo por isso geralmente essa etapa é automatizada.
Existem algumas técnicas tradicionais para fazer isso, como GridSearchCV e RandomizedSearchCV, porém essas técnicas são “ingênuas” pois não levam em consideração os resultados anteriores. Já a abordagem bayesiana mantém o registro dos resultados de avaliações passadas para formar um modelo probabilístico e selecionar os parâmetros mais promissores para a próxima iteração. Esse artigo mostra de forma resumida as diferenças entre as técnicas.
A biblioteca Hyperopt implementa a abordagem bayesiana e foi utilizada nesse projeto. Escolhida a técnica, ainda precisamos definir o espaço de busca de cada parâmetro (valores mínimo e máximo, por exemplo). Utilizamos a biblioteca Hyperopt-sklearn que é integrado ao Scikit-learn e já conta com um espaço de busca padrão para os principais modelos.
Para cada modelo foram executadas 50 iterações em busca dos melhores parâmetros, utilizando 30% da amostra para validação.
Support Vector Machine para Regressão (SVR)
Um dos grandes problemas do SVM é o tempo necessário para o treinamento e teste do modelo. Como mostrado na tabela inicial, o SVR durou mais de 26 minutos na etapa de treinamento e 5 minutos para fazer as previsões em uma amostra de apenas 30% dos dados. Isso tornaria necessário a utilização de uma infraestrutura com grande poder de processamento.
Para contornar esse problema utilizei a técnica sugerida nessa thread do StackOverflow. A técnica consiste em dividir o dataset em partes menores treinando um modelo para cada parte e depois agregar os resultados individuais. Como o tempo de treinamento do SVM é exponencial em relação a quantidade de dados, essa técnica diminui consideravelmente o tempo geral de treinamento e teste do modelo.
Com a utilização dessa técnica, o erro médio na amostra aumento de 9,26 para 10,52 porém a duração do treinamento caiu de 1552 segundos para apenas 94. O desempenho foi um pouco sacrificado por um ganho enorme na duração, tornando a utilização do SVM viável.
O kernel utilizado pelo SVR foi o RBF e o espaço de parâmetros foi o definido no Hyperopt-sklearn. O resultado final melhorou em quase 10% em relação ao modelo SVR não-otimizado diminuindo de 13,96 para 12,63.
CatBoost
O CatBoost é um algoritmo de gradient boosting em árvore de decisão. Ele apresentou o segundo melhor desempenho na amostra com um bom tempo de treinamento e teste.
Como esse algoritmo não está implementado no Hyperopt-sklearn foram utilizados os parâmetros descritos nesse post para a definição do espaço de busca dos parâmetros.
O CatBoost já tinha conseguido atingir um resultado muito bom com a configuração padrão. Com a otimização ainda teve uma melhora de 5% atingindo o resultado final de 11,38.
LightGBM
O LightGBM é mais um algoritmo de gradient boosting baseado que usa aprendizado baseado em árvore. O termo light refere-se a forma como esse modelo constrói a árvore, o que torna sua execução bem mais rápido. Como pode ser visto na tabela inicial, o tempo de treinamento do LGBM foi o mais rápido entre os principais modelos.
A otimização desse modelo foi baseada no espaço de busca definido nesse post.
O LGBM alcançou o melhor resultado individual após a otimização atingindo 11,27 com uma melhora de 8,3% na etapa de otimização.
ExtraTrees
O Extremely Randomized Trees é um modelo que utiliza uma aleatoriedade maior que o RandomForest para tentar reduzir a variância do modelo. Esse é um modelo disponibilizado na biblioteca sklearn e para sua otimização foi utilizado o espaço de busca da hyperopt-sklearn.
A otimização desse modelo melhorou os resultados em 9,6% atingindo 11,96.
RandomForest
O modelo de floresta aleatória é um dos modelos mais comuns de machine learning. É um modelo simples que geralmente entrega resultados satisfatórios. Para esse modelo também foi utilizado o espaço de busca do hyperopt-sklearn.
A otimização desse modelo teve um dos maiores impactos, melhorando os resultados em quase 13%, chegando a 11,88 e ultrapassando o ExtraTrees.
XGBoost
O XGBoost é um dos queridinhos da comunidade de machine learning. É um algoritmo de gradient boosting bastante eficiente e customizável. Esse é o único dos algoritmos de boosting que já está contemplado no hyperopt-sklearn, por isso foi utilizado o espaço de busca definido nessa biblioteca.
Surpreendentemente o XGBoost teve um resultado bem fraco em sua configuração padrão, mas após a otimização os resultados melhoraram em mais de 17%, ficando similar ao melhor desempenho encontrado. Essa melhora reforça ainda mais a importância da otimização dos modelos para obter os melhores desempenhos.
Conclusão
A otimização dos modelos gerou uma melhora de 5% a até 17% dos resultados iniciais, reforçando a importância da etapa de otimização dos modelos para obtenção de melhores resultados.
No gráfico a seguir podemos visualizar os dados apresentados nessa tabela comparando os resultados dos modelos.
Os algoritmos de boosting atingiram os melhores resultados. LGBM, XGBoost e CatBoost tiveram resultados bem semelhantes. Logo após vem os algoritmos baseados em árvore e depois o SVM.
Comparando com o modelo inicial, os resultados melhoraram de 13,64 para 11,27, o que representa uma melhora significativa de 17%.
No próximo post pretendo explorar a combinação desses modelos para tentar obter resultados ainda melhores. Será que conseguiremos?