"# dataset natif sklearn (ce n'est pas MNIST): (lignes suivantes à \"décommenter\" pour utiliser ce jeu de données)\n",
"# size_images=(8,8)\n",
"# digits = datasets.load_digits()\n",
"# X_digits = digits.data\n",
"# y_digits = digits.target\n",
"\n",
"# Mnist database: (il faut quelques dizaines de secondes pour charger la base)\n",
"# les données sont décrites ici: https://www.openml.org/d/554\n",
"size_images=(28,28)\n",
...
...
%% Cell type:markdown id: tags:
# Introduction à l'apprentissage automatique: TP3 - Exercice 2
<br>
### Reconnaissance de chiffres manuscrits
<br>
La cellule ci-dessous permet de charger 10000 images de chiffres manuscrits extraits de la célèbre base de données MNIST décrite __[ici](https://www.openml.org/d/554)__. La base originale contient 70000 images de taille 28x28 pixels, mais on restreint le nombre d'images afin de garder des temps de calcul raisonnables dans ce TD. On utilise 9000 observations comme base d'apprentissage, et on réserve 1000 observations comme base de test.
Les 28x28=784 caractéristiques sont les niveaux de gris en chaque pixel. Les caractéristiques seront normalisées à des valeurs entre 0 et 1.
X_digits=X_digits[:10000,:]/255.# on normalise le niveau de gris 8 bits 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))
```
%% Cell type:markdown id: tags:
La cellule suivante définit une 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 (passées en argument de la fonction). Nous nous servirons de cette fonction plus tard.
La cellule suivante effectue une classification au plus proche voisin (`n_neighbors=1`) de la base des chiffres manuscrits extraite de MNIST, et affiche le résultat de la classification de 150 images.
__Question 1__. A quoi correspondent les temps de calcul affichés? Les erreurs vous semblent-elles qualitativement explicables? Notez le score de précision (proportion d'observations correctement classées).
%% Cell type:code id: tags:
``` python
# classification au plus proche voisin et affichage
__Question 2__. Quelles sont les informations fournies par `classification_report` et `confusion_matrix` du module `metrics` ?
%% Cell type:code id: tags:
``` python
# votre code (voir l'exercice 1):
```
%% Cell type:markdown id: tags:
<fontcolor=red>
Réponse:
</font>
%% Cell type:markdown id: tags:
__Question 3__. Comparez aux résultats obtenus par
- la classification naïve bayésienne gaussienne décrite dans la [documentation scikit-learn](http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html)
- à la régression logistique, décrite dans la [documentation scikit-learn](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)
Comparez également les temps de calcul.
%% Cell type:code id: tags:
``` python
fromsklearnimportnaive_bayes
# votre code pour le classifieur naif Gaussien:
```
%% Cell type:code id: tags:
``` python
fromsklearnimportlinear_model
# votre code pour la régression logistique:
```
%% Cell type:markdown id: tags:
<fontcolor=red>
Réponse:
</font>
%% Cell type:markdown id: tags:
__Remarque__: les méthodes modernes arrivent à des précisions supérieures à 99% (sur la base MNIST entière)
Voir les "error rates" sur: http://yann.lecun.com/exdb/mnist/