Como treinar seu modelo de KNN
Entenda como melhorar a performance de seu modelo de Machine Learning
Uma breve introdução
KNN é um modelo com as seguintes características:
- Aprendizado Supervisionado quando a variável resposta (alvo) é conhecida.
- Não paramétrico, pois não há pressupostos em relação à distribuição dos dados.
- Algoritmo “Preguiçoso”, pois não há de fato um treinamento. Toda nova predição irá utilizar toda a base para realizar as comparações necessárias.
- Pode ser utilizado para classificação e regressão.
- Utiliza a similaridade dos atributos para definir à qual classe pertence, como evidenciado na figura abaixo:
Para melhorar a performance do KNN iremos abordar dois assuntos:
- Cross Validation: LOOCV vs K-Fold Validation
- Model Tuning: Grid Search vs Random Search
Aviso
O storytelling deste projeto tem a premissa de possibilitar qualquer leitor a entender meu modus operandi programando em R.
Caso queira conferir o código, pode obtê-lo no seguinte link: https://github.com/andrealvesambrosio/TopicosML/blob/master/KNN-Notebook.Rmd
E também devo admitir que sou fanboy do tidyverse. Assim, teremos doses excessivas do uso de pipes (%>%).
Com isso estabelecido, podemos iniciar a análise!
Dados
Os dados a serem utilizados, são de domínio público e podem ser obtidos na biblioteca carData, sob nome de “National Statistics From The United Nations, Mostly From 2009–2011”.
Logo abaixo, podemos verificar um breve resumo sobre os dados
Temos os seguintes atributos:
- fertility: Taxa de fertilidade, quantidade de filhos por mulher
- ppgdp: Produto Interno Bruto em dólares americanos
- lifeExpF: Expectativa de vida de mulheres, em anos
- pctUrban: Porcentagem urbana
- infantMortality: Mortalidade infantil a cada 1.000 nascimentos
Como temos poucos atributos e poucas observações, não há real necessidade de utilizar métodos para seleção de features como sua importância por exemplo. Deste modo, escolheremos as features de acordo com seu desempenho histórico (testando vários modelos diferentes).
Também não temos interesse neste projeto de lidar com dados não balanceados, portanto iremos pegar dados somente das regiões África e Asia, que possuem quantidade semelhante de observações. Somando então 103 observações.
Assim, temos:
Note que agora temos 102 observações, ou seja, a função na.omit() filtrou uma observação na qual possuía valor faltante em algum dos atributos.
Podemos verificar na diagonal principal que há uma diferença aparente na distribuição dos dados de cada um dos atributos, em que África está em vermelho e Ásia em azul. Porém, lifeExpF é o que mais aparenta se destoar, o que pode indicar um bom atributo para garantir uma classificação eficiente.
Separando os dados
Iremos dividir os dados em duas partes:
- Modelagem: Será aqui que testaremos alguns modelos e escolheremos o que apresentar a melhor performance
- Teste: Estes dados não serão tocados, utilizaremos para verificarmos a acurácia do modelo escolhido anteriormente.
Por isso, dentre as 102 observações, iremos separar 20 (10 de cada região), e então utilizar as 82 observações restantes para realizar a modelagem.
Método de validação
Em geral, o método mais utilizado para se validar modelos é o K-Fold Validation, que consiste em dividir seus dados em folds e variar a “fatia” que desempenhará o papel de teste, e as demais farão a modelagem.
Como evidência a figura abaixo.
Porém, como temos poucos dados, criar fatias grandes proporcionará pouca informação para se criar um modelo. Tornando-se inviável este tipo de validação para o nosso conjunto de dados.
Assim, iremos optar por uma adaptação, o LOOCV (Leave One Out Cross Validation), em que cada fold consiste em uma única observação. Deste modo teremos 82 folds no total.
Escolha dos hiper parâmetros
Temos duas possibilidades mais conhecidas, o Grid Search e o Random Search. Ambos métodos consistem em criar combinações entre os valores dos parâmetros possíveis em modelos diferentes e então comparar sua performance.
A principal diferença consiste em que enquanto o método Grid utiliza todas as combinações possíveis, o método Random escolhe de maneira aleatória as combinações que serão utilizadas.
No nosso caso iremos utilizar os seguintes valores:
- K Vizinhos: 1, 3, 5, 7 e 9 (5)
- Distância de Minkowski: 1, 1.5, 2 e 3 (4)
- Kernel: “rectangular” (que é o default) (1)
- Variáveis: Todas as combinações possíveis, um a um, dois a dois, três a três, quatro a quatro e cinco a cinco. (34)
Temos então 5 x 4 x 1 x 31 = 620 modelos.
Como temos poucos dados, iremos utilizar o método Grid, pois não irá demorar muito para validar todos os modelos.
Funções
Para não poluir o corpo do código em que será feito a modelagem, iremos definir a priori algumas funções que serão utilizadas. São elas:
- df_vazio: Cria um data frame vazio com as colunas desejadas
- popular_df: Popula um data frame baseado na posição
- calcular_acc: Calcula a acurácia
- calcular_combinacoes: Cria todas combinações possíveis a partir dos atributos.
Assim, podemos definir as variáveis que utilizaremos na modelagem.
Com tudo isto estabelecido, podemos finalmente produzir e comparar os modelos.
Modelagem
Criando os modelos e populando os resultados
Checando a performance dos melhores modelos
Checando a performance dos piores modelos
Percebe-se que a diferença de performance entre os piores modelos para os melhores é grotesca: aproximadamente 30%.
Agora iremos selecionar o melhor modelo para aplicar nos dados que separamos. Possui as seguintes características:
Em que as variáveis escolhidas sob ID = 16 são referentes à fertilidade, produto interno bruto e expectativa de vida feminina.
Então, iremos aplicar o modelo escolhido nos dados que deixamos de fora e checar sua performance
Dessa forma, temos que nosso modelo escolhido obteve 95% de acurácia, errando apenas uma classificação dentre 20 tentativas.
Felizmente performou melhor que o esperado.
E assim concluímos nosso projeto. Vimos que os modelos mais simplistas também podem performar bons resultados, e não há motivo para se afobar quando for iniciar um projeto de Data Science.
E aí, curtiu as dicas? Caso esteja na dúvida sobre quais modelos ou métodos aplicar no seu projeto de Data Science, meu conselho é sempre começar do mais simples possível, e ir sofisticando as técnicas até atingir o resultado que seja satisfatório para o seu caso.
Caso tenha alguma sugestão ou crítica, deixa aí nos comentários o que achou. E se quiser fazer contato, me manda alguma mensagem lá no Linkedin.
Abraço!