Classificação de uma base de dados usando kNN
Implementando um algoritmo simples para classificação de uma base de dados. Escolhi construir o algoritmo do zero para fins de aprendizado. Existem bibliotecas muito boas para ML em Python - particularmente gosto muito da scikit learn) mas como kNN é relativamente simples, podemos aproveitar a disposição e construí-lo do zero.
O conjunto de dados escolhido foi um clássico de qualquer aspirante ao campo de IA / ML / afins, a base de dados das flores do gênero Iris (que você pode conferir aqui neste link: https://archive.ics.uci.edu/ml/datasets/iris)
Achei até bonitinhas
kNN é uma técnica de aprendizado baseado em instâncias que assume que todos os elementos de um conjunto são pontos em um espaço de N dimensões, sendo N o número de atributos que descreve um elemento. O algoritmo funciona agrupando os dados próximos neste espaço teórico como similares e é bastante efetivo para conjunto de dados que são linearmente separáveis.
A imagem acima já mostra graficamente uma falha da técnica kNN. o algoritmo sofre de algo chamado maldição da dimensionalidade que implica em dois problemas práticos:
-
pode ser bastante custoso avaliar um novo ponto e classificá-lo.
-
diferentemente de outros métodos, como árvores de decisão, que avaliam a classificação a partir de diferentes passos usando um subconjunto dos atributos em cada passo, o kNN usa todos os atributos de uma vez só. Esse fato pode causar uma má representação do conjunto de dados em que, digamos, apenas uma parcela dos atributos é relevante para a classificação. Assim, os outros atributos são apenas ruído, deslocando o ponto no espaço N-dimensional - oque pode causar gráficos feito o segundo na imagem acima.
Como toda técnica, o kNN tem seus prós e contras. Cabe ao programador colocar a ferramenta certa no lugar certo :)
Todas as fotos cortesia do google imagens :)
-
Python - versão 3.7.0
-
bibliotecas importadas: CSV
-
O Projeto foi feito usando o Pycharm, então sua reprodução poder ser facilmente feita clonando este repositório e abrindo-o como um novo projeto na mesma IDE.