Blog

Postado em em 29 de novembro de 2022

Algoritmo KNN (K-Nearest Neighbors) – Algoritmo de Aprendizado de Máquinas

O algoritmo KNN permite com que você faça previsões de dados com base nos K vizinhos mais próximos a esse ponto!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Algoritmo KNN

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

KNN (K-Nearest Neighbors) Aprenda a fazer previsões!

Como esse algoritmo faz previsão é basicamente medindo a distância dos pontos ao redor dele.

O resultado é definido como da mesma classe da maioria dos pontos mais próximos a ele e somos nós que escolhemos a quantidade de pontos que serão analisados.

Exemplo:

Observe as duas imagens abaixo.

Aprenda KNN (K-Nearest Neighbors)
Exemplo.

Observe os pontos indicados na imagem acima, “Qual seria a cor do ponto vermelho da primeira figura? E da segunda?”

A maioria das pessoas vai dizer que o ponto vermelho na primeira imagem é roxo e na segunda imagem amarelo.

Por qual motivo pensamos que o primeiro ponto é roxo e o segundo amarelo?

Por ser provável, já que todos os pontos nessa região são de uma cor, existe uma probabilidade muito maior desse novo ponto ser da mesma cor, porque eles podem compartilhar as mesmas características.

É exatamente essa a lógica que o KNN utiliza!

Sendo um dos algoritmos mais simples, ele utiliza a similaridade entre os k pontos mais próximos do dataset para estimar o valor das novas observações.

Todo o processamento é feito no momento da previsão diferente dos algoritmos que vimos até agora, como na árvore de decisão que nós já sabíamos a sequência de decisões ou a regressão linear que nós sabíamos o peso de cada uma das colunas.

É por isso que o tipo de aprendizado do KNN é chamado de “aprendizado preguiçoso” (lazy learning).

Usar esse algoritmo em datasets maiores e em modelos que precisamos fazer a previsão de forma imediata pode ser muito custoso pelo modo que ele opera.

No KNN os pontos possuem pesos diferentes?

Por padrão, cada ponto possui o mesmo peso na previsão, porém é possível utilizar o hiperparâmetro “weights” com o valor “distance” para fazer os pontos mais próximos terem mais influência na previsão.

Nós sempre pegamos as mesmas quantidades de pontos?

Sim, se nós definirmos que vamos usar 5 pontos mais próximos, então vamos sempre pegar os 5 pontos, mesmo que um deles esteja muito distante dos demais.

Se eu quiser pegar a quantidade de pontos dentro de uma região, mais próximos, posso considerar os vizinhos dentro de um raio específico utilizando o RadiusNeighborsClassifier.

Obs. Cuidado para não usar o KNN em variáveis com escalas muito diferentes!

O KNN já espera que as variáveis estejam ajustadas com uma escala muito próxima, se você tiver um “x” com valores de 1 até 5 e um “y” com valores de 1000 a 5000 vai ser difícil de calcular a distância entre os pontos, façam os ajustes necessários da escala dos pontos antes de colocar no algoritmo KNN.

Agora vamos para a parte prática!

Vamos importar do Pandas um conjunto de pontos:

Pandas.
Pandas.
Aprenda KNN (K-Nearest Neighbors)
Previsão.
Aprenda KNN (K-Nearest Neighbors)
Visualização.

Esse conjunto foi escolhido aleatoriamente, os pontos estão visualmente distribuídos como na imagem acima.

Se nesta imagem nós apenas observarmos para tentar classificar os pontos marcados de vermelho, só de olhar já notamos dois pontos do lado direito próximos aos pontos amarelos e dois pontos do lado esquerdo próximos aos roxos, a dúvida sobre a cor desses pontos é menor, é provável que eles obedeçam ao padrão do grupo de pontos a sua volta.

No entanto, o ponto do meio é mais difícil de prever, vamos usar o KNN para prever estes pontos.

Vamos utilizar o KNN importando os dados da documentação.

https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

Documentação:

Aprenda KNN (K-Nearest Neighbors)
Documentação.

Importando dados da documentação:

Aprenda KNN (K-Nearest Neighbors)
Exportando dados.

Podemos observar que ele está usando os 3 vizinhos mais próximos ao invés de 5 que é o padrão, essa foi a escolha para este exemplo, porém poderíamos ter usado mais pontos.

Na documentação podemos ver todas as métricas que o algoritmo está considerando.

Na imagem acima após exportar os dados estamos definindo os valores de “x” e “y” e salvando a previsão dentro de uma variável (y_pred).

Se você tem dúvidas e quer sair do zero em Ciências de dados clique no link.

Agora podemos substituir o vermelho dos pontos do gráfico pelos valores que acabamos de prever.

Vamos copiar o gráfico e colar na linha de código abaixo trocando os pontos em vermelho pelos dados previstos.

Aprenda KNN (K-Nearest Neighbors)
Previsão.

Observe que na imagem os dois pontos mais afastados para a direita ficaram amarelos como previmos e os mais afastados a esquerda ficaram roxos, o ponto do meio que tínhamos dúvidas o KNN previu como roxo.

Mas, se as distâncias dos pontos ao redor são iguais, por que o KNN previu o ponto do meio como roxo?

Em relação aos algoritmos dos vizinhos mais próximos, se dois vizinhos tiverem distâncias idênticas, mas rótulos diferentes, o resultado dependerá da ordenação dos dados de treinamento.

Ordenação dos dados.
Ordenação dos dados.

Ou seja, se mudarmos a ordem dos dados isso vai alterar a cor do ponto.

Aprenda KNN (K-Nearest Neighbors)
Mudando a ordenação dos dados.

Existem muitas formas de ajustar isso, mas no geral esses detalhes muito específicos não são vistos porque dificilmente as distâncias resultam iguais.

Uma boa prática é evitar usar o número de vizinhos como um número par, para não acontecerem empates, usando números ímpares diminuímos muito a chance de isso acontecer.

KNN (K-Nearest Neighbors) Aprenda Algoritmo com dados reais!

Novamente vamos utilizar o dataset iris.

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html#sklearn.datasets.load_iris

Vamos importar o dataset como já fizemos anteriormente, é necessário importar o Pandas também, mas como já importamos no exemplo anterior não vamos importar novamente aqui.

Aprenda KNN (K-Nearest Neighbors)
Importando – iris.

DataFrame.
DataFrame.
Aprenda KNN (K-Nearest Neighbors)
Base.

Pronto agora que fizemos as importações temos tudo que precisamos para utilizar o KNN.

Para visualizar melhor, vamos fazer a previsão usando apenas o target 1 e 2 e apenas as colunas de pétala.

Como fazemos isso?

Aprenda KNN (K-Nearest Neighbors)
Colunas de pétala.

Só um detalhe, também foi preciso colocar a coluna de target porque ela é a coluna que nós queremos prever e como nós estamos em aprendizagem supervisionada precisamos dos valores de cada um dos dados.

Vamos agora separar em “x” e “y”.

Separando x e y.
Separando x e y.

Para separar em treino e teste vamos novamente fazer o train_test_split.

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Aprenda KNN (K-Nearest Neighbors)
Train_test.
KNN (K-Nearest Neighbors) Aprenda.
Visualização.

Agora que temos os dados de treino e os dados de teste vamos usar o KNN importando da documentação como fizemos no exemplo anterior.

Documentação.
Documentação.
Importando o KNN.
Importando o KNN.

Observe que toda vez que utilizamos um modelo é preciso avaliá-lo, estamos usando a matriz de confusão como na imagem acima, ela relaciona os dados de teste com os dados que acabamos de prever.

Agora se executarmos vamos ver que o KNN acertou 19 vezes quando era 0 e previu 0 e acertou 8 vezes quando era 1 e previu 1.

Mas tivemos seis valores que, na verdade, eram 1 e ele previu como zero.

Vamos ver quais foram esses valores.

Para isso vamos copiar o código e adicionar os dados de teste trocando tudo que é train para test e o “C” vai ser o meu “y teste”.

Visualizando treino e teste.
Visualizando treino e teste.

Agora temos nossos dados de treino, nossos dados de teste e a previsão.

Podemos colocar como comentário (#) os dados de teste e analisar somente a previsão, ir fazendo trocas para entender melhor os motivos dos erros.

Para facilitar a visualização também podemos mudar a cor dos pontos e colocar em uma escala mais fácil de diferenciar quais são os dados de teste de treino e previsão.

Para isso vou deixar aqui abaixo o site com a documentação dessa biblioteca e permite fazer alterações no gráfico.

https://matplotlib.org/stable/tutorials/colors/colormaps.html

Segue também uma aula sobre a utilização dessa e de outras bibliotecas.

Resultado:

Resultado.
Resultado.

 Também podemos buscar quais foram os valores que foram previstos errados.

Visualizando erros.
Visualizando erros.

Observem que agora que estamos vendo vários casos de algoritmos, dá para perceber que existe um passo a passo para cada um, o que vai diferenciar é que no algoritmo de árvore de decisão, por exemplo, tentamos achar regiões, agora quando nós falamos do KNN ele só tenta olhar para o que está mais próximo dele.

Embora seja um algoritmo simples de entender, fazer esse estudo vai nos ajudar muito quando estivermos falando de algoritmos de classe não supervisionado.

Conclusão – Algoritmo KNN

Esta aula faz parte de uma sequência de aulas onde explicamos o funcionamento de diferentes algoritmos de aprendizado de máquinas.

Hoje falamos sobre o KNN que é muito utilizado em problemas de classificação.

Ele também é um dos algoritmos de aprendizagem de máquinas mais fáceis de se compreender.

O KNN tenta classificar cada ponto de um conjunto de dados medindo sua distância em relação aos vizinhos mais próximos.

Eu fico por aqui, até a próxima aula! Abraço,

Hashtag Treinamentos

Para acessar outras publicações de Ciência de Dados, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?

Quer sair do zero no Python e virar uma referência na sua empresa? Inscreva-se agora mesmo no Python Impressionador