diff --git a/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb b/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb index d8d33f0..1c7d196 100644 --- a/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb +++ b/ISEN/IA/CIPA4/TP/TP2/tp2_IA.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "id": "5a9a29a0", "metadata": {}, "outputs": [ @@ -33,6 +33,8 @@ "Requirement already satisfied: tzdata>=2022.7 in ./.venv/lib/python3.13/site-packages (from pandas) (2025.2)\n", "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.13/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", "Note: you may need to restart the kernel to use updated packages.\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: matplotlib in ./.venv/lib/python3.13/site-packages (3.10.6)\n", "Requirement already satisfied: matplotlib in ./.venv/lib/python3.13/site-packages (3.10.6)\n", "Requirement already satisfied: contourpy>=1.0.1 in ./.venv/lib/python3.13/site-packages (from matplotlib) (1.3.3)\n", "Requirement already satisfied: cycler>=0.10 in ./.venv/lib/python3.13/site-packages (from matplotlib) (0.12.1)\n", @@ -44,12 +46,29 @@ "Requirement already satisfied: pyparsing>=2.3.1 in ./.venv/lib/python3.13/site-packages (from matplotlib) (3.2.5)\n", "Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib/python3.13/site-packages (from matplotlib) (2.9.0.post0)\n", "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.13/site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in ./.venv/lib/python3.13/site-packages (from matplotlib) (1.3.3)\n", + "Requirement already satisfied: cycler>=0.10 in ./.venv/lib/python3.13/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in ./.venv/lib/python3.13/site-packages (from matplotlib) (4.60.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in ./.venv/lib/python3.13/site-packages (from matplotlib) (1.4.9)\n", + "Requirement already satisfied: numpy>=1.23 in ./.venv/lib/python3.13/site-packages (from matplotlib) (2.3.3)\n", + "Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.13/site-packages (from matplotlib) (25.0)\n", + "Requirement already satisfied: pillow>=8 in ./.venv/lib/python3.13/site-packages (from matplotlib) (11.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in ./.venv/lib/python3.13/site-packages (from matplotlib) (3.2.5)\n", + "Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib/python3.13/site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.13/site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n", "Note: you may need to restart the kernel to use updated packages.\n", + "Note: you may need to restart the kernel to use updated packages.\n", + "Requirement already satisfied: scikit-learn in ./.venv/lib/python3.13/site-packages (1.7.2)\n", "Requirement already satisfied: scikit-learn in ./.venv/lib/python3.13/site-packages (1.7.2)\n", "Requirement already satisfied: numpy>=1.22.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (2.3.3)\n", "Requirement already satisfied: scipy>=1.8.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (1.16.2)\n", "Requirement already satisfied: joblib>=1.2.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (1.5.2)\n", "Requirement already satisfied: threadpoolctl>=3.1.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (3.6.0)\n", + "Requirement already satisfied: numpy>=1.22.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (2.3.3)\n", + "Requirement already satisfied: scipy>=1.8.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (1.16.2)\n", + "Requirement already satisfied: joblib>=1.2.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (1.5.2)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in ./.venv/lib/python3.13/site-packages (from scikit-learn) (3.6.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -62,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "id": "5be8782b", "metadata": {}, "outputs": [], @@ -81,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "id": "70575266", "metadata": {}, "outputs": [ @@ -89,19 +108,237 @@ "name": "stdout", "output_type": "stream", "text": [ - "dict_keys(['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url'])\n" + "Clés disponibles dans le dataset MNIST:\n", + "['data', 'target', 'frame', 'categories', 'feature_names', 'target_names', 'DESCR', 'details', 'url']\n" ] } ], "source": [ "X = mnist.keys()\n", - "print(X)" + "print(\"Clés disponibles dans le dataset MNIST:\")\n", + "print(list(X))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "eaffc443", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a. Variable X créée avec les données\n", + "b. Taille des données X: (70000, 784)\n", + " - Nombre d'échantillons: 70000\n", + " - Nombre de features par échantillon: 784\n", + "\n", + "c. Variable Y créée avec les classes\n", + "d. Taille des labels Y: (70000,)\n", + " - Nombre total de labels: 70000\n", + "\n", + "e. Classes uniques dans la base de données: ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9']\n", + " - Nombre de classes différentes: 10\n", + "\n", + "f. Description détaillée de la base de données:\n", + "**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges \n", + "**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown \n", + "**Please cite**: \n", + "\n", + "The MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples \n", + "\n", + "It is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field. \n", + "\n", + "With some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets. \n", + "\n", + "The MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\n", + "\n", + "Downloaded from openml.org.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "# a. Stocker les données dans la variable X\n", + "X = mnist.data\n", + "print(\"a. Variable X créée avec les données\")\n", + "\n", + "# b. Afficher la taille des données (nombre de features et taille de chaque feature)\n", + "print(f\"b. Taille des données X: {X.shape}\")\n", + "print(f\" - Nombre d'échantillons: {X.shape[0]}\")\n", + "print(f\" - Nombre de features par échantillon: {X.shape[1]}\")\n", + "\n", + "# c. Stocker les classes dans la variable Y\n", + "Y = mnist.target\n", + "print(\"\\nc. Variable Y créée avec les classes\")\n", + "\n", + "# d. Afficher la taille des labels/classes\n", + "print(f\"d. Taille des labels Y: {Y.shape}\")\n", + "print(f\" - Nombre total de labels: {Y.shape[0]}\")\n", + "\n", + "# e. Afficher les différentes classes de la base de données\n", + "classes_uniques = np.unique(Y)\n", + "print(f\"\\ne. Classes uniques dans la base de données: {classes_uniques}\")\n", + "print(f\" - Nombre de classes différentes: {len(classes_uniques)}\")\n", + "\n", + "# f. Description détaillée de la base de données\n", + "print(\"\\nf. Description détaillée de la base de données:\")\n", + "print(mnist.DESCR)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d333dc4d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Analyse de la première instance de MNIST ===\n", + "\n", + "a. Affichage de la première instance:\n", + " i. Première instance extraite avec X.values[0]\n", + " Forme originale: (784,)\n", + " ii. Image redimensionnée en 28x28: (28, 28)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeEAAAH5CAYAAAC2z4b4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAHwtJREFUeJzt3QeUHWX5P/BJoYZAQKQXBREJvQkC0gVEAgiKiEoRJSgQSxDRcMACIvUoRRGQokiREhQLSARUijTpQs4hghTpMQm9zv888/vPnrt37252M5EnJJ/POUuWe+/MvHdm7nzfMu/dQWVZlgUA8LYb/PZvEgAIQhgAkghhAEgihAEgiRAGgCRCGACSCGEASCKEASCJEJ5DXHvttcU888xT7LffftlFAeD/E8Kzkeuuu64YNGhQ8Z3vfKfHc1tssUXxi1/8ojjzzDOLc889t5gVbL755lV5efs9/PDD1b7fe++9Z6nzFOY0QrjlgtT6M/fccxfLLrtsscceexR33313MTv41Kc+VZxwwgnFl770peKuu+4q5jRxXCP4eefLrEQMRFQ0opxR8ZiR5eLn4IMP7vV13/zmN7te116pqSu58847b/Hvf/+74/If+MAHelSE60rS/vvv3+P1N9xwQ/HJT36yWHrppatr5MILL1ytI66TdeW+0/W0r5/3vOc9xZxsaHYBZiUrrrhi8dnPfrb6/YUXXij+/ve/FxdccEFx2WWXFX/+85+LjTfeuJiVffCDHyzuv//+YtFFF+31NV/72teKhRZaqKpYrLnmmkWmaJm/9NJLqWWAWdnQoUOL8847r/jhD39Y/d7qjTfeqD5D8Xj83ptXX321OOyww4pf/vKXjcpyzjnnFJ///Oer7W2//fbFSiutVIXoxIkTiz/84Q/FX//612KvvfYqRowYURxxxBE9lv/ud79bXXu++tWvdnt8xIgRxZxMCLd43/ve16M2GSfvUUcdVYwbN27Atdm32/zzz1/VSqcnPkizguWWWy67CDBL++hHP1pcccUVxe9+97ti55137vZcBN+TTz5Z7LjjjsVvf/vbPhsX559/fvGNb3yjWGONNWaoHFFZHjNmTDF8+PDixhtvLFZdddVuz7/++utd18cI1U5DDRHCvT03J9MdPR0HHXRQ9e+tt97ao1vz8ccfL/bcc89iiSWWKAYPHtwtpKNWOGrUqKpVGjdERa0xAr295dc6PhYnd4zdxon+7ne/u/jyl79cvPzyy9Xrfv/73xcf+tCHimHDhhWLL754ccghh/So/fY11vb0009XreCoaER5FllkkeoD/pe//KXHa6N7KH6mTJlSHHjggVW3fNR+oyZci5b07rvvXiy55JJVt9Tyyy9f7avnnnuu0ZhwbCMei3//9Kc/FRtttFFVuXjXu95V1bI7rT9uOov3stRSS1XvLfbPhz/84eL000/vtl9CvN/WrrD6PU2dOrU45phjis0226xaT7yn+DeO76RJk/rsZowL3FprrVXMN9981f74yle+0nXc2sV5ERfTKGOUNfbtLrvsUlx//fXdXhd/3Oyss86qel8WXHDBah+st9561WMD8eabb1bvK457dEvGv0cffXTx1ltvDbjLvj4v+iv2waGHHlq9x9j2aqutVpxxxhm9vn78+PHFpz/96aqM8X6j1RTH8dJLL+32ujhm733ve6vfowu09XjWn8H//Oc/VWtsww03LBZbbLFqX0fZ4zMVn4V2cfwPP/zwYuTIkcUCCyxQ7fMoR5xz7V25/T02sR8jeEJ8rmek+zXOjQiuTsc9Hovu4I9//ON9ruPII4+sjnd0Xc+oe++9t3j++eer99EewGGuueYqPvKRj8zw+udkWsL91B4WEQYRihFmEUavvPJK9YEMP/3pT4sDDjig+vBEEMdF4Lbbbqta1BEY8RMX+VY333xzdbHcdttti9GjR1evifVMmzatWkeMfe20007VNiOQjzvuuOpiEReO6YkQiQtCXHx22GGHYtdddy0mT55cXfS23HLLqpsqxnTau7DiueiWj5p2hHAER4ha92677VZVPKJMcZH95z//WZxyyinFVVddVb2XuDg0EduI9xnvPYI4wiu63uK9tAZW/ZrY11GWCMFnnnmmGvOO9xV3g8dFLy7IcUGMykLrOGKEZ4hu/NiXcZGJi1pUdh544IEqYGMb//jHP6pl28V7vvLKK6ttx/6K30866aTi2WefLX71q191e+2Pf/zjqiIUYR3biJ6AqMjF+7nkkkuKTTbZpOsi/5nPfKYaConKWxybOF+uvvrqYt9996329fHHH9+v/RjvPy7WEVpxTsZ5euKJJ1YVvv+luOjHeTNhwoRi9dVXr95DfGbi/cc+7uRb3/pW9T5jP9THMc6DT3ziE9U+rSvEccyiohP7M4ZUWluIdcDF+RL3P2y11VbFBhtsUIXEHXfcUX2m4hyN4xkhX+/v+NzFeRvBut1221XndoRvbP9zn/tc17EfyLGpz7Oo+EWY12UbSPdrVF6iYhKVl6eeeqrrMxi/x3kZxzde05f47Ecl9Y9//GN1Xelt//clKsHhX//6V1WxGzJkyIDXQS/i7wnP6R566KH4m8rltttu2+O5ww8/vHpuiy226Hos/j9+9tlnn/KNN97o9vr77ruvHDp0aLnmmmuWzz77bLfnjj766Gq5448/vuuxa6+9tmt9l19+edfjr732WrnGGmuUgwYNKhdddNHylltu6Xpu2rRp5WKLLVYussgi1eva13XEEUd02+5GG21ULr744uXEiRO7PT558uTy/e9/f7WeF198sevx5Zdfvmt/vPTSS92Wife04IILlksvvXT58MMPd3vuggsuqJY78MADy/7YbLPNqte3Ovvss6vHYh9ef/31XY/Hft58882r52666aaux3fZZZfqsTvvvLPH+tv3f7wuttnJlClTyueee67H49dcc005ePDg8gtf+EK3x2Mfx/oWWmih8oEHHuh6PPZX7NNY5vHHH+96PMoXjy211FLV+dbqrbfe6vba008/vev8aj2+r776ajlq1Kjqudtuu62cnvp8iHPxhRde6Hr8scceq86peG6vvfbq9z6K8yJ++qM+jtttt123z8jdd99dzj333B3P00mTJvVYz/PPP1+uvvrq1X5uPUfrz2x7+WtPPfVUtWy7c889t1ruyCOP7FameGznnXfu8fpXXnml23oGemzq8ySOxUDUy8VnKtYXvx977LFdz8fv8djtt9/e9blr35/15+uJJ54o77rrrur8W3/99avzrbbyyiv3+AzW583o0aO7Hotl1l133erxTTbZpDzjjDPKe+65p8f1ry+xbH/PnzmJ7ugWDz74YNXNGD8xfrLpppsW3/ve96qaZrRiW0Xt99hjj+1RI/zZz35WdROffPLJXbXHWnQhRzdz1KLbRe00WlO1qLlHCyDO3Wjprb/++l3PRXd1tGijNfvYY4/1+Z6i9h+tnn322adqtUcLrf6JGm3cMR3r6dQyivcXrbZW0RqN1nl0aba3DKNHYJ111ikuvPDCoqloYbTeCBf7OVoT7UMDtfZyhvb935doFcX+aVd3v0WLrpNoka288srdyhEtl2gJ3n77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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " iii. Image affichée en niveau de gris\n", + " Valeurs min/max des pixels: 0.0 à 255.0\n", + "\n", + "b. Analyse de la première instance:\n", + " - Classe de la première instance: 5\n", + " - Type de la classe: \n", + " - Type de l'instance (données): \n", + "\n", + "=== Conclusion ===\n", + "La première image du dataset MNIST représente le chiffre: 5\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib as mpl\n", + "import numpy as np\n", + "\n", + "print(\"=== Analyse de la première instance de MNIST ===\\n\")\n", + "\n", + "# a. Affichage de la première instance de la base de données\n", + "print(\"a. Affichage de la première instance:\")\n", + "\n", + "# i. Utiliser l'attribut \"values\" du dictionnaire X\n", + "premiere_instance = X.values[0]\n", + "print(f\" i. Première instance extraite avec X.values[0]\")\n", + "print(f\" Forme originale: {premiere_instance.shape}\")\n", + "\n", + "# ii. Redimensionner via la fonction \"reshape\" de numpy en taille 28,28\n", + "image_2d = premiere_instance.reshape(28, 28)\n", + "print(f\" ii. Image redimensionnée en 28x28: {image_2d.shape}\")\n", + "\n", + "# iii. Utiliser imshow avec cmap=mpl.cm.binary pour affichage en niveau de gris\n", + "plt.figure(figsize=(6, 6))\n", + "plt.imshow(image_2d, cmap=mpl.cm.binary)\n", + "plt.title(\"Première instance du dataset MNIST\", fontsize=14)\n", + "plt.axis('off') # Supprimer les axes pour une meilleure visualisation\n", + "plt.show()\n", + "\n", + "print(f\" iii. Image affichée en niveau de gris\")\n", + "print(f\" Valeurs min/max des pixels: {premiere_instance.min():.1f} à {premiere_instance.max():.1f}\")\n", + "\n", + "# b. Afficher la classe et le type de la première instance\n", + "print(f\"\\nb. Analyse de la première instance:\")\n", + "classe_premiere = Y.iloc[0] # Utiliser iloc pour pandas Series\n", + "print(f\" - Classe de la première instance: {classe_premiere}\")\n", + "print(f\" - Type de la classe: {type(classe_premiere)}\")\n", + "print(f\" - Type de l'instance (données): {type(premiere_instance)}\")\n", + "\n", + "print(f\"\\n=== Conclusion ===\")\n", + "print(f\"La première image du dataset MNIST représente le chiffre: {classe_premiere}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c0966e7f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Conversion des labels en valeurs numériques ===\n", + "\n", + "Type actuel de Y: \n", + "Type des éléments de Y: \n", + "Premiers labels (avant casting): ['5', '0', '4', '1', '9']\n", + "\n", + "Après casting:\n", + "Type de Y: \n", + "Type des éléments de Y: \n", + "Premiers labels (après casting): [5, 0, 4, 1, 9]\n", + "\n", + "Classe de la première instance (numérique): 5\n", + "Type de la classe: \n", + "\n", + "=== Conclusion ===\n", + "Les labels ont été convertis en valeurs numériques avec succès.\n" + ] + } + ], + "source": [ + "print(\"=== Conversion des labels en valeurs numériques ===\\n\")\n", + "\n", + "# Afficher le type actuel des labels\n", + "print(f\"Type actuel de Y: {type(Y)}\")\n", + "print(f\"Type des éléments de Y: {type(Y.iloc[0])}\")\n", + "print(f\"Premiers labels (avant casting): {list(Y.head())}\")\n", + "\n", + "# Appliquer le casting sur les labels\n", + "Y = Y.astype(np.uint8)\n", + "\n", + "# Vérifier le résultat du casting\n", + "print(f\"\\nAprès casting:\")\n", + "print(f\"Type de Y: {type(Y)}\")\n", + "print(f\"Type des éléments de Y: {type(Y.iloc[0])}\")\n", + "print(f\"Premiers labels (après casting): {list(Y.head())}\")\n", + "\n", + "# Vérifier que la classe de la première instance est maintenant numérique\n", + "classe_premiere_numerique = Y.iloc[0]\n", + "print(f\"\\nClasse de la première instance (numérique): {classe_premiere_numerique}\")\n", + "print(f\"Type de la classe: {type(classe_premiere_numerique)}\")\n", + "print(f\"\\n=== Conclusion ===\")\n", + "print(\"Les labels ont été convertis en valeurs numériques avec succès.\")" + ] + }, + { + "cell_type": "markdown", + "id": "05f6129e", + "metadata": {}, + "source": [ + "## 2- Répartition des données" ] }, { "cell_type": "code", "execution_count": null, - "id": "eaffc443", + "id": "b0560d20", "metadata": {}, "outputs": [], "source": []