KNN

Algumas execuções usando scikit-learn

Vamos utilizar a implementação da biblioteca K-Nearest Neighbors para descobrir qual o melhor K para o nosso dataset.

O dataset utilizado foi obtido de http://archive.ics.uci.edu/ml/datasets/Haberman's+Survival e apresenta dados sobre a sobrevivência de pacientes que passaram uma cirurgia de câncer de mama.


In [ ]:
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import math

data = np.loadtxt("haberman.data",delimiter=",")
print(data)

Agora vamos separar os conjuntos de treino e teste


In [ ]:
ndata = np.random.permutation(data)

size = len(ndata)
nt = int(math.floor(size*0.7))
trfeatures = ndata[0:nt,0:3]
ttfeatures = ndata[nt:size,0:3]
trlabels = ndata[0:nt,3]
ttlabels = ndata[nt:size,3]

Com os nossos dados separados podemos criar um classificador e treiná-lo


In [ ]:
knn3 = KNeighborsClassifier(n_neighbors=3)
knn3.fit(trfeatures, trlabels)

Após isso podemos fazer predições:


In [ ]:
pred = knn3.predict(ttfeatures)
print(pred)

E avaliá-lo usando score:


In [ ]:
knn3.score(ttfeatures,ttlabels)

Agora vamos fazer o mesmo para um knn que utiliza pesos relativos a distâncias:


In [ ]:
wknn3 = KNeighborsClassifier(n_neighbors=3,weights='distance')
wknn3.fit(trfeatures, trlabels)
wknn3.score(ttfeatures,ttlabels)

Ou vamos mudar o k para 1:


In [ ]:
wknn1 = KNeighborsClassifier(n_neighbors=1,weights='uniform')
wknn1.fit(trfeatures, trlabels)
wknn1.score(ttfeatures,ttlabels)

Prática

Verifique no intervalo de k = 1 a 10, qual o melhor valor de k e o melhor tipo de pesso a ser utilizado


In [ ]:
print("K \t Uniform \t Distance")
for k in range(1,11):
    UniformKnnClassifier = KNeighborsClassifier(n_neighbors=k,weights='uniform')
    UniformKnnClassifier.fit(trfeatures, trlabels)
    uScore = UniformKnnClassifier.score(ttfeatures, ttlabels)
    
    DistanceKnnClassifier = KNeighborsClassifier(n_neighbors=k,weights='distance')
    DistanceKnnClassifier.fit(trfeatures, trlabels)
    dScore = DistanceKnnClassifier.score(ttfeatures, ttlabels)
    
    print k,"\t{:f} \t{:f}".format(uScore,dScore)

In [ ]: