Introduction à l'apprentissage automatique: TP4 - Exercice 2


Reconnaissance de chiffres manuscrits par SVM


On reprend l'exemple MNIST du TP3:

In [ ]:
from sklearn import datasets, linear_model, metrics
%matplotlib inline 

# Mnist database: (il faut quelques dizaines de secondes pour charger la base)
# les données sont décrites ici: https://www.openml.org/d/554
size_images=(28,28)
X_digits, y_digits = datasets.fetch_openml('mnist_784', version=1, return_X_y=True)
X_digits=X_digits[:10000,:]/255.  # normalisation des niveaux de gris entre 0 et 1
y_digits=y_digits[:10000]

n_samples = len(X_digits)
print("nombre total d'observations (apprentissage + test): %d" % n_samples)

n_features = len(X_digits[0])
print("nombre de caractéristiques par observation: %d" % n_features)

X_train = X_digits[: 9000]
y_train = y_digits[: 9000]
X_test = X_digits[9000 :]
y_test = y_digits[9000 :]
print("nombre d'observations dans la base d'apprentissage: %d" %len(X_train))
print("nombre d'observations dans la base de test: %d" %len(X_test))

La cellule suivante définit la fonction qui permet d'afficher les 150 premières images de la base de test, ainsi que la classe véritable et la classe déterminée par l'algorithme de classification:

In [ ]:
import numpy as np
import matplotlib.pyplot as plt

def affichage_150_images(X_test,y_test,y_pred):
    plt.figure(figsize=[15,12])   
    for n in range(150):
        plt.subplot(10,15,n+1,xticks=[],yticks=[])
        plt.imshow(np.reshape(X_test[n,:],size_images),cmap='gray_r')
        if y_pred[n]==y_test[n]:
            plt.text(0.1,0.1,str(y_pred[n])+' / '+str(y_test[n]),fontsize=6,bbox=dict(facecolor='white', alpha=1))    
        else:
            plt.text(0.1,0.1,str(y_pred[n])+' / '+str(y_test[n]),fontsize=6,bbox=dict(facecolor='red', alpha=1))    
    plt.suptitle('classe predite / classe réelle')
    plt.show();

Questions:

Testez les classifieurs SVM à noyau linéaire et à noyau RBF. Pour vous éviter le temps de calcul de GridSearchCV (plusieurs minutes ici, étant donnée la taille de la base d'apprentissage):

  • pour le noyau linéaire, vous utiliserez la valeur $C=0.1$
  • pour le noyau RBF, vous utiliserez la valeur de $\gamma$ par défaut et $C=10$.

Comparez les scores de classification sur la base de test de ces classifieurs aux scores de l'algorithme du plus proche voisin, à la classification bayésienne naïve gaussienne, et à la régression logistique (voir l'exercice 2 du TP3). Remarquez les bonnes performances des classifieurs linéaires, la mauvaise performance de GNB, et expliquez-les par les éléments du cours. Vous afficherez également les matrices de confusion.

Comparez également les temps de calcul: ajoutez %time (il s'agit d'une magic command jupyter) devant les lignes où vous exécutez fit et predict̀. Voir les explications dans la correction de l'exercice 2 du TP3. Notez la valeur de "Wall time": en toute rigueur il faudrait comparer les "CPU time" mais le CPU time n'est pas disponible sous Windows (en effet, toutes les fonctions scikit-learn ne bénéficient pas de la parallélisation sur plusieurs coeurs, il vaut donc mieux comparer sur "CPU").

Vous lirez dans la correction (à venir) une discussion sur le rôle des vecteurs supports (facultatif).

In [ ]:
from sklearn import svm, model_selection
In [ ]:
# votre code pour SVM linear
In [ ]:
# votre code pour SVM rbf

Réponse:

</font>

In [ ]: