"print(\"Score sur l'ensemble d'apprentissage: %.3f\" % MLP.score(X_train, y_train))\n",
"print(\"Score sur l'ensemble de test: %.3f\" % MLP.score(X_test, y_test))"
...
...
@@ -139,7 +139,7 @@
"print(\"\\ntemps par epoch: %.3f s\" %((t1-t0)/niter))\n",
" \n",
"# train & test score plot\n",
"plt.figure(figsize=[10,6])\n",
"plt.figure(figsize=[8,6])\n",
"X=np.array(range(1,niter))\n",
"plt.plot(X,score_train,X,score_test)\n",
"plt.legend(['train','test'])\n",
...
...
@@ -150,7 +150,7 @@
"\n",
"# train loss plot\n",
"# (pas de possibilité simple d'obtenir le test loss)\n",
"plt.figure(figsize=[10,6])\n",
"plt.figure(figsize=[8,6])\n",
"X=np.array(range(1,niter))\n",
"plt.plot(X,loss_train)\n",
"plt.legend(['train loss'])\n",
...
...
@@ -238,7 +238,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
"version": "3.11.5"
}
},
"nbformat": 4,
...
...
%% Cell type:markdown id: tags:
# Introduction à l'apprentissage automatique: TP5 - Exercice 2
<br>
### Reconnaissance d'images par réseaux de neurones
<br>
On reprend la base de données Fashion-MNIST du TP4. Rappelons que l'on se restreint à un sous-ensemble de 10000 observations pour garder des temps de calcul raisonnables pendant la séance. Néanmoins, il serait plus satisfaisant d'utiliser l'ensemble de la base de données à notre disposition (à faire si vous avez une machine performante et du temps).
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:
__Remarque__: ici, les données d'apprentissage sont les vecteurs des niveaux de gris pixel à pixel. On divise par 255 le niveau de gris (codé sur 8 bits, donc entre 0 et 255) de manière à normaliser les données entre 0 et 1. Comme on l'a déjà dit, cette manipulation améliore le comportement des algorithmes d'optimisation numérique.
%% Cell type:markdown id: tags:
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:
print("Score sur l'ensemble d'apprentissage: %.3f"%MLP.score(X_train,y_train))
print("Score sur l'ensemble de test: %.3f"%MLP.score(X_test,y_test))
```
%% Cell type:markdown id: tags:
Chaque itération correspond à un parcours de la base d'apprentissage (une _epoch_ ): ce n'est pas une itération de l'algorithme de descente. On voit que le _loss_ décroît au fur et à mesure des itérations, ce qui est logique. Cependant, une faible augmentation du loss pourrait être observée d'une itération à l'autre car on utilise l'algorithme du gradient stochastique.
Consultez la documentation __[ici](https://scikit-learn.org/stable/modules/neural_networks_supervised.html)__ et __[là](https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html)__ et faites le lien avec le cours. En particulier, notez que dans la cellule précédente: on a déclaré un réseau à une seule couche cachée de 10 neurones (`hidden_layer_sizes=(10,)`), on n'a pas de régularisation $L^2$ des poids (car `alpha=0`), et on a précisé le solveur _Stochastic Gradient Descent_ pour lequel on a fixé le taux d'apprentissage ( `learning_rate=.1` ). Notez qu'il existe d'autres solveurs (on ne pourra pas rentrer dans les détails dans ce cours), et notez également dans la documentation comment est fixée la taille du lot ( _batch_ ).
Comme on l'a vu en cours, le loss (entropie croisée après la couche SoftMax) n'est pas le taux de classifications correctes. Le petit script suivant permet de suivre l'évolution du taux de classification sur la base d'apprentissage et sur la base de test au cours des itérations (ignorez l'avertissement). Notez les valeurs des paramètres.
print('MLP test score: %.3f'%MLP.score(X_test,y_test))
```
%% Cell type:markdown id: tags:
__Questions__:
- Pourquoi, avec ce jeu de paramètres, devrait-on se limiter à une soixantaine d'itérations?
- Observez les problèmes de convergence si `learning_rate` est trop grand (essayez $0.05$) ou trop petit (essayez $0.001$). Revenez à $0.01$.
- Essayez différentes combinaison de l'architecture (une couche cachée avec 10 neurones, 50 neurones, 100 neurones, puis deux couches cachées avec le même nombre de neurones), et du paramètre `alpha` (0 pour ne pas régulariser, 1e-4 par défaut, 1e-2, 1e-1, 1), ou de l'activation (`relu` ou `logistic`). Quel est le réseau le plus performant ? Soyez attentif aux situations de surapprentissage.
Trois principes peuvent vous guider:
- en situation de surapprentissage (grande différence entre scores d'apprentissage et de test qui finit par décroître), régularisez davantage
- si la régularisation ne fait que diminuer le score d'apprentissage mais n'augmente pas le score de test, c'est que votre réseau est trop compliqué: dans ce cas simplifiez-le
- si le score de test croît à peu près continûment, augmentez le nombre d'itérations car vous n'avez pas encore atteint l'optimum.
Fixer l'architecture et les hyperparamètres d'un réseau de neurones est assez rébarbatif... Il faut s'aider de l'expérience et de guides de "bonnes pratiques". Ne consacrez pas trop de temps à cet exercice!
_Indication_ : on n'arrive pas obtenir un score franchement supérieur à 0.85. Si vous arrivez à faire mieux, signalez-le nous! Comparez au meilleur classifieur du TP4.
%% Cell type:markdown id: tags:
<fontcolor=red>
Réponses:
</font>
%% Cell type:markdown id: tags:
La cellule suivante permet l'affichage des résultats de la manière habituelle.
"print(\"nombre total d'observations (apprentissage + test): %d\" % n_samples)\n",
...
...
@@ -111,7 +111,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
"version": "3.11.5"
}
},
"nbformat": 4,
...
...
%% Cell type:markdown id: tags:
# Introduction à l'apprentissage automatique: TP5 - Exercice 3
<br>
### Prédiction de la qualité de vins
Le dataset suivant:
https://www.openml.org/d/40691
fournit la description de 1599 vins rouges: 12 mesures physico-chimiques ainsi qu'un critère qualitatif donné comme une note entre 3 et 8 (plus haute est la note, meilleur est le vin).
Remarquez que les 12 caractéristiques doivent être normalisées.
La cellule suivante charge les données, construit des bases d'apprentissage et de test, et normalise les caractéristiques.
- Certaines caractéristiques semblent corrélées (on pourrait le vérifier en traçant des graphiques et en calculant des coefficients de corrélation comme dans le cours d'analyse de données): il serait sans doute pertinent de sélectionner des caractéristiques ou de réduire la dimension des observations.
- Nous allons envisager ce problème comme un problème de classification à 6 classes (les notes de 3 à 8). Néanmoins, il ne semblerait pas absurde de l'envisager comme un problème de régression.
<br>
Proposez des prédicteurs de la qualité en fonction des 12 mesures physico-chimiques. Vous explorerez les machines à vecteurs supports et les perceptrons multicouches, dont vous fixerez les hyperparamètres par _grid search_ et validation croisée.
<br>
Comparez vos résultats à ceux reportés ici:
https://www.openml.org/t/146217
(en vous demandant si les valeurs sont bien comparables)