diff --git a/TP4/TP4_ex1_sujet.ipynb b/TP4/TP4_ex1_sujet.ipynb index 79bc3ffd440fb73f3e3d3ee43c8f212b7f2025af..eeaccd6e23848580d7a6b652bf9e31b484c4a379 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 8899f212ba003190be877f1ac622b69e5090ba90..601405d4b30a62e2d3bea1c6dbb8f3bb1fda63c3 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,