Aller au contenu

Méthode du K-Nearest-Neighbours (KNN), aka les k-plus-proches-voisins⚓︎

La méthode KNN est une méthode simple et efficace de classification. La classification est un enjeu majeur de l'Intelligence Artificielle : - la caméra d'une voiture autonome perçoit un panneau, mais quel est ce panneau ? - un grain de beauté est pris en photo par un dermatologue, ce grain de beauté est-il cancéreux ? - ...

La méthode du KNN va trouver quels sont, dans une base de données déjà bien remplie et labellée, les k-objets (les 6 objets si \(k=6\) par exemple) qui se rapprochent le plus de l'objet à classifier. En prenant ensuite la caractéristique la plus fréquente parmi ces 6 objets, on devine alors dans quelle catégorie notre objet doit se classer.

Notre objectif : Nous allons reprendre le jeu de données sur les joueurs du top14 utilisé ici https://github.com/glassus/nsi/blob/master/Premiere/Theme06_Traitement_de_donnees/03_Pandas_eleves.ipynb

Question : si on croise une personne nous disant qu'elle veut jouer en top14, et qu'elle nous donne son poids et sa taille, peut-on lui prédire à quel poste elle devrait jouer ?

Dans toute idée de classification il y a l'idée de distance. Il faut comprendre la distance comme une mesure de la différence.

Comment mesurer la différence physique entre deux joueurs de rugby ?

import pandas as pd #import du module pandas, abrégé classiquement par "pd"
df = pd.read_csv('data/top14.csv', encoding = 'utf-8')

Résultat attendu :⚓︎

Il faut créer une fonction knn() qui prend en argument poids et taille , sont les caractéristiques du nouveau joueur. La fonction doit renvoyer une chaîne de caractère correspondant au poste auquel elle est susceptible de jouer.

Exemple :

def knn(poids, taille):
  df['distance']=(df['Taille']-taille)**2+(df['Poids']-poids)**2
  newdf = df.sort_values(by='distance', ascending=True)
  newdftri = newdf.head(6) #on prend les 6 joueurs les plus proches physiquement
  sol = newdftri['Poste'].describe().top
  return sol
knn(93,188)
'Ailier'

Influence du paramètre \(k\)⚓︎

Dans le code précédent, on a travaillé avec \(k=6\) et c'est le poste majoritaire parmi les 6 joueurs les plus proches qui a été donné par l'algorithme.
Modifions légèrement la fonction knn() afin d'observer l'influence du paramètre \(k\) sur la prédiction :

def knn(poids, taille, k):
  df['distance']=(df['Taille']-taille)**2+(df['Poids']-poids)**2
  newdf = df.sort_values(by='distance', ascending=True)
  newdftri = newdf.head(k) #on prend les k joueurs les plus proches physiquement
  sol = newdftri['Poste'].describe().top
  return sol

for k in range(1,20):
    print(knn(93,188,k))
Centre
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier
Ailier

On s'aperçoit que la prédiction est très stable... sauf si \(k=1\) !
Il se trouve qu'un joueur possède exactement ces caractéristiques physiques (Pierre-Louis BARASSI) et qu'il joue Centre :

df['distance']=(df['Taille']-188)**2+(df['Poids']-93)**2
newdf = df.sort_values(by='distance', ascending=True)
newdf.head(10)
Equipe Nom Poste Date de naissance Taille Poids distance
314 Lyon Pierre-Louis BARASSI Centre 22/04/1998 188 93 0
461 Pau Vincent PINTO Ailier 10/04/1999 187 93 1
527 Toulon Stéphane ONAMBÉLÉ 3ème ligne 12/02/1993 188 94 1
202 Castres Geoffrey PALIS Arrière 08/07/1991 189 93 1
196 Castres Armand BATLLE Ailier 12/04/1987 188 92 1
585 Toulouse Théo BELAN Centre 15/11/1992 187 94 2
242 Clermont Samuel EZEALA Ailier 11/12/1999 187 94 2
502 Racing92 Simon ZEBO Ailier 16/03/1990 187 94 2
133 Brive Esteban ABADIE 3ème ligne 01/12/1997 188 95 4
369 Montpellier Benjamin FALL Arrière 03/03/1989 186 93 4

On peut s'apercevoir aussi que jusqu'à \(k=5\), aucun poste n'est majoritaire : la prédiction pourrait aussi bien renvoyer Centre, 3ème ligne, ou Arrière. Ce n'est que grâce à l'ordre alphabétique que la réponse renvoyée est «Ailier». Par contre, dès que \(k \geqslant 5\), le poste d'Ailier est bien majoritaire parmi les \(k\) plus proches voisins.



Dernière mise à jour: 2024-04-23