Classification supervisée par SVM

Nous allons maintenant étudier l'algorithme SVM de classification supervisée. Nous utilisons la la bibliothèque d'apprentissage automatique disponible dans python dénommée scikit-learn. Il est indispensable d'avoir réalisé le TP sur la régression logistique auparavant. Nous allons voir que passer de la régression logistique à une SVM se fait sans aucun effort !

Calcul d'une SVM

Chargement du jeu de données

À nouveau, nous allons utiliser les iris. Nous reprenons à l'identique ce que nous avons fait pour la régresion logistique pour charger les données.

Calculer la SVM

On commence par importer la bilbiothèque nécessaire pour les SVM :

from sklearn import svm

puis on applique la SVM sur le jeu de données :

C = 1.0
svc = svm. SVC (kernel = 'linear', C = C). fit(X, Y)

Prédire la classe de données par la SVM

On peut maintenant utiliser le modèle pour prédire la classe d'une donnée.
Pour cela, en supposant que donneesApredire est un tableau contenant les attributs des données à prédire (tableau de la même forme que X), on écrit :

classesPredites = svc. predict (donneesApredire)

qui met dans classesPredites la classe prédite pour chacune des données contenues dans donneesApredire.

À faire

  1. Calculer la SVM pour les iris en utilisant 80 % des iris pour l'entraînement et les autres 20 % pour le test.
    Calculez le taux d'erreur.
    Construisez la matrice de confusion.
  2. Comparons la classe prédite par la régression logistique et celle prédite par la SVM. Pour cela, on utilise le même ensemble d'entraînement pour calculer la SVM et réaliser la régression logistique. On utilise ensuite le même ensemble de données de test.
    • Comparez le taux d'erreur de ces deux méthodes.
    • Déterminez les données mal prédites par les deux méthodes et celles mal prédites par l'une et bien prédite par l'autre.

Faire un graphique des iris indiquant ceux dont la classe prédite est fausse

Faire un graphique dans le plan (longueur des pétales, largeur des pétales) dans lequel vous identifiez (par la taille, une couleur, ... comme vous voulez du moment que l'on comprend) les données mal prédites par l'une ou l'autre méthode, ou les deux.

Frontières de décision

Le but du graphique que nous allons réaliser maintenant et de visualiser les zones de l'espace des données correspondant à la prédiction de chacune des classes.

Pour pouvoir réaliser un graphique en deux dimensions, nous ne considérons que 2 attributs des iris, la longueur et la largeur des pétales.
Le principe consiste à balayer cet espace à intervalles réguliers, à prédire la classe de chacun de ces points et à réaliser un graphique avec ces prédictions.
On balaie par exemple la longueur des pétales depuis la valeur minimale de cet attribut dans le jeu de données moins une marge (0,5 par exemple) jusque la valeur maximale de cet attribut dans le jeu de données plus une marge. On fait la même chose pour la largeur des pétales. Dans scikit-learn, on dispose de mécanismes qui nous permettent de faire cela très simplement. On construit une grille (mesh en anglais) dont les intersections sont ces points qui vont être balayés. Ainsi, on peut écrire :

import numpy as np
h = .02  # pas de la grille
X2d = iris.data [:, 2:4] # on ne prend que les deux attributs longueur et largeur des pétales
# on crée la grille ci-après
x_min = X2d [:, 0].min() - .5
x_max = X2d [:, 0].max() + .5
y_min = X2d [:, 1].min() - .5
y_max = X2d [:, 1].max() + .5
xx, yy = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))
# la grille est créée. Les coordonnées des intersections sont dans xx et yy

# on construit la SVM sur tous les exemples
svc2d = svm. SVC (kernel = 'linear', C = C). fit (X2d, Y)
svc2d. fit (X2d, Y)
# on utilise ce modèle pour prédire la classe de chacun des exemples
Z2d = svc2d. predict (np.c_[xx.ravel(), yy.ravel()])
# et on fait la figure
Z2d = Z2d. reshape (xx. shape)
plt. figure ()
plt. pcolormesh (xx, yy, Z2d, cmap=plt.cm.Paired)
plt. show ()

Ces quelques lignes de python tracent les frontières de décision. Cette figure ressemble à cela :

Pour finir : ce n'est qu'un début

De nombreux algorithmes de classification supervisée (et non supervisée) sont disponibles dans scikit-learn. Une fois que vous savez en utilisez un, vous savez tous les utiliser. Il suffit d'importer les fonctions nécessaires et d'appeler ensuite la bonne fonction.
Vous avez ainsi accès à :