TP
Les K plus proches voisins

Algorithme d’apprentissage supervisé

Sommaire:

01.

Quel poste occupe se joueur ?

Déterminer quelles sont les données importantes

02.

Visualisation des données

Voir pour annalyser

03.

Implementer l'algorithme des K-NN

L'algorithme en Python

1. Quelles données choisir ?



Objectifs
Le but de cette activité est de déterminer, à partir des données dont nous disposons, si les trois joueurs mystères sont des piliers ou non ?

Les joueurs mystères


CJ STANDER

  • Nationalité : Afrique du sud
  • Age :29 ans
  • Date de naissance : 05/04/1990
  • Poids : 114 kg
  • Taille : 189 cm
Dillon LEWIS

  • Nationalité : Pays-de-Galles
  • Age : 23 ans
  • Date de naissance : 04/01/1996
  • Poids : 118 kg
  • Taille : 183 cm
Marco RICCIONI

  • Nationalité : Italie
  • Age : 22 ans
  • Date de naissance : 19/10/1997
  • Poids : 126 kg
  • Taille : 186 cm


Les données

Nous disposons d'un fichier rugby.csv qui contient les informations suivantes pour un grand nombre de

Pays Nom Poste Age Date de naissance Taille Poids
0 France Cyril BAILLE Pilier 26 15/09/1993 182 116
1 Cameroun Dany PRISO Pilier 25 02/01/1994 182 110
2 Angleterre Maro ITOJE 2ème ligne 25 28/10/1994 196 115
3 France Yacouba CAMARA 3ème ligne 25 02/06/1994 195 112
4 Pays-de-Galles George NORTH Ailier 27 13/04/1992 194 109
... ... ... ... ... ... ... ...


Parmi les données du fichier Rugby.csv, lesquelles semblent déterminantes dans le choix du poste occupé par un joueur ?

2. Visualisation des données



Déterminer la morphologie d'un pilier


Une image vaut mille mots.
Confucius

Dans le graphique ci-dessous, chaque joueur est représenté par le couple (taille, poids).
  • La taille est représentée sur l'axe des abscisses
  • Le poids est représenté sur l'axe des ordonnées


Quelle semble être la physionomie des joueurs occupant le poste de pilier ?

Les 3 joueurs mystères
On a rajouter dans ce graphique les 3 joueurs mystères.
  • Les piliers sont en rouge,
  • Les joueurs occupants d'autre poste sont en gris.

Pour chacun des joueurs dont le poste est inconnue, d'après vous est-il un pilier ? Quel facteur vous à aider à prendre votre décision ?

Essayer de décrire à la manière d'un algorithme, la façon de déterminer le poste d'un joueur.

3. Implémentation Python



Préparation de l'espace de travail


Préparation des données
A partir du fichier Rugby.csv, créer une fonction traitement_données qui renvoie une liste nommée de dictionnaires.
Les dictionnaires doivent être construits de la manière suivante :
  • Une clé "label" : qui contient le poste occupé
  • Une clé "caracteristiques" : qui contient un tuple (poids, taille)

La sortie de la fonction ressemblera donc a :

[{"label":"Pilier","caracteristiques":(182,116)},
 {"label":"Pilier","caracteristiques":(182,110)},  
 {"label":"2ème ligne","caracteristiques":(196,115)),  
 ... 
]

La description du fichier CSV est faites dans la partie 1.
La lecture d'un fichier CSV a été vue au thème 3.

def traitement_donnees(csvfile):
  """
  Fonction qui 
  Arguments
  @param  csvfile : (str) chemin vers le fichier CSV 
  
  Sortie
  @result elm: le mode de la liste
  """
  votre code ci-dessous



Implémentation des fonctions
Complète la fonction distance ci-dessous pour quelle retourne la distance euclidienne entre 2 n-uplets A et B.
Rappel : Soit A(x_A~;~y_A) et B(x_B~;~y_B) deux points du plan.
La distance euclidienne AB est donnée par la formule :

AB = \sqrt{(x_B-x_A)^2 + (y_A - y_B)^2 }

from math import *
                        

def distance(A, B):
  """
  Fonction qui renvoie la distance euclidienne entre 2 points
  Arguments :
  @param A (tuple) : tuple de 2 nombres réels
  @param B (tuple) : tuple de 2 nombres réels

  Sortie :
  @result (nombre) : distance euclidienne des 2 tuples

  Tests :
  >>> distance((2,3),(5,7))
  5.0
  """ 
  # votre code ci-dessous

if __name__ == "__main__":
  import doctest
  doctest.testmod(verbose = True)
Complète la fonction distance ci-dessous pour quelle retourne la distance euclidienne entre 2 n-uplet A et B.

def mode(liste):
    """
    Fonction retourne le mode (la valeur la plus fréquente) d'une liste.
    Arguments :
    @param liste (list): 
    
    Sorties :
    @result elm (): le mode de la liste

    >>> mode(["chien","chat","chat","chien","chat","souris"])
    'chat'
    """
    # votre code ci-dessous 


if __name__ == "__main__":
  import doctest
  doctest.testmod(verbose = True)
A l'aide des fonctions précédemment définies et du pseudo-code des K-NN, écrire un programme Python qui détermine le poste probablement occupé par un joueur en fonction de sa taille et de son poids.

def k_nn(k,entree,donnees):
    """
    Fonction retourne le mode d'une liste.
    
    @param k (int): nombre de voisins utilisés.
    @param entree (n-upplet): caractéristiques de la nouvelle donnée. 
    @param donnees (list): liste de dictionnaire ayant une clé 'label' et une clé 'caracteristiques'.
    
    @result (str): le label affecté à la nouvelle entrée.
    """


Utilisation de l'algorithme

Quel est le poste occupé par CJ Sanders en utilisant l’algorithme avec 1 voisin (k =1) ? avec 3 voisins (k =3) ?