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)
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 [ ]: