Experimentação e Otimização de Modelos

Leonardo Kury
Data Hackers
6 min readApr 16, 2019

--

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.

Desempenho dos modelos na amostra com configuração padrão

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.

Resultados do SVR antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resultados do CatBoost antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resultados do LightGBM antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resultados do ExtraTrees antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resultados do RandomForest antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resultados do XGBoost antes e depois da otimização. O valor representa a média do erro entre os 4 folds e entre parênteses o desvio padrão.

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.

Resumo dos resultados da otimização dos modelos

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?

--

--