From 86b2b93483f9d9111bdbd549a8aad83442749314 Mon Sep 17 00:00:00 2001 From: Francois Pelletier Date: Sat, 23 Mar 2019 00:15:16 -0400 Subject: [PATCH] =?UTF-8?q?ajout=20fichier=20s=C3=A9par=C3=A9=20pour=20m?= =?UTF-8?q?=C3=A9triques=20et=20test=20pour=20BayesNaif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/BayesNaif.py | 11 ++++++-- Code/Knn.py | 59 ++++++---------------------------------- Code/entrainer_tester.py | 12 ++++---- Code/metrics.py | 55 +++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 60 deletions(-) create mode 100644 Code/metrics.py diff --git a/Code/BayesNaif.py b/Code/BayesNaif.py index b74f2b9..4995281 100644 --- a/Code/BayesNaif.py +++ b/Code/BayesNaif.py @@ -12,6 +12,7 @@ je vais avoir besoin de tester les méthodes test, predict et test de votre code import numpy as np import math +import metrics # le nom de votre classe @@ -125,7 +126,7 @@ class BayesNaif: #nom de la class à changer return (self.unique_labels[np.where(prob==max(prob))[0]].tolist()[0],label) - def test(self, test, test_labels): + def test(self, test, test_labels, verbose=True): """ c'est la méthode qui va tester votre modèle sur les données de test l'argument test est une matrice de type Numpy et de taille nxm, avec @@ -146,7 +147,13 @@ class BayesNaif: #nom de la class à changer Bien entendu ces tests doivent etre faits sur les données de test seulement """ - + prediction_test = [self.predict(test[i],test_labels[i])[0] for i in range(len(test_labels))] + cm = metrics.confusion_matrix(test_labels,prediction_test) + accuracy, precision, recall = metrics.prediction_metrics(cm,test_labels,prediction_test) + if (verbose): + metrics.print_prediction_metrics(cm,accuracy,precision,recall) + + return cm,accuracy,precision,recall # Vous pouvez rajouter d'autres méthodes et fonctions, # il suffit juste de les commenter. diff --git a/Code/Knn.py b/Code/Knn.py index e8ca644..47607c5 100644 --- a/Code/Knn.py +++ b/Code/Knn.py @@ -11,6 +11,7 @@ je vais avoir besoin de tester les méthodes test, predict et test de votre code """ import numpy as np +import metrics def minkowski_distance(x,y,p_value): return pow(sum(pow(abs(a-b),p_value) for a,b in zip(x, y)),1/p_value) @@ -126,10 +127,10 @@ class Knn: #nom de la class à changer nn_mode_label = np.apply_along_axis(mode,1,nn_labels) # on construit la matrice de confusion - cm = self.confusion_matrix(train_labels,nn_mode_label) - accuracy, precision, recall = self.prediction_metrics(cm,train_labels,nn_mode_label) + cm = metrics.confusion_matrix(train_labels,nn_mode_label) + accuracy, precision, recall = metrics.prediction_metrics(cm,train_labels,nn_mode_label) if (verbose): - self.print_prediction_metrics(cm,accuracy,precision,recall) + metrics.print_prediction_metrics(cm,accuracy,precision,recall) return cm,accuracy,precision,recall @@ -205,59 +206,15 @@ class Knn: #nom de la class à changer nn_labels = self.train_labels[nn[:,:,0].astype(np.int)] nn_mode_label = np.apply_along_axis(mode,1,nn_labels) # on construit la matrice de confusion - cm = self.confusion_matrix(test_labels,nn_mode_label) - accuracy, precision, recall = self.prediction_metrics(cm,test_labels,nn_mode_label) + cm = metrics.confusion_matrix(test_labels,nn_mode_label) + accuracy, precision, recall = metrics.prediction_metrics(cm,test_labels,nn_mode_label) if (verbose): - self.print_prediction_metrics(cm,accuracy,precision,recall) + metrics.print_prediction_metrics(cm,accuracy,precision,recall) return cm,accuracy,precision,recall - def confusion_matrix(self,obs_labels,pred_labels): - """ - Retourne la matrice de confusion - Prend en entrée deux vecteurs d'étiquettes: observations et prédictions - Retourne une matrice NumPy - """ - unique_obs_labels=np.unique(obs_labels) - nb_unique_obs_labels=(unique_obs_labels.shape)[0] - - confusion_matrix = np.zeros((nb_unique_obs_labels,nb_unique_obs_labels)) - - for observed,predicted in zip(obs_labels,pred_labels): - confusion_matrix[observed][predicted] += 1 - return confusion_matrix - - def prediction_metrics(self,cm,obs_labels,pred_labels): - """ - Cette fonction retourne les métriques accuracy, precision et recall - Elle prend en entrée la matrice de confusion et les vecteurs d'étiquettes: observations et prédictions - accuracy=(tp+tn)/all - precision=tp/(tp+fp) - recall=tp/(tp+fn) - """ - - accuracy = (obs_labels == pred_labels).sum() / float(len(obs_labels)) - precision=[] - recall=[] - for label_num in np.unique(obs_labels): - precision.append(cm[label_num,label_num] / sum(cm[:,label_num])) - recall.append(cm[label_num,label_num] / sum(cm[label_num,:])) - - return accuracy, precision, recall - - def print_prediction_metrics(self,cm,accuracy,precision,recall): - """ - Cette fonction imprime la matrice de confusion et les métriques - """ - print("Matrice de confusion:") - print(cm) - print("\nAccuracy:") - print(accuracy) - print("\nPrecision:") - print(precision) - print("\nRecall") - print(recall) + # Vous pouvez rajouter d'autres méthodes et fonctions, # il suffit juste de les commenter. diff --git a/Code/entrainer_tester.py b/Code/entrainer_tester.py index de85135..cb4ff4b 100644 --- a/Code/entrainer_tester.py +++ b/Code/entrainer_tester.py @@ -31,7 +31,7 @@ train, train_labels, test, test_labels = ld.load_monks_dataset(3) ## Choix du meilleur K findbest_Knn = Knn.Knn() -meilleur_k = findbest_Knn.set_best_k(train, train_labels, nb_split=5, k_potentiel=range(1,16)) +meilleur_k = findbest_Knn.set_best_k(train, train_labels, nb_split=5, k_potentiel=range(5,15)) print("Le meilleur K est:"+str(meilleur_k)+"\n\n") ## Initializer/instanciez vos classifieurs avec leurs paramètres @@ -40,24 +40,22 @@ myKnn = Knn.Knn(meilleur_k) ## Entrainez votre classifieur myKnn.train(train, train_labels) -## Prediction - - - ## Tester votre classifieur myKnn.test(test, test_labels) # Naive Bayes ## Initializer/instanciez vos classifieurs avec leurs paramètres -BN = BayesNaif.BayesNaif(True) +BN = BayesNaif.BayesNaif(False) ## Entrainez votre classifieur BN.train(train, train_labels) ## Prediction +BN.test(train, train_labels) -np.array([BN.predict(train[i],train_labels[i]) for i in range(105)]) +## Test +BN.test(test,test_labels) diff --git a/Code/metrics.py b/Code/metrics.py new file mode 100644 index 0000000..16678f3 --- /dev/null +++ b/Code/metrics.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Fri Mar 22 23:55:53 2019 +Matrice de confusion et calcul des métriques +@author: François Pelletier +""" + +import numpy as np + +def confusion_matrix(obs_labels,pred_labels): + """ + Retourne la matrice de confusion + Prend en entrée deux vecteurs d'étiquettes: observations et prédictions + Retourne une matrice NumPy + """ + unique_obs_labels=np.unique(obs_labels) + nb_unique_obs_labels=(unique_obs_labels.shape)[0] + + confusion_matrix = np.zeros((nb_unique_obs_labels,nb_unique_obs_labels)) + + for observed,predicted in zip(obs_labels,pred_labels): + confusion_matrix[observed][predicted] += 1 + return confusion_matrix + +def prediction_metrics(cm,obs_labels,pred_labels): + """ + Cette fonction retourne les métriques accuracy, precision et recall + Elle prend en entrée la matrice de confusion et les vecteurs d'étiquettes: observations et prédictions + accuracy=(tp+tn)/all + precision=tp/(tp+fp) + recall=tp/(tp+fn) + """ + + accuracy = (obs_labels == pred_labels).sum() / float(len(obs_labels)) + precision=[] + recall=[] + for label_num in np.unique(obs_labels): + precision.append(cm[label_num,label_num] / sum(cm[:,label_num])) + recall.append(cm[label_num,label_num] / sum(cm[label_num,:])) + + return accuracy, precision, recall + +def print_prediction_metrics(cm,accuracy,precision,recall): + """ + Cette fonction imprime la matrice de confusion et les métriques + """ + print("Matrice de confusion:") + print(cm) + print("\nAccuracy:") + print(accuracy) + print("\nPrecision:") + print(precision) + print("\nRecall") + print(recall) \ No newline at end of file