Skip to content
Snippets Groups Projects
Commit 19290399 authored by SUR Frederic's avatar SUR Frederic
Browse files

2024-2025

parent 7f37a3f0
No related branches found
No related tags found
No related merge requests found
%% 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.
%% Cell type:code id: tags:
``` python
from sklearn import datasets, neighbors, linear_model, metrics
%matplotlib inline
# dataset natif sklearn (ce n'est pas MNIST): (lignes suivantes à "décommenter" pour utiliser ce jeu de données)
# size_images=(8,8)
# digits = datasets.load_digits()
# X_digits = digits.data
# y_digits = digits.target
# 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, as_frame=False, parser='auto')
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.
%% Cell type:code id: tags:
``` python
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();
```
%% Cell type:markdown id: tags:
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
knn = neighbors.KNeighborsClassifier(n_neighbors=1)
%time knn.fit(X_train, y_train)
%time y_pred_nn = knn.predict(X_test)
print('KNN score: %f' % metrics.accuracy_score(y_test, y_pred_nn))
affichage_150_images(X_test,y_test,y_pred_nn)
```
%% Cell type:markdown id: tags:
<font color=red>
Réponse:
</font>
%% Cell type:markdown id: tags:
__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:
<font color=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
from sklearn import naive_bayes
# votre code pour le classifieur naif Gaussien:
```
%% Cell type:code id: tags:
``` python
from sklearn import linear_model
# votre code pour la régression logistique:
```
%% Cell type:markdown id: tags:
<font color=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/
%% Cell type:code id: tags:
``` python
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment