Classificador de Sorrisos utilizando KNN (K- Nearest Neighbors)

Apresentando os dados utilizados


In [11]:
from sklearn.datasets import fetch_olivetti_faces
from pylab import *
from plotly import tools

faces = fetch_olivetti_faces()
       
#Quantidade
print "\nQuantidade Total de Dados: "
print faces.target.shape


Quantidade Total de Dados: 
(400,)

Classificador KNN ( K - Nearest Neighbors)

É amplamente utilizado em problemas de classificação de dados. A proposta é armazenar todos os casos disponíveis e classificar novos casos por maioria de votos de seus vizinhos k. O caso que está sendo atribuído à classe é mais comum entre os seus K vizinhos mais próximos medidos por uma função de distância. Neste caso estamos utilizando a distância euclidiana.


In [12]:
from scipy.spatial import distance
from sklearn import tree
from sklearn import datasets
from sklearn.datasets import fetch_olivetti_faces
from sklearn.cross_validation import train_test_split

#Funcao da distancia Euclidiana
def euc(a,b):
	return distance.euclidean(a,b)

class ScrappyKNN():

	#Faz o treinamento
	#Entradas: elementos e labels
	def fit(self,X_train,y_train):
		self.X_train = X_train
		self.y_train = y_train

	#Faz a previsao
	#Entrada: elementos dos dados de teste
	#Saida: Previsao para os labels
	def predict(self,X_test):
		predictions = []

		for row in X_test:
			#Encontra o ponto de treinamento mais proximo do ponto de teste
			label = self.closest(row)
			predictions.append(label)
		return predictions

	def closest(self,row):

		#Calcula a distancia do teste ao primeiro ponto de treinamento
		best_dist = euc(row,self.X_train[0])
		#Guarda o index da melhor distancia
		best_index = 0
		for i in range(1, len(self.X_train)):
			dist = euc(row,self.X_train[i])
			#Quando encontrar um ponto de distancia menor atualizar os valores
			if(dist<best_dist):
				#Guarda a menor distancia
				best_dist = dist
				#Guarda o indice da menor distancia
				best_index = i

		return self.y_train[best_index]



#utilizando
face = fetch_olivetti_faces()
X = face.data
y = face.target

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.5)


my_classifier = ScrappyKNN()

my_classifier.fit(X_train,y_train)

predictions = my_classifier.predict(X_test)

#print predictions

from sklearn.metrics import accuracy_score

print accuracy_score(y_test,predictions)


#Resultado Faces 0.80


[14, 5, 26, 22, 11, 7, 2, 10, 39, 10, 32, 37, 23, 12, 30, 34, 18, 25, 13, 11, 7, 26, 8, 22, 24, 2, 38, 28, 37, 13, 35, 3, 37, 6, 32, 9, 27, 15, 19, 36, 20, 24, 16, 38, 21, 35, 17, 20, 32, 27, 30, 23, 6, 32, 24, 10, 27, 0, 39, 39, 13, 24, 14, 20, 26, 16, 39, 16, 29, 11, 23, 28, 17, 19, 5, 29, 33, 34, 2, 37, 8, 37, 27, 25, 4, 6, 34, 0, 13, 38, 20, 23, 21, 15, 17, 35, 22, 2, 35, 4, 18, 30, 35, 2, 30, 3, 15, 36, 18, 8, 10, 16, 2, 11, 20, 37, 30, 16, 34, 20, 0, 13, 33, 21, 19, 36, 2, 19, 2, 25, 20, 11, 33, 8, 2, 12, 17, 36, 4, 37, 31, 18, 35, 14, 32, 38, 29, 31, 22, 16, 26, 21, 29, 26, 23, 39, 20, 21, 9, 3, 11, 9, 33, 11, 3, 12, 34, 38, 34, 33, 17, 31, 29, 10, 18, 8, 5, 39, 3, 24, 18, 29, 23, 21, 1, 20, 6, 3, 25, 12, 7, 5, 28, 1, 13, 8, 27, 17, 20, 28]
0.885