From e583bb3177dd6c81af967e05b7b0592261032f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= <72651575+BreizhHardware@users.noreply.github.com> Date: Mon, 29 Sep 2025 14:59:29 +0200 Subject: [PATCH] Obisidian vault auto-backup: 29-09-2025 14:59:28 on . 1 files edited --- ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb | 117 +++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 3 deletions(-) diff --git a/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb b/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb index 8b9be72..07662c0 100644 --- a/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb +++ b/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb @@ -1291,16 +1291,127 @@ "id": "8aa1ea52", "metadata": {}, "source": [ - "## 2-1- Taux de classification" + "### 2-1- Taux de classification" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "acaeacd9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Taux de classification (accuracy) pour chaque fold: [0.96875 0.96325 0.9651 ]\n", + "Moyenne du taux de classification: 0.9657\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import cross_val_score\n", + "\n", + "# Opter pour la valeur accuracy pour l'argument scoring\n", + "# a. Afficher le taux de classification (accuracy) de chaque fold\n", + "scores = cross_val_score(sgd_classifier, X_train, y_train_5, cv=3, scoring='accuracy')\n", + "print(f\"Taux de classification (accuracy) pour chaque fold: {scores}\")\n", + "# b. Afficher la moyenne du taux de classification\n", + "print(f\"Moyenne du taux de classification: {scores.mean():.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "e5949779", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Taux de classification (accuracy) pour chaque fold avec Never5Classifier: [0.91125 0.90855 0.90915]\n", + "Moyenne du taux de classification avec Never5Classifier: 0.9096\n" + ] + } + ], + "source": [ + "from sklearn.base import BaseEstimator\n", + "\n", + "class Never5Classifier(BaseEstimator):\n", + " def fit(self, data, labels):\n", + " pass\n", + "\n", + " def predict(self, data):\n", + " '''Prend en argument les données et retourne une \n", + "structure de données ayant la taille des données et qui contient que la \n", + "valeur False (= non-5)'''\n", + " return np.zeros((data.shape[0],), dtype=bool)\n", + " \n", + "# c. Créez un objet de la classe Never5Classifier\n", + "never_5_classifier = Never5Classifier()\n", + "\n", + "# d. Testez le classifieur Never5Classifier en utilisant une validation croisée de type 3-fold cross-validation.\n", + "# i. Afficher le taux de classification (accuracy) de chaque fold\n", + "scores_never5 = cross_val_score(never_5_classifier, X_train, y_train_5, cv=3, scoring='accuracy')\n", + "print(f\"\\nTaux de classification (accuracy) pour chaque fold avec Never5Classifier: {scores_never5}\")\n", + "# ii. Afficher la moyenne du taux de classification\n", + "print(f\"Moyenne du taux de classification avec Never5Classifier: {scores_never5.mean():.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "776962ff", + "metadata": {}, + "source": [ + "### 2-2- Matrice de confusion" ] }, { "cell_type": "code", "execution_count": null, - "id": "acaeacd9", + "id": "5733c7b1", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from sklearn.model_selection import cross_val_predict\n", + "\n", + "print(\"=== Évaluation du classifieur SGD avec cross_val_predict ===\\n\")\n", + "\n", + "# Utiliser cross_val_predict pour obtenir les classes prédites\n", + "# Cette fonction retourne les prédictions pour chaque échantillon lors de la validation croisée 3-fold\n", + "y_train_pred = cross_val_predict(sgd_classifier, X_train, y_train_5, cv=3)\n", + "\n", + "print(f\"Type des prédictions: {type(y_train_pred)}\")\n", + "print(f\"Forme des prédictions: {y_train_pred.shape}\")\n", + "print(f\"Type des éléments: {type(y_train_pred[0])}\")\n", + "\n", + "# Afficher quelques exemples de prédictions\n", + "print(f\"\\nPremières 20 prédictions: {y_train_pred[:20]}\")\n", + "print(f\"Dernières 20 prédictions: {y_train_pred[-20:]}\")\n", + "\n", + "# Compter les prédictions True et False\n", + "nb_true = np.sum(y_train_pred)\n", + "nb_false = len(y_train_pred) - nb_true\n", + "\n", + "print(f\"\\n=== Statistiques des prédictions ===\")\n", + "print(f\"Nombre total de prédictions: {len(y_train_pred)}\")\n", + "print(f\"Prédictions 'True' (chiffre 5): {nb_true}\")\n", + "print(f\"Prédictions 'False' (non-5): {nb_false}\")\n", + "print(f\"Pourcentage de 'True': {(nb_true / len(y_train_pred) * 100):.2f}%\")\n", + "print(f\"Pourcentage de 'False': {(nb_false / len(y_train_pred) * 100):.2f}%\")\n", + "\n", + "# Comparer avec les vraies valeurs\n", + "nb_vraies_5 = np.sum(y_train_5)\n", + "print(f\"\\n=== Comparaison avec la réalité ===\")\n", + "print(f\"Vraies instances de '5' dans l'entraînement: {nb_vraies_5}\")\n", + "print(f\"Vraies instances de 'non-5' dans l'entraînement: {len(y_train_5) - nb_vraies_5}\")\n", + "\n", + "print(f\"\\n=== Résultats de cross_val_predict ===\")\n", + "print(\"✅ Les prédictions ont été obtenues pour tous les échantillons d'entraînement\")\n", + "print(\"✅ Chaque échantillon a été prédit exactement une fois lors de la validation croisée\")" + ] } ], "metadata": {