Ecole Supérieure d’Informatique – Master I Sciences de données (2020 - 2021) – Dr Sibiri T.
TP 3 : SVM
L’objectif de cette séance de travaux pratiques est d’illustration l’utilisation des
machines à vecteurs de support (Support Vector Machines, SVM) pour les problèmes
de classification linéaires en python avec Scikit-learn.
1. Chargement de données
Dans cet exemple nous allons travailler avec la base de données Iris, facilement
accessible dans sklearn. Cette base contient 150 instances d’iris (un type de plante,
chaque observation décrit sa morphologie). L’objectif est de classer chaque instance en
une des trois catégories : Iris setosa, Iris virginica ou Iris versicolor.
Les attributs du jeu de données sont :
longueur de sépale,
largeur de sépale,
longueur de pétale,
largeur de pétale,
classe : Iris Setosa, Iris Versicolor ou Iris Virginica..
2. Partition des données
Pour pouvoir afficher les résultats, on va utiliser seulement les premiers deux attributs
(longueur et largeur des sépales).
Pour la suite de l’étude, il faudra mettre en commentaire, l’affichage des données.
Ensuite scinder les données en apprentissage (90%) et test (10%)
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
# Chargement des données
iris = datasets.load_iris()
X, y = iris.data[:, :2], iris.target
# On conserve 50% du jeu de données pour l'évaluation
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
2. Modélisation
Ecole Supérieure d’Informatique – Master I Sciences de données (2020 - 2021) – Dr Sibiri T.
3. SVM linéaires
Dans Scikit-learn, les SVM sont implémentées dans le module « sklearn.svm ». Dans
cette partie nous allons nous intéresser à la version linéaire (Scikit-learn utilise les
bibliothèques libLinear et libSVM). La classe qui nous intéresse est « linearSVC »
(classification) et « linearSVR » (pour la régression) ayant les paramètres suivants :
dual: optionnel (default=True). Détermine si la méthode duale de résolution
sera utilisé ou non.
C : le paramètre cout
Multi_class: choix de la méthode dans le cas multiclasse : « ovr » : « one-vs-
rest » et « crammer_singer » : « one-vs-one »
Fit_intercept(default=True) : boolean, retourne la valeur de 𝛽0
max_iter (default = 1000): nombre maximal d’itération
Le code suivant permet d’entrainer une machine à vecteur de support linéaire
C = 1.0 # paramètre de régularisation
lin_svc = svm.LinearSVC(C=C)
lin_svc.fit(X_train, y_train)
3.1 Calculez le score d’échantillons bien classifiés sur le jeu de données de test.
A présent visualisons la surface de décision apprise par le modèle :
# Créer la surface de décision discretisée
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# Pour afficher la surface de décision on va discrétiser l'espace avec un pas
h
h = max((x_max - x_min) / 100, (y_max - y_min) / 100)
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Surface de décision
Z = lin_svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
# Afficher aussi les points d'apprentissage
plt.scatter(X_train[:, 0], X_train[:, 1], label="train", edgecolors='k',
c=y_train, cmap=plt.cm.coolwarm)
plt.scatter(X_test[:, 0], X_test[:, 1], label="test", marker='*', c=y_test,
cmap=plt.cm.coolwarm)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title("LinearSVC")
Ecole Supérieure d’Informatique – Master I Sciences de données (2020 - 2021) – Dr Sibiri T.
3.2 Testez différentes valeurs pour le paramètre C. Comment la frontière de décision
évolue en fonction de C ?
3.3 D’après la visualisation ci-dessus, ce modèle vous paraît-il adapté au problème ? Si
non, que peut-on faire pour l’améliorer ?
3.4 Réalisez l’optimisation d’une nouvelle machine à vecteur de support linéaire mais
en utilisant les quatre attributs du jeu de données Iris. Le score de classification en test
a-t-il augmenté ? Pourquoi ?
4. SVM non linéaires
Dans la librairie de Scikit-learn, les SVM non linéaires sont implémentés graçe aux
classes SVC et SVR. Les paramètres les plus importants sont :
C: optionnel (default=1.0). paramètre cout
Kernel (default = ‘rbf’): type de fonction noyau (‘linear’ : noyau linéaire, ‘poly’ :
noyau polynomial, ‘rbf’ : noyau RBF, ‘sigmoid’ : noyau sigmoide,
‘precomputed’ : matrice de noyau précalculée
coef0 (default=0) : paramètre initial définit en fonction du noyau utilisé
probability (default = False): Calcule la probabilité associée à chaque classe pour
un individu donné
gamma (default = ‘scale’): si gamma = ‘auto’, alors gamma = 1/p (p étant le nombre
d’attributs)
decision_function_shape (default ‘ovr’): choix de la stratégie de classification multi
classe
4.1 Reprendre la classification en considérant un noyau gaussien.
from sklearn import svm
clf = svm.SVC(C=0.1, kernel='rbf', gamma=0.25)
clf.fit(X_train, y_train)
Ecole Supérieure d’Informatique – Master I Sciences de données (2020 - 2021) – Dr Sibiri T.
4.2 Testez l’effet du paramètre d’échelle du noyau (gamma) et du paramètre de
régularisation C
4.3 Comme dans le cas précédent, nous pouvons afficher la frontière de décision en ne
conservant que deux variables explicatives
# Pour afficher la surface de décision on va discrétiser l'espace avec un pas
h
h = .02
# Créer la surface de décision discretisée
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Surface de décision
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
# Afficher aussi les points d'apprentissage
plt.scatter(X_train[:, 0], X_train[:, 1], label="train", edgecolors='k',
c=y_train, cmap=plt.cm.coolwarm)
plt.scatter(X_test[:, 0], X_test[:, 1], label="test", marker='*', c=y_test,
cmap=plt.cm.coolwarm)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title("SVM RBF")
Que constatez-vous par rapport au cas précédent (cas linéaire ?)