GEAM-Básico, Iris classification
Tags: knn, iris
Published: 2019-08-18 20:09:35

---
title: GEAM-Básico, Iris classification
published: true
description: Resolução do problema Iris Classification com o algorítimo kNN
tags: kNN, Iris
---

# O problema

Nessa semana nós vamos resolver esse [problema](https://archive.ics.uci.edu/ml/datasets/iris) que é bastante recorrente aos iniciantes em ciência de dados e áreas afins que é o tal do reconhecimento de diferentes tipos de flores (Iris). Esse problema se caracteriza por ser de classificação e supervisionado.
![Tipos de Flores](https://thepracticaldev.s3.amazonaws.com/i/3zt5mn4145wvwdqozs5m.png)
Nós vamos resolver ele utilizando o [Orange](https://orange.biolab.si/). Recomendo a leitura desse excelente [artigo](https://medium.com/ensina-ai/machine-learning-sem-c%C3%B3digo-636d1a8f9081) que mostra os primeiros passos com a ferramenta.

## Carregando e Visualizando os dados

Assim como visto no encontro anterior, vamos carregar o dataset referente ao problema e verificar o que esses dados têm a dizer. Ao carregar o dataset (simplesmente arrastando o widget _file_ e selecionando o arquivo) temos acesso à algumas informações relevantes sobre o problema:

![Abrindo o arquivo](https://thepracticaldev.s3.amazonaws.com/i/uoz65fib79eaievwq74k.png)

A própria ferramenta nos mostra que esse dataset contém 150 instâncias (linhas) dos três diferentes tipos de flores.
Além disso, o Orange automaticamente indentificou que temos quatro _features_ numéricas, ou variáveis, e o _target_ (categórico) que é o valor que estamos tentando prever. Outra informação relevante que o Orange nos mostra é que no dataset não há dados faltando, assim não será necessário a tartar os dados faltantes.

## Explorando os dados

Utilizando o widget de visuzalização dos dados em tabela, temos uma noção melhor de como são esses dados:
![Dados em tabela](https://thepracticaldev.s3.amazonaws.com/i/9pcn9w5vflmz0z2kz6ev.png)

Podemos utilizar alguns gráficos no processo de exporação para compreendermos melhor as relações entre esses dados.
Uma forma interessante de visualizar esses dados é utilizando o widget de _Scatter Plot_ (Gráfico de disperção) encontrado na aba _Visualize_ para termos uma noção melhor da distribuição desses dados. Aplicando esse widget, conseguimos observar que ao relacionarmos as _features petal length_ com a _petal width_, assim como em outras combinações de _features_, nós encontramos um certo agrupamento:
![Scatter Plot](https://thepracticaldev.s3.amazonaws.com/i/1kai7tfef5mx4ph582j9.png)
Eu sugiro fortemente você ir testando com outras combinações das _features_ e observar como fica a distribuição dos dados.

## Testar e avaliar o modelo

Ao visualizarmos as disperções dos dados, conseguimos observar que dadas as combinações das _features_, nós temos que os dados similares (mesma categoria de flor), **tendem a se concentrarem numa mesma região** no espaço da disperção dos dados.
Desse modo, nós podemos utilizar o **kNN** (k-Nearest Neighbors, ou os k vizinhos mais próximos) que é um **algorítimo de classificação** simples e bastante utilizado. O kNN é uma técnica não paramétrica, ou seja, ele não vai fazer nemhuma suposição sobre a distribuição dos dados.

De maneira geral, o funcionamento do _kNN_ é relativamente simples, imagine o seguinte cenário:
![Funcionamento kNN](https://thepracticaldev.s3.amazonaws.com/i/shdijnaysqkjt6ut7y2q.png)
Imagem retirada [desse artigo](https://towardsdatascience.com/knn-k-nearest-neighbors-1-a4707b24bd1d).

Imagine que as esferas amarelas representam um tipo de flor A e as roxas um tipo B. A esfera em vermelho representa um novo elemento e você não sabe ao certo se é do tipo A ou B.

Para identificarmos o tipo desse novo elemento, podemos utilizar o _kNN_ e verificar a que grupo ele pertence.
O que o _kNN_ vai fazer é calcular a distância entre o novo objeto e os _k_ objetos mais próximos a ele (vizinhos) dispersos no plano cartesiano. Essa distância é obtida pelo cálculo da Distância Euclidiana (ou outras distâncias: Hamming, Manhattan...) entre os objetos. A variável _k_ representa a quantidade de vizinhos do novo objeto. Após definirmos um certo _k_ (3, por exemplo), o algorítimo irá verficar a distância entre o novo elemento e os três elementos mais próximos para assim obtermos a classe a qual o novo objeto é mais similar.
No exemplo da imagem, se considerarmos o _k_ como três, temos que a esfera vermelha está mais próxima das esferas roxas, sendo assim classificada como pertencente à classe roxa. Porém se aumentarmos o "raio" de abrangência e definirmos _k_ como seis, temos que na verdade esse novo objeto é mais similar à classe amarela. Segundo o autor dos vídeos que eu coloquei no final desse texto, o ideal é utilizarmos o _k = Logn_ para obtermos uma maior precisão. Onde _n_ é o tamanho da base. Ideal _k_ deve ser ímpar.

### Aplicando o kNN

![kNN widget](https://thepracticaldev.s3.amazonaws.com/i/hrjzvhlld7ku2pfce219.png)

Vamos pegar o widget _kNN_ na aba _Model_ e definirmos algumas características para a resolução do nosso problema:

- Primeiro nós definimos o _k_, a quantidade de vizinhos:
- Em seguida definimos a métrica, o tipo de cálculo da distância:
  - **Euclidiana** que calcula a distância entre dois pontos no plano cartesiano (o que vamos usar).
  - Manhattan, Maximal e Mahalanobis; (você encontra [aqui](https://docs.biolab.si//3/visual-programming/widgets/model/knn.html) essas métricas)
- Por fim, o peso (weight) que será usado:
  - **Uniform**, que aplica um mesmo peso a todos os vizinhos (o que vamos usar);
  - Distance, quanto mais próximo o vizinho, maior sua influência, seu peso;

Em seguida, vamos conectar o resultado da aplicação do _kNN_ com os dados do arquivo usando a _feature **Test & Score**_ da aba _Evaluate_.
Vamos escolher a opção _Random sampling_. Assim, vamos randomicamente dividir os dados em uma amostra de _treino_ e uma de _teste_ dada a proporção definida, por exemplo: 70:30. E acima dessa opção, nós escolhemos a quantas vezes esse processo será repetido.
Ao definirmos essas configurações, temos acesso ao resultado do modelo.
![Test & Score widget](https://thepracticaldev.s3.amazonaws.com/i/7er6t8x81tpwrfnkq79j.png)

## Finalizando

- Experimente alterar o número _k_ de vizinhos para identificar a variação das informações em _Test & Score_;
- Em _Test & Score_ você pode alterar a classe que está analisando, por padrão o Orange analisa a média de todas as classes. Se alterar para _Iris-setosa_ verá que teve uma precisão incrível por estar presente em uma região mais restrita.
- Altere as configurações dos widgets de visualização como o Linear Projection e Scatter Plot para ter uma noção de como os dados estão distribuídos;
- No final acrescentei o widget _ROC Analysis_ para mostrar graficamente a acurácia do modelo nas diferentes classes;

## Resultado final

![Resultado final](https://thepracticaldev.s3.amazonaws.com/i/1dndlpdh1epgzfvm0xlv.png)

## Referências

- [Artigo muito interessante sobre o algorítimo kNN](https://inferir.com.br/artigos/algoritimo-knn-para-classificacao/)
- [Documentação do Orange sobre os widgets e sua utilização](https://docs.biolab.si//3/visual-programming/widgets/model/knn.html)
- [Vídeo apresentando o kNN (maior)](https://www.youtube.com/watch?v=zvmbB3315Ko)
- [Vídeo apresentando o kNN (resumido)](https://www.youtube.com/watch?v=gJK4fmCvcWY)
- [Outro artigo bastante interessante explicando o algorítimo](https://blog.usejournal.com/a-quick-introduction-to-k-nearest-neighbors-algorithm-62214cea29c7)