KNN

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.

Vantagens e Desvantagens


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]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

In [3]:
print(dataset_iris.data.shape, dataset_iris.target.shape)


(150, 4) (150,)

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)


(100, 4) (50, 4) (100,) (50,)

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))


Acuracia com dados de treino:  0.97
Acuracia com dados de teste:  0.98

In [12]:
print(predicts)


[0 0 0 2 1 2 1 1 2 0 2 0 0 2 2 1 1 1 0 2 1 0 1 1 1 1 1 2 0 0 2 1 2 1 2 1 1
 1 1 2 0 0 0 2 1 0 2 1 0 1]

In [13]:
print(Y_test)


[0 0 0 2 1 2 1 1 2 0 2 0 0 2 2 1 1 1 0 2 1 0 1 1 1 1 1 2 0 0 2 1 2 1 2 1 1
 1 1 2 0 0 0 1 1 0 2 1 0 1]

In [ ]: