Modelos de Predição | Otimização de Hiperparâmetros em Python
Técnicas de otimização para levar seu modelo preditivo ao próximo nível!
Fala galera, como vocês estão? Hoje, vamos trazer um assunto um pouco diferente do que foi falado até agora sobre modelagem, mas que é essencial para que você possa obter o melhor desempenho do seu modelo - a otimização de hiperparâmetros.
O que são hiperparâmetros e como otimizá-los? Por que se preocupar com isso? Em que etapa de um projeto de Ciência de Dados isso entra?
Motivação
Digamos que você esteja fazendo um projeto ponta a ponta de Ciência de Dados. Você passou muito tempo coletando e limpando os dados, depois analisou eles, tirou insights importantes e finalmente começou a modelar com Machine Learning.
Olhando para alguma métrica, como acurácia ou R², você viu que seu modelo está razoável - dá para melhorar. Assim, você decide preparar ainda mais os dados para a modelagem, o que dá um up no modelo, mas ainda fica uma sensação de que dava para fazer melhor.
E agora?
Agora entra a otimização de hiperparâmetros.
Parâmetros vs. Hiperparâmetros
Parâmetros e hiperparâmetros são duas partes fundamentais de um modelo preditivo. Em um algoritmo machine learning, os parâmetros são ajustados diretamente pelo processo de aprendizado e influenciam diretamente na performance do algoritmo. Os coeficientes de uma regressão linear, os pesos de uma rede neural, as fronteiras das vizinhanças no kNN, todos esses são parâmetros que se ajustam ao treinar o modelo preditivo para um conjunto de dados.
Por sua vez, hiperparâmetros são variáveis do algoritmo definidas antes do treinamento. Eles representam características mais construtivas, como a métrica de performance de uma regressão (MSE, R²,…), o número de neurônios de uma rede neural (ou camadas), o número de vizinhos do kNN. Os hiperparâmetros são muito importantes para a performance do modelo preditivo e caso escolhidos de qualquer jeito, podem torná-lo inútil, ou muito longe do ótimo.
Do mesmo jeito que os parâmetros de um algoritmo são ajustados de forma a minimizar um erro ou maximizar uma performance, os hiperparâmetros também são. O problema é que testar hiperparâmetros exige que o algoritmo já esteja treinado no conjunto de dados. Assim, para otimizar um hiperparâmetro é preciso treinar um modelo diversas vezes, o que é muito demorado. Mas, isso não significa que não podemos ajustá-los — para isso existem diversos algoritmos que vamos falar a seguir.
Ajustando hiperparâmetros
Vamos ver os algoritmos mais populares de otimização de hiperparâmetros. Para compará-los, vamos à prática utilizando um modelo preditivo e um conjunto de dados.
O modelo preditivo
Vamos usar uma Árvore de Decisão, um modelo preditivo que formula comparações e desigualdades sobre os dados de entrada, para predizer uma variável de saída. Um ótimo aspecto desse modelo é que fácil de interpretá-lo, como na imagem a seguir:
Um hiperparâmetro muito importante para uma árvore de decisão é sua profundidade máxima, ou seja, o número de perguntas que podem ser feitas em sequência, pois ele ajuda muito a prevenir um problema comum deste modelo que é o sobreajuste, ou overfitting.
O conjunto de dados
Em relação aos dados, vamos usar o dataset de câncer de mama, onde devemos classificar se um nódulo é maligno ou benigno com base em características dele, extraídas de uma imagem digitalizada de um tecido mamário (via PAAF - Punção Aspirativa de Agulha Fina).
Preparação
Como neste caso é muito importante detectar os casos de câncer e evitar um alarme falso, precisamos prestar atenção tanto na taxa de positivos verdadeiros quando na de falsos positivos. Assim, a métrica de avaliação que vamos utilizar é o AUC-ROC, ou área sob a curva ROC, que representa a probabilidade do modelo distinguir corretamente a classe positiva da negativa. O melhor caso da AUC-ROC ocorre em 1 e o pior caso ocorre em 0.5 (por quê?).
Além disso, vamos repartir o conjunto de dados diversas vezes entre partes de treino e partes de teste para garantir que o modelo performa bem em todo o conjunto - essa técnica é chamada de validação cruzada, ou cross-validation. Vamos usar essa estratégia para todos os algoritmos a seguir, também!
Vamos medir o quão bem a árvore de decisão performa sem realizar nenhum ajuste:
Aparentemente já conseguimos um bom resultado mesmo sem otimizar o hiperparâmetro. Isso é razoavelmente comum, mas estamos diagnosticando casos de câncer, então cada pontinho vale! Então, vamos às técnicas de otimização de hiperparâmetros:
1. Grid Search
Possivelmente o caso mais ingênuo e mais simples. O Grid Search, ou busca em grade, é um algoritmo de busca que recebe uma conjunto de valores de um ou mais hiperparâmetros e testa todas as combinações dentro dessa vizinhança. O algoritmo tabela qual foi o desempenho de cada configuração e ao final de todos os testes, fala qual é a melhor escolha. Atualmente, existem alternativas muito melhores que o Grid Search, mas vale a pena citá-lo por sua simplicidade.
Podemos ver que o modelo selecionou uma árvore de decisão com máximo comprimento 3 e performou melhor que a árvore sem otimização! Também vimos o tempo de execução, por volta de 1.15 s, que vai ser útil para comparar com os outros algoritmos.
2. Random Search
Este algoritmo é muito parecido com o Grid Search, exceto por um motivo: ao invés de testar todas as combinações na vizinhança, o Random Search, ou busca aleatória, testa combinações aleatórias de hiperparâmetros, conforme um número especificado de amostras a tirar.
Ele é uma alternativa para o Grid Search quando o conjunto de dados é muito grande, ou há um número muito grande de hiperparâmetros para otimizar. Para mostrar essas vantagens, vamos aproveitar para otimizar também outros hiperparâmetros da árvore de decisão.
Muito bom! Conseguimos aumentar o desempenho do modelo e ainda diminuir o tempo de execução. Para conjuntos de dados maiores, essa melhoria aumenta mais ainda. Porém, ainda existem alternativas mais sofisticadas e mais rápidas que Random Search…
3. Bayes Search
Subindo na liga dos algoritmos de otimização, nos deparamos com este método. Bayes Search, ou busca bayesiana, tenta estimar qual é a combinação de hiperparâmetros que resultará na maior performance, com base numa distribuição criada a partir das combinações testadas anteriormente.
A grande sacada é forma que esse algoritmo faz as estimativas: ele procura as regiões onde há menor confiança na distribuição levantada e, dentro dessas regiões, qual é a que pode ter um valor mais elevado para a performance. Isso fica mais claro com a gif acima!
Assim, a cada iteração da busca bayesiana, a configuração de hiperparâmetros com a maior chance de melhoria é escolhida e a distribuição da performance do modelo é atualizada, permitindo a escolha de um novo ponto.
O ganho de desempenho que esse algoritmo proporciona é brutal em relação aos anteriores e é uma das melhores escolhas para datasets gigantes e modelos com muitos hiperparâmetros. Vamos buscar ainda mais hiperparâmetros e ampliar o espaço de busca dos que já definimos:
Parece que chegamos no desempenho máximo: esse algoritmo de otimização gerou um modelo tão bom quanto o Random Search. No entanto, notamos uma demora maior de execução — o Bayes Search funciona melhor para treinamentos mais complexos e com espaços de busca muito grandes, então para nosso exemplo, Random Search bastaria. Mas fica o aprendizado para os projetos reais!
Conclusão
Nessa aula, vimos a diferença entre parâmetros e hiperparâmetros e comparamos os algoritmos de otimização de hiperparâmetros mais populares: Grid, Random e Bayes Search. Aplicamos eles a um caso prático de predição de câncer com árvores de decisão.
Por fim, refletimos um pouco sobre o escopo de aplicação de cada um desses algoritmos. Se quiser ir além, existem algoritmos ainda mais modernos para otimizar hiperparâmetros.
E como sempre, para ficar por dentro de Inteligência Artificial basta seguir o Grupo Turing nas nossas redes: Medium, Facebook, Instagram e LinkedIn.
Por hoje, é isso. Espero que tenha gostado!