diff --git a/TP3/TP3_ex1_sujet.ipynb b/TP3/TP3_ex1_sujet.ipynb index f4d8d5f92da7984d3a4304abe9e0a81dc19528a2..282c5ed298ae451d61799c715d0734106dc3be88 100644 --- a/TP3/TP3_ex1_sujet.ipynb +++ b/TP3/TP3_ex1_sujet.ipynb @@ -68,11 +68,7 @@ "from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV\n", "from sklearn import neighbors, linear_model, naive_bayes, metrics\n", "\n", - "%matplotlib inline \n", - "\n", - "# pour ignorer les avertissements \"future warning\" \n", - "#from warnings import simplefilter\n", - "#simplefilter(action='ignore', category=FutureWarning)" + "%matplotlib inline " ] }, { @@ -110,7 +106,9 @@ "print(\"\\nobservations, base d'apprentissage:\")\n", "print(X_train)\n", "print(\"\\nlabels associés, base d'apprentissage:\")\n", - "print(y_train)" + "print(y_train)\n", + "print(\"\\nproportion de spams dans la base d'apprentissage:\")\n", + "print(np.mean(y_train))" ] }, { @@ -131,6 +129,13 @@ "</font>" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Remarque importante__: lorsqu'on teste des classifieurs, il est important de comparer les scores de classification obtenus à celui d'un \"dummy classifier\" (un classifieur fictif): un classifieur qui fait une prévision sans tenir compte des observations. Par exemple, ici un classifieur qui classerait toute observation comme \"non spam\" aurait raison dans presque 60% des cas. On espère donc que les classifieurs réels soient meilleurs. " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -230,10 +235,7 @@ "__Question 5__. Pourquoi le classifieur naïf de Bayes gaussien ne nécessite-t-il pas de standardisation préalable des données ? (vous pouvez vérifier que la normalisation joue tout de même un faible rôle: elle a sans doute une influence sur le comportement de l'algorithme d'estimation des paramètres).\n", "\n", "\n", - "Mettez en oeuvre le classifieur naïf de Bayes gaussien (lisez le début de la [documentation](https://scikit-learn.org/stable/modules/naive_bayes.html) où vous retrouverez le contenu du cours, puis la syntaxe de `GaussianNB` [ici](https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html)), ainsi que le classifieur de la régression logistique ([documentation](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)).\n", - "\n", - "Pour ce dernier classifieur, passez l'option `max_iter=2000` si vous avez un avertissement concernant la convergence de l'optimisation, de la manière suivante:\n", - "`LR = linear_model.LogisticRegression(max_iter=2000)`" + "Mettez en oeuvre le classifieur naïf de Bayes gaussien (lisez le début de la [documentation](https://scikit-learn.org/stable/modules/naive_bayes.html) où vous retrouverez le contenu du cours, puis la syntaxe de `GaussianNB` [ici](https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html))." ] }, { @@ -245,6 +247,16 @@ "# votre code pour le classifieur naïf de Bayes gaussien (sur les données originales):\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mettez en oeuvre le classifieur de la régression logistique ([documentation](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)). \n", + "\n", + "Passez l'option `max_iter=2000` si vous avez un avertissement concernant la convergence de l'optimisation, de la manière suivante:\n", + "`LR = linear_model.LogisticRegression(max_iter=2000)`" + ] + }, { "cell_type": "code", "execution_count": null, @@ -256,17 +268,6 @@ "# votre code pour la régression logistique (sur les données standardisées):\n" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<font color=red>\n", - " \n", - "Votre réponse:\n", - " \n", - "</font>" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -275,9 +276,9 @@ "\n", "<br>\n", "\n", - "On dispose des matrices de confusion, décrites [ici](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html), et des rapports de classification, décrits [là](https://scikit-learn.orgz/stable/modules/generated/sklearn.metrics.classification_report.html).\n", + "On dispose des matrices de confusion, décrites [ici](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html), et des rapports de classification, décrits [là](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html).\n", "\n", - "__Question 6__. Affichez ces matrices et rapports pour les quatre classifieurs testés." + "__Question 6__. Affichez ces matrices et rapports sur la base test pour les quatre classifieurs étudiés." ] }, { @@ -316,7 +317,7 @@ "\n", "Le classifieur bayésien naïf gaussien et le classifieur de la régression logistique s'appuient tous deux sur la règle du maximum a posteriori. Ils permettent d'estimer la probabilité a posteriori $p(C_1|x)$ et détectent un spam lorsque $p(C_1|x)>1/2$, où $C_1$ désigne la classe \"spam\" et $x$ est une observation. Les deux classifieurs mettent en oeuvre le classifieur de Bayes, qui minimise le risque moyen de prédiction (le taux d'erreur). Le taux d'erreur \"compte\" de la même manière les erreurs sur les deux classes.\n", "\n", - "Si on préfère réduire le taux de faux positif de la méthode (proportion de mails détectés à tort comme \"spam\"), on peut relever le seuil de probabilité. \n", + "Si on préfère réduire le taux de faux positif de la méthode (proportion de mails détectés à tort comme \"spam\"), on peut relever le seuil de cette probabilité. \n", "\n", "Les classifieurs `LogisticRegression` et `GaussianNB` possèdent tous deux une méthode `predict_proba` qui, pour un tableau d'observations, fournit la probabilité a posteriori de chaque classe, comme l'affiche la cellule suivante. On remarque que pour chaque observation $x$, $p(C_0|x)+p(C_1|x)=1$. (attention, la documentation n'est pas très claire, `predict_proba` fournit bien la probabilité a posteriori, et pas la vraisemblance $p(x|C_k)$)\n", "\n", @@ -385,7 +386,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "base", "language": "python", "name": "python3" }, @@ -399,7 +400,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.12.7" } }, "nbformat": 4,