O algoritmo dos vizinhos mais próximos tem variações definidas pelo número de vizinhos conhecidos. Dessa variação, a mais simples é o algoritmo 1-vizinho mais próximo (1-NN).
Nesse algoritmo, cada objeto representa um ponto em um espaço definido pelos atributos, denominado espaço de entrada. Definindo uma métrica nesse espaço, é possível calcular as distâncias entre cada dois pontos. A métrica mais usual para isso é a distância euclidiana, dada pela equação:
É um algotitmo muito simples, na fase de treinamento o algoritmo memoriza os exemplos rotulados do conjunto de treinamento. Para classificar um exemplo não rotulado, ou seja, cuja classe não é conhecida, é calculada a distância entre o vetor de valores de atributos e cada exemplo rotulado em memória. O rótulo da classe associado ao exemplo de treinamento mais próximo do exemplo de teste é utilizado para classificar o novo exemplo.
Apesar de sua simplicidade, as superfícies de decisão desenhadas pelo algoritmo do 1-NN são muito complexas. São poliedros convexos com centro em cada objeto do conjunto de treinameno, todos os pontos no interior de um poliedro pertencem à classe do objeto do conjunto de treinamento que define o centro desse poliedro. O conjunto desses poliedros é designado Diagrama de Voronoi.
O algoritmo KNN é uma extenção imediata do 1-NN.
In [2]:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
dataset_iris = load_iris()
df = pd.DataFrame(data=dataset_iris.data, columns=dataset_iris.feature_names)
df.head(5)
Out[2]:
In [3]:
print(dataset_iris.data.shape, dataset_iris.target.shape)
In [4]:
X_train, X_test, Y_train, Y_test = train_test_split(dataset_iris.data,
dataset_iris.target,
test_size= 0.33,
random_state = 101)
print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)
In [11]:
model = KNeighborsClassifier(n_neighbors=7)
model.fit(X_train, Y_train)
predicts = model.predict(X_test)
print('Acuracia com dados de treino: ', model.score(X_train, Y_train))
print('Acuracia com dados de teste: ', accuracy_score(Y_test, predicts))
In [12]:
print(predicts)
In [13]:
print(Y_test)
In [ ]: