USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
TP N°2 : M ACHINES À VECTEURS SUPPORTS
s L’objectif de ce TP est de :
• Maitriser en pratique les algorithmes SVM linéaire et non linéaire.
• Utiliser l’astuce du noyau pour appliquer une SVM à marge douce dans le cas non li-
néaire.
• Calculer la performance du classificateur avec un protocole expérimental, à savoir la pré-
diction.
s Matériel :
• [Link] - Données section 2.1. • svmPredict.m - Prédiction SVM.
• [Link] - Données section 2.2. • traceData.m - Tracer les données 2D.
• [Link] - Données section 2.3. • VFL.m - Tracer une frontière linéaire.
• [Link] - Données section 3. • VFNL.m - Tracer une frontière non linéaire.
• svmModel.m - Entraînement SVM. • Noyaulineare.m - Noyau linéaire pour SVM.
1 Partie théorique
Un SVM (Machine à vecteurs supports) est un algorithme d’apprentissage automatique supervisé
susceptible d’être utilisé à des fins de classification et de régression. Les SVM sont plus couramment
utilisés pour les problèmes de classification et c’est pourquoi nous nous concentrerons sur ce point
dans ce TP. Son objectif est de déterminer une frontière afin de séparer les observations en groupes
distincts tout en maximisant la marge de séparation.
Ce type d’algorithme est particulièrement efficace lorsque les données sont linéairement séparables
(séparables par un hyperplan ), ce qui en pratique est rarement le cas. Une technique consiste donc à
projeter les données dans un espace vectoriel de plus grande dimension à l’aide d’un élément appelé
noyau, permettant alors une création de frontiè[Link] nous concentrons dans ce TP sur les noyaux
types :
— Le noyau gaussien :
2
x (i ) − x ( j)
K x (i ) , x ( j ) = exp − (1)
2σ 2
n 2
∑ x(ki) − x(kj)
k =1
−
= exp
2σ2
— Le noyau linéaire :
K x(i) , x( j) = x(Ti) × x( j) . (2)
Q.1 : Quelle est la différence entre le SVM à marge rigide et le SVM à marge douce ?
Mr. E .Meftah 1 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
Q.2 : Quel est le rôle de l’hyperparamètre C et σ dans les SVM ?
Q.3 : Quels sont les vecteurs de support dans les SVM ?
Q.4 : Que signifie le sur-apprentissage dans les SVM ?
2 Partie pratique
Dans la première moitié de cet exercice, vous devrez appliquer les SVM (machines à vecteurs de
support) sur différents ensembles de données 2D. Cela vous aidera à avoir une idée sur le fonction-
nement des SVM ainsi qu’à utiliser un noyau gaussien avec les SVM.
2.1 SVM à noyau linéaire
Nous commencerons par un exemple d’ensemble de données en 2D ([Link]) pouvant être
séparé par une frontière linéaire. Dans cet ensemble de données, les positions des exemples positifs
(indiqués par +) et des exemples négatifs (indiqués par o) suggèrent une séparation naturelle indi-
quée par l’écart. Notez que nous importons loadmat ici, car nos données sont sous forme de matrice.
1 %% Initialisation
2 clear ; close all ; clc
3 load ( ' TP2data1 . mat ') ;
4 % Tracer les donnees d ' entrainement
5 traceData (X , y ) ;
Q.1 : Que represente la matrice X, et y ?
Q.2 : Donnez les coordonnées des points aberrants ( le cas échéant ).
Maintenant, dans cette partie, nous allons implémenter une machine vectorielle de support utilisant
un noyau linéaire, et nous verrons comment le paramètre de régularisation peut avoir un impact sur
l’hyperplan. Le bloc de code ci-dessous adapte simplement un SVM aux données, et nous utilisons
les prédictions pour tracer l’hyperplan. Notez que nous utilisons un paramètre de régularisation de
C = 1.
1 C = 100; % test
2 model = svmModel (X , y , C , @ Noyaulineare , 1e -3 , 20) ; % Le modele
3 VFL (X , y , model ) ; % Visualiser les frontieres lineaires
Q.3 : En faisant varier le paramètre de régularisation de C = 1, 10, 100, 1000. Montrez les effets sur
l’hyperplan en présence d’une valeur aberrante.
Q.4 : Justifiez votre choix du paramètre C (faible ou fort) pour une utilisation future de ce modèle.
Q.5 : Modifiez le code traceData.m et tracez les vecteurs de support. Commenter le nombre de vec-
teurs de [Link] la variance de C.
Q.6 : En exploitant votre modèle, donnez l’équation de l’hyperplan ?
Mr. E .Meftah 2 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
2.2 SVM à noyau gaussien
Maintenant, nous savons que pour tenir compte des limites non linéaires, nous devons changer la
fonction du noyau. Dans cette section, nous utiliserons un noyau gaussien .
Q.1 : Tout d’abord, traçons nos données en 2D ([Link]).
Q.2 : Entrainer et visualiser une SVM linéaire sur les données. Qu’observez-vous ?
Maintenant, grâce à l’utilisation du noyau gaussien avec le SVM, vous serez en mesure d’apprendre
une frontière de décision non linéaire qui peut fonctionner relativement bien pour cet ensemble de
données. Vous devez maintenant compléter le code dans la fonction Noyaugaussien.m pour calculer
le noyau gaussien entre deux exemples ( x (i ); x ( j)).
1 function sim = Noyaugaussien ( x1 , x2 , sigma )
2
3 % Assurez - vous que x1 et x2 sont des vecteurs colonnes .
4 x1 = x1 (:) ; x2 = x2 (:) ;
5 % Initialisation .
6 sim = 0;
7 % == == == === = = = = = = = = = = = = = VOTRE CODE ICI = = = = = = = = = = = = = = = = = = = = = =
8
9 sim = ......;
10 % =============================================================
11
12 end
Q.3 : Après avoir terminé votre code, testez votre noyau sur les deux vecteurs suivants
— x1 = ; x1 = 1 1 1 1 ; sigma = 2;
1 1 1 0
— x1 = 1 −1 4 0 ; x1 = 0 5 2 1 ; sigma = 2;
Q.4 : Que remarquez-vous ? Discutez le rôle principal du noyau gaussien.
Q.5 : Refaites le même test pour σ = 0.5, 5, et 20, puis montrez son effet sur le fonctionnement de
noyau.
Q.6 : Entrainer et visualiser une SVM non-linéaire sur les données ([Link]), on prend ici C =
1 et σ = 0.1. Qu’observez-vous ?
Q.7 : Décrire l’éffet de C et σ sur la séparatrice (la frontière) et les vecteurs de support.
2.3 Validation croisée
Un SVM à noyau gaussien implique deux paramètres, C et σ, qui influencent les performances de
classification. Nous ne pouvons pas déterminer a priori pour chaque tâche de classification, quels
sont les paramètres les plus éfficaces. Pour déterminer ces paramètres, il est souvent fait appel à la
méthode de validation croisée à n − plis :
Mr. E .Meftah 3 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
Algorithm 1 Validation croisée.
1. L’ensemble d’apprentissage est divisé en n sous-ensembles de taille égale.
2. Pour un ensemble donné de paramètres, chacun de ces n sous-ensembles est testé avec une
machine entraînée sur les n − 1 autres sous-ensembles.
3. Nous obtenons ainsi, pour chaque couple (C, σ) une valeur de précision correspondant au
pourcentage d’exemples bien classés. Nous gardons le couple de précision maximale.
1 function [C , sigma , predictions ] = ParamsTP2data3 (X ,y , Xval , yval )
2 % ParamsTP2data3 renvoie les parametres d ' entrainement optimaux (C ,
sigma ) utiliser pour le SVM avec noyau gaussien .
3
4 steps = [0.01 0.03 0.1 0.3 1 3 10 30];
5
6 % == == == === = = = = = = = = = = = = = VOTRE CODE ICI = = = = = = = = = = = = = = = = = = = = = =
7 minSim = 1/ length ( yval ) % La similitude minimale
8
9 for i = 1: length ( steps )
10 testC = steps ( i ) ;
11 for j =1: length ( steps )
12 testSigma = steps ( j ) ;
13 % Entrainer le SVM
14 model =....;
15 predictions = ....;
16 moySim = ....;
17
18 if ( moySim > minSim )
19 C = testC ;
20 sigma = testSigma ;
21 minSim = moySim ;
22 fprintf ( ' MoySim = % f ' , moySim ) ;
23 end
24 end
25 end
26 % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
27 end
Dans la base de données fournie, [Link], on vous donne les variables X, y, Xval, yval. Le code
fourni dans svmModel.m entraîne le classificateur SVM avec l’ensemble d’entraînement ( X, y) en
utilisant les paramètres optimaux C et σ chargés depuis ParamsTP2data3.m.
Q.1 : Compéter le code ci-dessus, et donner les paramètres optimaux C et σ.
Q.2 : Pour ces paramètres :
(a) Entrainer et visualiser une SVM non-linéaire sur les données ([Link]),.
Qu’observez-vous ?
(b) Utiliser la fonction svmPredict pour générer les prédictions pour l’ensemble de validation
croisée, calculer la valeur de la précision de validation par
mean(double(p == yval)) * 100
Mr. E .Meftah 4 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
3 HomeWork
Charger les données [Link].
Q.1 : Entrainer et visualiser une SVM linéaire sur les données, on prend ici C = 10. Qu’observez-
vous ?
Q.2 : En exploitant votre modèle, donnez l’équation de l’hyperplan ?
Q.3 : Reprenez la partie 2.3.
4 Tâches optionnelles
Dans cette section, nous avons inclus quelques codes PythonTM *(facultatifs). Ils vous aideront à ap-
profondir votre compréhension du TP, et si vous êtes en mesure de le faire, nous vous encourageons
à les compléter également.
Mr. E .Meftah 5 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
4.1 Chargement des bibliothèques [5]: x1 = [Link]([1, -1, 4, 0])
x2 = [Link]([0, 5, 2, 1])
[1]: # utilisé pour manipuler les chemins␣ sigma = 2
,→des répertoires sim = ....# Call Noyaugaussien
import os print('Noyau gaussien entre x1 = [1,␣
import numpy as np ,→-1, 4, 0], x2 = [0, 5, 2, 1], sigma␣
from matplotlib import pyplot ,→= %0.2f:'
# will be used to load MATLAB mat␣ '\n\t%f\n\n' % (sigma, sim))
,→datafile format
from [Link] import loadmat [6]: # Chargement depuis TP2data2
# bibliothèque écrite pour ce TP␣ data = loadmat('[Link]')
,→fournissant des fonctions␣
X, y = data['X'], data['y'][:, 0]
,→supplémentaires
# Tracer les données d'entraînement
import svm [Link](X, y)
%matplotlib inline
[7]: # Essayez de modifier la valeur de C␣
,→ci-dessous et observez la variation
# du seuil de décision (p. ex.,␣
,→essayez C = 1)
4.2 SVM à noyau linéaire C = 1
sigma = 0.1
[2]: # Chargement depuis TP2data1 model= [Link](X, y, C,␣
data = loadmat('[Link]') ,→Noyaugaussien, args=(sigma,))
X, y = data['X'], data['y'][:, 0] [Link](X, y, model)
# Tracer les données d'entraînement
[Link](X, y)
4.4 Validation croisée
[8]: # Chargement depuis TP2data2
[3]: # Essayez de modifier la valeur de C␣ data = loadmat('[Link]')
,→ci-dessous et observez la variation
X, y, Xval, yval = data['X'],␣
# du seuil de décision (p. ex.,␣ ,→data['y'][:, 0], data['Xval'],␣
,→essayez C = 100) ,→data['yval'][:, 0]
C = 100 # Tracer les données d'entraînement
model = [Link](X, y, C, svm. [Link](X, y)
,→Noyaulineare, 1e-3, 20)
[Link](X, y, model)
4.3 SVM à noyau gaussien
[4]: def Noyaugaussien(x1, x2, sigma):
sim = 0
# == VOTRE CODE ICI ===
#def Noyaugaussien(x1, x2, sigma):
x1 = [Link]( x1 )
x2 = [Link]( x2 )
sim= ....# Utiliser [Link](),np.
,→dote(),[Link]()
# ==========
return sim
Mr. E .Meftah 6 Mr. [Link] 2023/2024
2022/2023
USTHB, FGE, ELN Master 1 ESE TP Intelligence artificielle
[9]: def ParamsTP2data3(X, y, Xval, yval):[10]: C, sigma = ParamsTP2data3(X, y, Xval,␣
""" ,→yval)
Vous pouvez utiliser `svmPredict`␣ print(C, sigma)
,→pour prédire les étiquettes de␣
,→l'ensemble de validation croisée. [11]: # Calculer la précision et afficher␣
Par exemple ,→les résultats
# Entraîner le SVM avec les paramètres␣
predictions = svm. ,→optimaux (C, sigma)
,→svmPredict(model, Xval) model =....
# tracer SVM
retournera les prédictions sur␣ .....
,→l'ensemble de validation croisée. predictions = ....
Note precision = ....
---- print("La valeur optimale de C est " +␣
Vous pouvez calculer l'erreur de␣ ,→str(C) + " and optimal sigma value␣
,→prédiction en utilisant ,→is " + str(sigma))
print("En utilisant ces paramètres,␣
[Link](predictions != yval) ,→nous obtenons une précision :" +␣
""" ,→str(precision))
#==== VOTRE CODE ICI =====
C_values = [0.01, 0.03, 0.1, 0.3, 1,␣
,→3, 10, 30]
sigma_values = [0.01, 0.03, 0.1, 0.3,␣
,→1, 3, 10, 30]
# Exécuter la recherche et enregistrer␣
,→les paramètres pour une erreur␣
,→minimale
min_error = 1 # Commencer par␣
,→l'erreur du pire classificateur␣
,→possible
for _, C_val in enumerate(C_values):
for _, sigma_val in␣
,→enumerate(sigma_values):
# Entraîner le SVM sur les données␣
,→d'entraînement
model =....
# Évaluer le modèle sur les données de␣
,→validation
predictions = ...
# Calculer l'erreur
error = ...
# Mettez à jour les paramètres si␣
,→l'erreur est inférieure à l'erreur␣
,→minimale trouvée jusqu'à présent.
if error < min_error:
min_error = error
C = C_val
sigma = sigma_val
# =====
return C, sigma
Mr. E .Meftah 7 Mr. [Link] 2023/2024
2022/2023