Vous êtes sur la page 1sur 14

k nearest neighbors

k plus proches voisins

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

I. Un exemple simple pour comprendre l'intuition (derrière) KNN


II. Comment fonctionne l'algorithme KNN?
III. Méthodes de calcul de la distance entre les points
IV. Comment choisir le facteur k?
V. Travailler sur un dataset
VI. Comparaison de notre modèle avec scikit-learn

I. Un exemple simple pour comprendre l'intuition de KNN

Commençons par un exemple simple. Considérez le tableau suivant - il comprend la taille,


l’âge et le poids (cible) pour 10 personnes. Comme vous pouvez le constater, la valeur de poids de
ID11 est manquante. Nous devons prédire le poids de cette personne en fonction de sa taille et de
son âge. Remarque: les données de ce tableau ne représentent pas les valeurs réelles. Il est
simplement utilisé comme exemple pour expliquer ce concept.
Pour une meilleure compréhension de ceci, voici l’intrigue de la taille par rapport à l’âge du tableau
ci-dessus:

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.

II. Comment fonctionne l'algorithme KNN?


Comme nous l'avons vu plus haut, KNN peut être utilisé à la fois pour les problèmes de
classification et de régression. L’algorithme utilise la «similarité de caractéristiques» pour prédire les
valeurs de tout nouveau point de données. Cela signifie que le nouveau point se voit attribuer une
valeur en fonction de sa ressemblance avec les points de l'ensemble d'apprentissage. D'après notre
exemple, nous savons que ID11 a une taille et un âge similaires à ID1 et ID5, de sorte que le poids
serait également approximativement le même.

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?

La moyenne des valeurs est considérée comme la prédiction finale.


Vous trouverez ci-dessous une explication pas à pas de l’algorithme:

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.

III. Méthodes de calcul de la distance entre les points


La première étape consiste à calculer la distance entre le nouveau point et chaque point
d’entraînement. Il existe différentes méthodes de calcul de cette distance, dont les plus connues sont
Euclidian, Manhattan (en continu) et Hamming (en catégorique). Tels que :

 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.

Or d’après le tableau des valeurs :

La prédiction de poids pour ID11 sera:

ID11 = (77 + 72 + 60) / 3

ID11 = 69,66 kg
Pour la valeur de k = 5, le point le plus proche sera ID1, ID4, ID5, ID6, ID10.

Or d’après le tableau des valeurs :

La prédiction pour ID11 sera: ID 11 = (77 + 59 + 72 + 60 + 58) / 5 DI 11 = 65,2 kg Nous remarquons


que sur la base de la valeur k, le résultat final a tendance à changer. Alors, comment pouvons-nous
déterminer la valeur optimale de k? Déterminons-le en fonction du calcul de l'erreur pour notre
training et de notre validation test. Les graphiques ci-dessous donnent l'erreur d'apprentissage et
l'erreur de validation pour différentes valeurs de k.
Pour une valeur très faible de k (supposons que k = 1) conduit à un taux d'erreur élevé sur l'ensemble
de validation. En revanche, pour une valeur élevée de k, le modèle fonctionne mal à la fois en
trainning et en validation des tests. Si vous observez de près, la courbe d'erreur de validation atteint
un minimum à une valeur de k = 9. Cette valeur de k est la valeur optimale du modèle (elle variera
pour différente base de données). Cette courbe est appelée «courbe du coude» (car elle a la forme
d’un coude) et est généralement utilisée pour déterminer la valeur k.

V. Travail sur un dataset

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.

# Importation des bibliothèques que nous allons avoir besoin

import pandas as pd

import numpy as np

import math

import operator

# Importation des données

data = pd.read_csv("iris.csv")

Print(data)

Output :

# Définition de la fonction qui calcule la distence Euclidienne entre deux points

def euclideanDistance(data1, data2, length):

distance = 0

for x in range(length):

distance += np.square(data1[x] - data2[x])

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.

#Creation d’un testset

testSet = [[7.2, 3.6, 5.1, 2.5]]

test = pd.DataFrame(testSet)

#choix du nombre des voisins = 3

k=3

#Execution du KNN modèle

resulttat,voisin = knn(data, test, k)

# la classe prédie

print(resultat)

>>> Iris-virginica #Output

# 3 proches voisins

print(voisin)

>>> [141, 139, 120] #Output

Donc l’algorithme nous a indiqué le type de la fleur qui est ‘IRIS-VIRGINICA’.

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 ?

Scikit-learn est une bibliothèque en Python qui fournit de


nombreux algorithmes d'apprentissage non supervisés et
supervisés. Cette bibliothèque contient de nombreux outils
efficaces pour l’apprentissage automatique et la modélisation
statistique, notamment la classification, la régression, le regroupement et la réduction de la
dimensionnalité. Veuillez noter que scikit-learn est utilisé pour construire des modèles.

from sklearn.neighbors import KNeighborsClassifier

neigh = KNeighborsClassifier(n_neighbors=3)

neigh.fit(data.iloc[:,0:4], data['Name'])

# Predicted class

print(neigh.predict(test))

>>> ['Iris-virginica'] #Output

# 3 nearest neighbors

print(neigh.kneighbors(test)[1])

>>> [[141 139 120]] #Output

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/

Vous aimerez peut-être aussi