0% ont trouvé ce document utile (0 vote)
89 vues4 pages

TP3 SVM

Ce document présente une séance de travaux pratiques sur l'utilisation des machines à vecteurs de support (SVM) pour la classification de données avec Python et Scikit-learn. Il décrit le chargement des données Iris, la modélisation SVM linéaire et non linéaire, et l'optimisation des hyperparamètres.

Transféré par

David
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
89 vues4 pages

TP3 SVM

Ce document présente une séance de travaux pratiques sur l'utilisation des machines à vecteurs de support (SVM) pour la classification de données avec Python et Scikit-learn. Il décrit le chargement des données Iris, la modélisation SVM linéaire et non linéaire, et l'optimisation des hyperparamètres.

Transféré par

David
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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 ?)

Vous aimerez peut-être aussi