Le KNN
Le KNN
Le KNN
Encadré par :
Mr. Abdessamad EL RHARRAS
Réalisé par :
Dinar Farid
L’algorithme KNN - k nearest neighbors -
(k plus proches voisins)
INTRODUCTION
Parmi tous les algorithmes d'apprentissage automatique que j'ai rencontrés, KNN a
facilement été le plus simple à maîtriser. Malgré sa simplicité, il s’est avéré incroyablement efficace
dans certaines tâches (comme vous le verrez dans cet article). Et encore mieux? Il peut être utilisé
pour les problèmes de classification et de régression! Il est cependant beaucoup plus utilisé pour les
problèmes de classification. J'ai rarement vu KNN implémenté dans une tâche de régression. Mon
but ici est d’illustrer et de souligner comment KNN peut être tout aussi efficace lorsque la variable
cible est de nature continue.
Nous allons d'abord comprendre l'intuition des algorithmes KNN, examiner les différentes façons de
calculer les distances entre les points, puis implémenter l'algorithme en Python. Allons-y!
Table des matières
Dans le graphique ci-dessus, l'axe des ordonnées représente la taille d'une personne (en pieds) et
l'axe des x, son âge (en années). Les points sont numérotés en fonction des valeurs d'ID. Le point
jaune (ID 11) est notre point de test.
Si je vous demande d'identifier le poids de ID11 sur la base de l'intrigue, quelle serait votre réponse?
Vous diriez probablement que puisque ID11 est plus proche des points 5 et 1, il doit donc avoir un
poids similaire à ces ID, probablement entre 72 et 77 kg (poids des ID1 et ID5 du tableau). Cela a du
sens, mais comment pensez-vous que l’algorithme prédit les valeurs? Nous verrons cela dans cet
article.
Si cela avait été un problème de classification, nous aurions pris le mode comme prédiction finale.
Dans ce cas, nous avons deux valeurs de poids 72 et 77. Est-ce que vous devinez comment la valeur
finale sera calculée?
1. Tout d'abord, la distance entre le nouveau point et chaque point d'entraînement est
calculée.
2. Les k points de données les plus proches sont sélectionnés (en fonction de la distance). Dans
cet exemple, les points 1, 5, 6 seront sélectionnés si la valeur de k est 3. Nous allons explorer
plus en détail la méthode permettant de sélectionner la bonne valeur de k plus loin dans cet
article.
3. La moyenne de ces points de données est la prédiction finale pour le nouveau point. Ici, nous
avons un poids de ID11 = (77 + 72 + 60) / 3 = 69,66 kg.
Distance euclidienne:
La distance euclidienne est calculée comme la racine carrée de la somme des différences au
carré entre un nouveau point (x) et un point existant (y).
Distance de Manhattan:
Il s’agit de la distance entre des vecteurs réels utilisant la somme de leur différence absolue.
Distance de Hamming:
Il est utilisé pour les variables catégorielles. Si la valeur (x) et la valeur (y) sont identiques, la
distance D sera égale à 0. Sinon D = 1.
Une fois que la distance d'une nouvelle observation par rapport aux points de notre ensemble
d'entraînement a été mesurée, l'étape suivante consiste à sélectionner les points les plus proches. Le
nombre de points à prendre en compte est défini par la valeur de k.
IV. Comment choisir le facteur k?
La deuxième étape consiste à sélectionner la valeur k. Cela détermine le nombre de voisins
que nous examinons lorsque nous attribuons une valeur à toute nouvelle observation.
Dans notre exemple, pour une valeur k = 3, les points les plus proches sont ID1, ID5 et ID6.
ID11 = 69,66 kg
Pour la valeur de k = 5, le point le plus proche sera ID1, ID4, ID5, ID6, ID10.
Pour implémenter ce modèle nous allons utiliser une base de données d’un type très connu
de fleur il s’agit de l’ ‘IRIS’ par ces trois différents types à savoir ‘SETOSA’,’VIRGINICA’ et
‘VERSICOLOR’ . Notre but c’est de classer une fleur donnée dans sa catégorie appropriée en fonction
de ces propres mesures.
Maintenant nous allons passer au codage de tout ce que nous avons vu au précédemment.
import pandas as pd
import numpy as np
import math
import operator
data = pd.read_csv("iris.csv")
Print(data)
Output :
distance = 0
for x in range(length):
return np.sqrt(distance)
# Définition du modèle KNN
def knn(trainingSet, testInstance, k):
distances = {}
length = testInstance.shape[1]
#calcul de la distance euclidienne entre une ligne des données du training et du test
for x in range(len(trainingSet)):
dist = euclideanDistance(testInstance, trainingSet.iloc[x], length)
distances[x] = dist[0]
# tri de ces données en fonction de la distance
sorted_d = sorted(distances.items(), key=operator.itemgetter(1))
neighbors = []
# Extraction top k neighbors
for x in range(k):
neighbors.append(sorted_d[x][0])
classVotes = {}
# Calcul de la classe la plus fréquente dans les voisins
for x in range(len(neighbors)):
response = trainingSet.iloc[neighbors[x]][-1]
if response in classVotes:
classVotes[response] += 1
else:
classVotes[response] = 1
sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)
return(sortedVotes[0][0], neighbors)
Pour tester notre modèle nous allons considérer les mesures suivantes une fleur dont le type est
inconnu.
test = pd.DataFrame(testSet)
k=3
# la classe prédie
print(resultat)
# 3 proches voisins
print(voisin)
Enfin et pour vérifier la crédibilité de notre modèle nous allons recourir à la bibliothèque ‘SCIKIT-
LEARN’ dont l’algorithme du knn est déjà prédéfini.
VI. Comparion de notre modèle avec scikit-learn
D’abord c’est quoi scikit-learn ?
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(data.iloc[:,0:4], data['Name'])
# Predicted class
print(neigh.predict(test))
# 3 nearest neighbors
print(neigh.kneighbors(test)[1])
Nous pouvons voir que les deux modèles prédisaient la même classe (‘Iris-virginica’) et les mêmes
voisins les plus proches ([141 139 120]). Nous pouvons donc en conclure que notre modèle
fonctionne comme prévu.
Conclusion
Le k-NN est un algorithme qui peut servir autant pour la classification que la régression. Le principe
de ce modèle consiste en effet à choisir les k données les plus proches du point étudié afin d’en
prédire sa valeur. Ainsi c’est un algorithme de classification où l’apprentissage est basé sur «la
similarité» entre une donnée (un vecteur) et d’autres.
Références :
https://www.analyticsvidhya.com/blog/2018/03/introduction-k-neighbours-algorithm-
clustering/
https://www.analyticsvidhya.com/blog/2018/08/k-nearest-neighbor-introduction-
regression-python/