Hands-on: classificação com KNN e K-means

KNN e K-means são algoritmos de aprendizado de máquina que permitem, respectivamente, classificar e clusterizar conjuntos de dados. Neste artigo, vamos colocar a mão na massa e identificar a categoria dos dados pertencentes ao conjunto Iris.
Bianka Tallita Passos | 5 de abril de 2022

Os algoritmos de aprendizado de máquina KNN e K-means identificam os padrões de cada classe presente em um dado conjunto, o que possibilita, por exemplo, distinguir entre as três espécies de flores que compõem o conjunto Iris: setosa, versicolor e virginica.

Neste artigo, vamos utilizar a linguagem Python e a biblioteca Scikit-Learn para desenvolver o modelo que vai prever, de acordo com as medidas das pétalas e sépalas, a qual das três espécies pertence uma nova flor.

Já vimos por aqui

Os algoritmos de aprendizado de máquina dividem-se de acordo com o tipo de resposta e o tipo de problema que buscam resolver. Além disso, também podemos dividi-los de acordo com o tipo de aprendizado.

O KNN, ou classificador do vizinho mais próximo, forma grupos de vizinhos similares. Por sua vez, o K-means funciona de forma semelhante, porém ele divide o conjunto em clusters que consideram a distância entre os objetos e o centro do cluster.

Materiais e métodos

Considerando que precisamos ter um ambiente de desenvolvimento adequado para executar o experimento proposto, vamos utilizar o Google Collaboratory, que já fornece as ferramentas necessárias.

Além do ambiente, precisamos de uma base de dados para efetuar os testes e o treinamento dos algoritmos KNN e K-means. Um dos conjuntos de dados amplamente utilizados é o Iris.

Vou detalhar esse assunto.

O que é o Google Colab?

O Collaboratory ou “Colab” foi desenvolvido pela equipe do Google Research. Trata-se de um ambiente gratuito amplamente utilizado para pesquisa e experimentação em aprendizado de máquina, uma vez que possui as principais bibliotecas pré-instaladas. O ambiente também conta com uma GPU gratuita, o que permite efetuar experimentos que possuem maior custo computacional.

O conjunto de dados Iris

O Iris é uma base de dados composta por informações de três espécies de flores, a saber: setosa, versicolor e virginica.

Blog post _ 05.04.2022_Hands-on_ classificação com KNN e K-means_1.jpg

O conjunto, introduzido pelo estatístico e biólogo britânico Ronald Fisher, consiste em 50 amostras de cada uma das três espécies de flor Iris.

Cada amostra contém o comprimento e a largura das sépalas e pétalas em centímetros, totalizando quatro atributos. Com base na combinação dessas quatro características, Fisher desenvolveu um modelo para distinguir as espécies umas das outras.

O Iris é tão utilizado que está incluído na biblioteca Scikit-learn. Logo, podemos importá-lo diretamente sem precisarmos encontrar uma fonte para download do conjunto.

Scikit-learn

Scikit-learn é uma biblioteca para aplicação prática de machine learning organizada em módulos, cada um desenvolvido para uma finalidade específica.

Dentre os principais módulos, podemos citar: classificação, regressão, clusterização e redução de dimensionalidade.

Veremos, na próxima seção, como utilizar essa biblioteca para classificar as amostras de flores Iris.

Hands-on

Agora que já conhecemos os principais conceitos em relação aos algoritmos e às ferramentas que vamos utilizar nesta aplicação prática, podemos acessar o Colab e colocar a mão na massa.

Treinamento

Vamos começar importando o conjunto de dados Iris por meio da biblioteca scikit-learn (já disponível no Colab).

Blog post _ 05.04.2022_ KNN-K-means_2.png

Além disso, também importamos o Plotly Express (px) do pacote Plotly, que possibilita visualizarmos os dados do conjunto Iris em um gráfico 3D.

Blog post _ 05.04.2022_ KNN-K-means_3.png

O gráfico exibe as flores da espécie setosa (em azul), as flores da espécie versicolor (em vermelho) e as flores da espécie virginica (em verde).

A distribuição dos dados revela que as diferentes espécies de flores podem ser identificadas por meio de uma reta.

Também é possível perceber que as flores do tipo setosa (em azul) possuem características mais distantes das características das espécies versicolor e virginica.

O scikit-learn já disponibiliza os métodos KNN e K-means, então vamos importá-los!

Blog post _ 05.04.2022_ KNN-K-means_4.png

Após utilizar os métodos para classificar os dados, precisaremos avaliar o desempenho dos classificadores. Pensando nisso, o scikit-learn também disponibiliza um pacote de métricas de avaliação.

Blog post _ 05.04.2022_ KNN-K-means_5.png

Ufa! Agora temos os dados e todos os métodos que vamos utilizar para classificar e analisar o resultado dos algoritmos.

Aliás, uma prática essencial ao utilizar aprendizado de máquina é dividir o conjunto em dados de teste e dados de treinamento.

A comunidade, usualmente, nomeia as características de um elemento do conjunto de dados como X e o rótulo, ou nome, correspondente de y.

Sendo assim, ao fazer a divisão dos dados utilizando a função train _ test _ split da biblioteca scikit-learn, o comprimento e a largura das sépalas e pétalas das flores Iris estarão divididos entre X _ train e X _ test. Já o nome de cada flor estará dividido entre y _ train e y _ test.

Blog post _ 05.04.2022_ KNN-K-means_6.png

A seguir, vamos fazer a classificação das flores utilizando o KNN. Primeiro determinamos o número de vizinhos (n _ neighbors); em seguida, instanciamos o modelo que será treinado, identificado pela variável model, no script abaixo.

A função fit é responsável por “chamar” o treinamento do modelo, que recebe como parâmetro (dado de entrada) as características e os nomes das flores que dividimos anteriormente.

Após o treinamento, podemos utilizar o modelo para fazer predições de dados desconhecidos. Nesta etapa, vamos utilizar os dados de teste que havíamos separado anteriormente em conjunto com a função predict.

Blog post _ 05.04.2022_ KNN-K-means_7.png

A função predict é responsável por solicitar que o modelo faça a classificação dos dados e retorne o nome de cada flor contida na amostra de testes.

Para avaliar o desempenho do modelo, precisamos calcular algumas métricas, como precisão (precision), revocação (recall) e medida F (f1-score). O scikit-learn pode nos ajudar com isso também, por meio da função classification _ report.

Vimos que em poucos passos foi possível treinar um modelo utilizando o método KNN com o apoio das implementações disponíveis na biblioteca scikit-learn.

Outra vantagem de utilizarmos essa biblioteca é a padronização oferecida por ela, que possibilita a aplicação de poucas adaptações para a utilização de outros métodos.

Vamos ver, no script a seguir, como classificar as flores Iris utilizando o K-means.

Blog post _ 05.04.2022_ KNN-K-means_8.png

A única diferença em termos de código entre os dois métodos foi a instanciação do modelo. Uma vez que os parâmetros e o funcionamento de cada algoritmo são diferentes, isso se reflete na criação do modelo, porém as demais etapas, como treinamento e levantamento de métricas do modelo, são normalizadas pela biblioteca scikit-learn.

Essa padronização contribui para o processo de descoberta de qual método proporciona o melhor desempenho para o problema que pretendemos solucionar, sendo relativamente fácil treinarmos uma série de métodos distintos.

Métricas de avaliação

Não adianta treinarmos o modelo sem saber como avaliar o seu desempenho, não é mesmo?

Para isso, vamos ver, de forma sucinta, o que cada métrica calculada na etapa anterior significa. Bora lá!

O desempenho de métodos de aprendizado de máquina pode ser mensurado por meio de valores Verdadeiros Positivos (VP), Verdadeiros Negativos (VN), Falsos Positivos (FP) e Falsos Negativos (FN).

Esses valores compõem o que chamamos de Matriz de Confusão, a função confusion _ matrix que aparece no nosso script. ;p

A Matriz de Confusão é a base para calcularmos as métricas que utilizamos nesse exemplo: precisão (taxa de verdadeiros positivos), revocação (taxa de verdadeiros positivos dentro da classe positiva) e medida F (média harmônica ponderada entre precisão e revocação).

Blog post _ 05.04.2022_ KNN-K-means_9.png

Essas métricas são medidas já estabelecidas na literatura. Logo, não precisamos nos preocupar tanto com a sua origem, mas devemos, sim, entender o que cada uma representa em relação ao desempenho do nosso modelo.

Podemos falar mais sobre métricas de avaliação em um post futuro, que tal?

Considerações

Neste artigo, vimos como utilizar os métodos KNN e K-means com o suporte da biblioteca scikit-learn. Além disso, conhecemos algumas funções bastante úteis também disponíveis na biblioteca. Dentre elas, podemos citar a possibilidade de cálculo das métricas de desempenho do modelo treinado.

Por meio do relatório de métricas calculado, vimos que os dois métodos foram bastante eficientes na tarefa de classificação das espécies de flores Iris.

Os métodos KNN e K-means atingiram, respectivamente, a medida F de 100%, 89% e 91% para as espécies setosa, versicolor e virginica; e os valores de 100%, 80% e 81%.

É muito importante destacar que devemos analisar qual métrica é mais importante para cada problema. Além disso, os parâmetros utilizados na instanciação de cada método impactam diretamente o seu desempenho. Por esse motivo, é necessário definir um protocolo de experimentos visando a obter o melhor resultado com cada método avaliado.

Referências

  • Müller, Andreas C., and Sarah Guido. Introduction to machine learning with Python: a guide for data scientists. O’Reilly Media, Inc., 2016.
  • R. A. Fisher (1936). The use of multiple measurements in taxonomic problems. Annals of Eugenics. 7: 179-188.
  • UCI Machine Learning Repository: Iris Data Set.
Bianka Tallita Passos
Software Engineer | Msc. Visão Computacional. Entusiasta de Inteligência Artificial. Gosto de aprender e compartilhar conhecimento.