From 08ddc14a09b5a9014755d549b4a44e917b8586e3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric?= <frederic.sur@univ-lorraine.fr>
Date: Fri, 1 Dec 2023 08:57:13 +0100
Subject: [PATCH] 2023-2024

---
 TP4/TP4_ex1_sujet.ipynb | 13 ++++++++-----
 TP4/TP4_ex2_sujet.ipynb |  6 +++---
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/TP4/TP4_ex1_sujet.ipynb b/TP4/TP4_ex1_sujet.ipynb
index 79bc3ff..eeaccd6 100755
--- a/TP4/TP4_ex1_sujet.ipynb
+++ b/TP4/TP4_ex1_sujet.ipynb
@@ -40,6 +40,7 @@
     "\n",
     "%matplotlib inline\n",
     "\n",
+    "# fonction de visualisation\n",
     "def plot_classif_result_SVM(X,y,clf,title):\n",
     "    cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA'])\n",
     "    cmap_bold = ListedColormap(['#FF0000', '#00FF00'])    \n",
@@ -341,7 +342,7 @@
    "source": [
     " Pour trouver une valeur optimale aux hyperparamètres $\\gamma$ et $C$ par validation croisée, on dispose de la fonction [GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html).\n",
     "\n",
-    "Cette fonction va calculer le score de validation croisée pour différentes valeurs des paramètres: ici, $C$ et $\\gamma$ peuvent prendre des valeurs entre $10^{-3}$ et $10^3$. Rappelons, que par défaut, il s'agit de la validation croisée à 5 plis.\n",
+    "Cette fonction va calculer le score de validation croisée pour différentes valeurs des paramètres: ici, $C$ et $\\gamma$ peuvent prendre des valeurs entre $10^{-3}$ et $10^3$. Par défaut, il s'agit de la validation croisée à 5 plis.\n",
     "\n",
     "Visualisez les résultats de la cellule suivante:"
    ]
@@ -370,7 +371,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "__Question 5__. Quel est le score de classification sur la base de test du meilleur classifieur SVM identifié?"
+    "__Question 5__. Quel est le score de classification sur la base de test du meilleur classifieur SVM identifié? Visualisez la surface de séparation entre les classes."
    ]
   },
   {
@@ -417,6 +418,8 @@
    "source": [
     "### Complément facultatif: discussion du rôle du paramètre $\\gamma$ du noyau RBF\n",
     "\n",
+    "_(à faire en dehors du TD)_\n",
+    "\n",
     "Observez le résultat de la classification avec un noyau\n",
     "  gaussien (RBF), et l'évolution selon différentes valeurs du\n",
     "  paramètre `gamma` (on gardera $C=1$, valeur par défaut de `SVC`)."
@@ -456,7 +459,7 @@
     "Le coefficient $\\sqrt{\\gamma}$ peut être vu comme l'inverse de la distance d'influence des vecteurs supports. En effet, le classifieur s'écrit: \n",
     "$$f(x) = \\sum_i \\lambda_i y_i k(x_i,x) + b$$ \n",
     "\n",
-    "__Lorsque $\\gamma$ est grand__, $k(x_i,x)$ a une contribution significative seulement pour $x$ proche d'un des vecteurs supports $x_i$. Ainsi, le signe de $f$ sera différent de celui de $b$ seulement pour $x$ proche d'un vecteur support $x_i$ associé à la classe de signe contraire à celui de $b$. On a intérêt à ce que toutes les observations soient des vecteurs supports de manière à minimiser le nombre de mauvaises classifications, donc la somme des variables d'écart. La surface de séparation est donc la superposition de disques autours des points d'une des classes, ce que l'on observe bien ici.\n",
+    "__Lorsque $\\gamma$ est grand__, $k(x_i,x)$ a une contribution significative seulement pour $x$ proche d'un des vecteurs supports $x_i$. Ainsi, le signe de $f$ sera différent de celui de $b$ seulement pour $x$ proche d'un vecteur support $x_i$ associé à la classe $y_i$ de signe contraire à celui de $b$. On a intérêt à ce que toutes les observations soient des vecteurs supports de manière à minimiser le nombre de mauvaises classifications, donc la somme des variables d'écart. La surface de séparation est donc la superposition de disques autours des points d'une des classes, ce que l'on observe bien ici.\n",
     "\n",
     "__Lorsque $\\gamma$ est petit__, tous les $k(x_i,x)$ dans l'expression de $f$ ont une contribution. \n",
     "Le modèle est alors trop \"moyenné\" et on a une surface entre classes très régulière (presque une droite ici). \n",
@@ -466,7 +469,7 @@
     "Donc:\n",
     "$$f(x) = \\sum_i \\lambda_i y_i (1-\\gamma ||x_i||^2) + b - \\gamma ||x||^2 \\sum_i \\lambda_i y_i - 2\\gamma \\left(\\sum_i \\lambda_i y_i x_i\\right) \\cdot x$$ \n",
     "Comme $\\sum_i \\lambda_i y_i = 0$ (contrainte primale), $f(x)$ vérifie bien une relation du type $f(x) = B+ w\\cdot x$, où  $B=b-\\sum_i \\lambda_i y_i \\gamma ||x_i||^2$ est une constante ne dépendant pas de $x$, et $w=- 2\\gamma \\left(\\sum_i \\lambda_i y_i x_i\\right)$.\n",
-    "Cela justifie que la frontière de séparation est linéaire!\n",
+    "Cela justifie que la frontière de séparation est linéaire dans le graphique obtenu pour $\\gamma=0.01$!\n",
     "\n",
     "<br>\n",
     "\n",
@@ -520,7 +523,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.13"
+   "version": "3.11.5"
   }
  },
  "nbformat": 4,
diff --git a/TP4/TP4_ex2_sujet.ipynb b/TP4/TP4_ex2_sujet.ipynb
index 8899f21..601405d 100755
--- a/TP4/TP4_ex2_sujet.ipynb
+++ b/TP4/TP4_ex2_sujet.ipynb
@@ -32,7 +32,7 @@
     "\n",
     "# Fashion-Mnist database sur openML: (il faut une dizaine de secondes pour charger la base)\n",
     "size_images=(28,28)\n",
-    "X_fashion, y_fashion = datasets.fetch_openml(data_id=40996, return_X_y=True, as_frame=False)\n",
+    "X_fashion, y_fashion = datasets.fetch_openml(data_id=40996, return_X_y=True, as_frame=False, parser='auto')\n",
     "X_fashion=X_fashion[:10000,:]/255.  # normalisation des niveaux de gris entre 0 et 1\n",
     "y_fashion=y_fashion[:10000]\n",
     "\n",
@@ -92,7 +92,7 @@
     "\n",
     "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̀`). \n",
     "\n",
-    "Sous Windows, vous n'obtenez que l'indication Wall: c'est l'heure réellement écoulée sur une horloge murale (_wall clock_). Sous MacOS et Windows, vous obtenez également la valeur \"CPU\" qui compte le temps de calcul total sur le CPU (en additionnant le temps de processus s'exécutant en parallèle sur les coeurs du processeurs). Comme toutes les fonctions `scikit-learn` ne bénéficient pas de la parallélisation sur plusieurs coeurs, seuls les temps d'exécution \"CPU\" sont réellement comparables.\n",
+    "Vous obtenez l'indication Wall qui est la durée réellement écoulée sur une horloge murale (_wall clock_), ainsi que la valeur \"CPU\" qui compte le temps de calcul total sur le CPU (en additionnant le temps de processus s'exécutant en parallèle sur les coeurs du processeurs). Comme tous les modèles de prédiction de `scikit-learn` ne bénéficient pas de la parallélisation sur plusieurs coeurs, seuls les temps d'exécution \"CPU\" sont réellement comparables.\n",
     "\n",
     "\n",
     "Vous lirez dans la correction (à venir) une discussion sur le rôle des vecteurs supports (__facultatif__). "
@@ -196,7 +196,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.13"
+   "version": "3.11.5"
   }
  },
  "nbformat": 4,
-- 
GitLab