Vous êtes sur la page 1sur 7

Ministère de l’Enseignement Supérieur et de la Recherche Scientifique

Université de Carthage
Institut Supérieur des Technologies de l’Information et de la Communication
Année Universitaire : 2021/2022

TP 6: Intelligence Artificielle (IA)


Enseignante: Classes:
&
Jihene LATRECH 3ème IOT/ 3ème IRS
Machine Learning (ML)

L’Algorithme des K plus proches voisins


K- Nearest Neighbors KNN

L’algorithme des K plus proches voisins ou K-Nearest Neighbors (kNN) est un algorithme de Machine
Learning qui appartient à la classe des algorithmes d’apprentissage supervisé. C’est un algorithme
simple et facile à mettre en œuvre qui peut être utilisé pour résoudre les problèmes de classification
et de régression. En général KNN est utilisé pour les taches de classification. Certaines applications en
KNN sont en reconnaissance d’image satellite, reconnaissance d’écriture manuscrite,…

KNN est un algorithme simpliste car il ne fait aucune hypothèse mathématique et ne nécessite pas de
machinerie lourde. Il nécessite juste une compréhension des distances entre les points. K-Nearest
Neighbors est considéré comme un algorithme paresseux car il n'y a pas de phrase d'apprentissage de
ce modèle. Il mémorise simplement les données d'entraînement et les compare à nos données de test.
En pratique l’algorithme KNN est assez peu utilisé dans sa forme première, car coûteux en puissance
de calcul.

Il est surnommé « plus proches voisins » car le principe de ce modèle consiste à choisir les k données
les plus proches du point étudié afin d’en prédire sa valeur.

La seule hypothèse de l’ algorithme KNN est: Les points proches les uns des autres sont similaires. Un
nouveau point est classé en fonction de ses voisins les plus proches, ou de la majorité des voisins les
plus proches s'il y en a plusieurs.

Comment KNN effectue une prédiction ?

Pour effectuer une prédiction, l’algorithme K-NN va se baser sur le jeu de données en entier. Pour une
observation, qui ne fait pas parti du jeu de données, qu’on souhaite prédire, l’algorithme va chercher
les K instances du jeu de données les plus proches de notre observation. Ensuite pour ces k voisins,
l’algorithme se basera sur leurs variables de sortie (output variable) y pour calculer la valeur de la
variable y de l’observation qu’on souhaite prédire.

 Si KNN est utilisé pour la régression, c’est la moyenne (ou la médiane) des variables y des K
plus proches observations qui servira pour la prédiction.
 Si KNN est utilisé pour la classification, c’est le mode des variables y des K plus proches
observations qui servira pour la prédiction.

1
Principe de l'algorithme KNN

KNN est utilisé pour classer les nouvelles données en fonction de leur proximité avec les k voisins
(données d’entrainement). Ainsi si les nouvelles données sont entourées de données d’apprentissage
qui ont la classe A, on peut en conclure que les nouvelles données sont incluses dans la classe A.

Soit un ensemble E contenant n données labellisées : E ={(yi, ⃗xi)}avec i compris entre 1 et n, où yi


correspond à la classe (le label) de la donnée i et où le vecteur ⃗xi de dimension p ( ⃗xi =(x1i, x2i, ...,
xpi)) représente les variables prédictrices de la donnée i.

Soit une donnée u qui n’appartient pas à E et qui ne possède pas de label (u est uniquement
caractérisée par un vecteur xu de dimension p).

Soit d’une fonction qui renvoie la distance entre la donnée u et une donnée quelconque appartenant
à E.

Soit un entier k inférieur ou égal à n. Voici le principe de l’algorithme de k plus proches voisins :
 On calcule les distances entre la donnée u et chaque donnée appartenant à E à l’aide de la
fonction d
 On retient les k données du jeu de données E les plus proches de u
 On attribue à u la classe qui est la plus fréquente parmi les k données les plus proches.

Comment mesurons-nous nos voisins les plus proches?

Il est possible d’utiliser différents types de distance : euclidienne, Manhattan ou Minkowski. Avec
l’algorithme KNN, nous mesurons généralement la distance euclidienne, la ligne droite ordinaire,
entre deux points.

 L'équation de distance euclidienne est:

Dans cette équation, p et q sont deux points dans l'espace n euclidien . Tout ce que nous avons à faire
est de mesurer cette distance de notre point de test à chaque point de données d'entraînement, puis
d'attribuer une étiquette prédite au test, en fonction des points qui en sont les plus proches.

2
 L'équation de distance de Manhattan est:

Il faut savoir qu’on choisit généralement la fonction de distance en fonction des types de données
qu’on manipule et du sens mathématique ou physique du problème qu’on a à résoudre. Très
schématiquement, pour les données quantitatives (exemple : la taille, le poids, le salaire, le chiffre
d’affaires etc…), la distance euclidienne est un bon choix pour commencer. La distance de Manhattan
peut être intéressante pour des données qui ne sont pas du même type (c’est-à-dire des données qui
n’ont pas été mise sur la même échelle).

Algorithme KNN

 Étape 1 : Déterminer la valeur de K.


La détermination de K dépend fortement selon les cas. La valeur de K par défaut dans
‘sklearn’ est 5.
 Étape 2 : Calculer la distance des nouvelles données avec les données d’entrainement en
utilisant une mesure de calcul de distance.
La distance utilisée par défaut dans ‘sklearn’ est euclidienne.
 Étape 3 : Trouver les K voisins les plus proches dans les données d’entrainement selon la
distance calculée.
 Étape 4 : Parmi ces K voisins, comptez le nombre de points appartenant à chaque catégorie.
 Étape 5 : Attribuer le nouveau point à la catégorie la plus présente parmi ces K voisins.

Avantages de l’algorithme KNN:

 L’algorithme est simple et facile à mettre en œuvre.


 Il n’est pas nécessaire de créer un modèle, de régler plusieurs paramètres ou de formuler des
hypothèses supplémentaires.
 L’algorithme est polyvalent. Il peut être utilisé pour la classification ou la régression.

Inconvénients de l’algorithme KNN:

 L’algorithme devient beaucoup plus lent à mesure que le nombre d’observation et de


variables indépendantes augmente.

3
TP Les K-plus proches voisins

Dans ce TP, on utilise le jeu de données de kaggle «iris.csv» pour une tâche de classification basée
l’algorithme KNN.

«iris.csv» est un ensemble de données qui contient 150 enregistrements de trois espèces de fleurs
d'iris Iris Setosa, Iris Virginica et Iris Versicolor .

iris setosa iris virginica iris versicolor

Il y a 50 enregistrements pour chaque espèce d'Iris et chaque enregistrement contient quatre


caractéristiques mesurées en cm.

 La largeur des sépales


 La longueur des sépales
 La largeur des pétales
 La longueur des pétales

Pour chaque iris mesuré, l'espèce ("iris setosa", "iris versicolor" ou "iris virginica") est notée.

Par souci de simplification, nous nous intéresserons uniquement à la largeur et à la longueur des
pétales. Nous allons utiliser un algorithme de k-voisins les plus proches pour classer ces espèces en
fonction de deux caractéristiques : la longueur et la largeur des pétales. Pour l'espèce de l'iris (au
lieu d'utiliser les noms des espèces, on utilisera des chiffres : 0 pour "iris setosa", 1 pour "iris
versicolor" et 2 pour "iris virginica".

#Importation des bibliothèques


import pandas as pd
import matplotlib.pyplot as plt

#Importation des données


iris= pd.read_csv("iris.csv")
print(iris)
print(iris.columns)
print(iris.Species.unique())

Encodage d’étiquettes d’ensembles de données


Les données d’entraînement sont souvent étiquetées avec des mots. Le codage d’étiquettes fait
référence à la conversion des étiquettes sous forme numérique afin de les convertir en une forme
lisible par la machine. Il s’agit d’une étape de prétraitement importante pour l’ensemble de données
structuré dans l’apprentissage supervisé.

4
Exemple :
Supposons que nous ayons une hauteur de colonne dans un ensemble de données :

Après avoir appliqué le codage d’étiquette, la colonne Hauteur est convertie en:

où 0 est l’étiquette pour hauteur, 1 est l’étiquette pour moyenne et 2 est l’étiquette pour hauteur
courte.
Nous appliquons l’ encodage d’ étiquette sur "iris dataset". Dans la colonne cible, les espèces sont des
mots : Iris-setosa, Iris-versicolor, Iris-virginica . Nous convertissons chaque valeur de la colonne en un
nombre.

['Iris-setosa' 'Iris-versicolor' 'Iris-virginica'] est converti en [0 1 2]

#Encodage des labels 'Species'


#Importation label encoder
from sklearn import preprocessing
#Instantiation d' un label encoder
label_encoder = preprocessing.LabelEncoder()
#Encodage des labels de la colonne 'Species'.
iris['Species']= label_encoder.fit_transform(iris['Species'])
#Affichgee des valeurs uniques de la nouvelle colonne 'Species'
print (iris['Species'].unique())

Etape 1: Sélection de la variable prédictive et de la variable observée


# X-les variables prédictives (indépendantes)
X = iris.iloc[:,3:5]
print(X)
# y-la variable observée (dépendante )
y = iris.loc[:,"Species"]
print(y)

# Normaliation des données pour qu'elles suivent la loi normale


from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
print(rescaledX)

5
Etape 2: Partitionnement du jeu de données en ensembles d'entraînement et de test.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(rescaledX, y, test_size = 0.4)

Etape 3: Construction du modèle KNN


#Définition d'une fonction KNN
from sklearn.neighbors import KNeighborsClassifier
def K_NN(X_train, X_test, y_train, y_test ,k):
#Instantiation de la classe KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=k)
#Formation du modèle
RKNN=knn.fit(X_train, y_train)
#Prédiction sur les données de test
y_pred=knn.predict(X_test)
Txerreur=(1-RKNN.score(X_test,y_test))
print('Taux d\'erreur sur l\'ensemble de test',Txerreur)
return y_pred

#Prediction des sorties de l’ensemble de test


y_pred=K_NN(X_train, X_test, y_train, y_test ,2)

Etape 4: Evaluation des performances du modèle


from sklearn.metrics import confusion_matrix,classification_report
#La matrice de confusion
CM=confusion_matrix(y_test, y_pred)
print('Matrice de Confusion: \n',CM)
#Le rapport ce classification
print('Rapport de classification: \n', classification_report(y_test, y_pred))

Réglage des Hyperparamètres du modèle pour l’ amélioration de ses performances

L’hyper paramétrage a pour but l’optimisation et l’amélioration des performances de l’algorithme.


Les hyper paramètres sont les paramètres d’un algorithme d’apprentissage automatique qui
contrôlent le processus d’apprentissage et l’efficacité de l’ algorithme d’apprentissage automatique
dans sa phase d’apprentissage et peuvent être définis et optimisés manuellement. Ils déterminent
essentiellement comment l’algorithme va adopter les différentes approches d’apprentissage dans les
différentes étapes de son processus d’apprentissage.

Les hyper paramètres de KNN

L’objet de la classe KNN peut prendre certains arguments (valeurs de paramètres) au moment de la
création. Si vous ne transmettez pas vous-même de valeurs à ces paramètres, ils seront définis sur

6
leurs valeurs par défaut. Certains des hyperparamètres de KNN sont "n_voisins" (la valeur de K), la
"métrique" (métriques de distance à utiliser, par exemple, distance de Manhattan ou euclidienne).
Le Grid search est une méthode d’optimisation (hyperparameter optimization) qui permet de tester
une série de paramètres et de comparer les performances pour en déduire le meilleur paramétrage.
Le grid search chacune des hypothèses et crée un modèle pour chaque combinaison de paramètres.
Le Grid Search a ses limites puisque c’est vous qui définissez à l’avance les paramètres que vous voulez
tester.

La validation croisée : le k-fold.

La validation croisée ou K-fold cross validation est une technique d’évaluation d’un algorithme de
Machine Learning. Elle consiste à découper le dataset en k échantillons. On sélectionne x échantillons
pour constituer l’échantillon d’apprentissage. Les k-x échantillons restants permettront d’évaluer la
performance du modèle. On répète l’opération sur toutes les combinaisons possibles. On obtient K
mesures de performance dont la moyenne représente la performance de l’algorithme.

La validation croisée permet d’utiliser l'intégralité de notre jeu de données pour l’entraînement et pour
la validation.

# Fixer les valeurs des hyperparamètres à tester


# Une liste de nombres de voisins
param=[{"n_neighbors":list(range(1,15))}]
# une grille d’hyperparamètres «grid search» permettant de determiner la meilleure
#combinaison pour avoir une performance meilleure de de l'algorithme
from sklearn.model_selection import GridSearchCV
knn= GridSearchCV(KNeighborsClassifier(),param,cv=5,scoring='accuracy',verbose=3)

RKNN=knn.fit(X_train, y_train)
best_k=RKNN.best_params_["n_neighbors"]
print("\n Meilleure valeur de k : ",best_k)

#Classification par KNN en utilisant la meilleure valeur de k


y_pred=K_NN(X_train, X_test, y_train, y_test ,best_k)

#La matrice de confusion


CM=confusion_matrix(y_test, y_pred)
print('Matrice de Confusion: \n',CM)
#Le rapport ce classification
print('Rapport de classification: \n', classification_report(y_test, y_pred))

Vous aimerez peut-être aussi