{ "cells": [ { "cell_type": "markdown", "id": "0c601b14", "metadata": {}, "source": [ "# TP n°1 du module 6 : Les algorithmes de classification pour le _Machine Learning_\n", "\n", "Dans ce TP, nous allons mettre en pratique les principes de l'apprentissage supervisé.\n", "\n", "## Objectifs :\n", "- Savoir mettre en place les principaux algorithmes de classification\n", "- Etudier l'impact de leurs paramètres sur leurs performances\n", "- Comparer les performances de différents algorithmes" ] }, { "cell_type": "code", "execution_count": 2, "id": "8423b3aa", "metadata": {}, "outputs": [], "source": [ "# Ajoutez ici les imports de librairies nécessaires\n", "#TODO" ] }, { "cell_type": "markdown", "id": "82e63125", "metadata": {}, "source": [ "## Question n°0\n", "Commencez par charger à nouveau le jeu de données Titanic, à partir du csv généré dans le TP1 du module 4.\n", "- Préparez les données d'entraînement et de test qui seront utilisées par la suite." ] }, { "cell_type": "code", "execution_count": 4, "id": "79f23c2b", "metadata": {}, "outputs": [], "source": [ "# Lambda nommée pour afficher un score en pourcentage avec un libellé (avec détail) :\n", "pscore = lambda lib, score, detail='': print(F\"{lib}{('',f\" ({detail})\")[len(str(detail))>0]} : {100*score:.2f}%\")\n", "\n", "#TODO" ] }, { "cell_type": "markdown", "id": "fc39d16d-6a9f-4fa6-ac5d-da5266c98583", "metadata": {}, "source": [ "## Partie 1 : découvrir Naive Bayes" ] }, { "cell_type": "markdown", "id": "6f7717c4", "metadata": {}, "source": [ "### Question n°1\n", "Commencez par créer un modèle basé sur Naive Bayes, sans changer les paramètres par défaut, en supposant que la répartition des données correspond à une Gaussienne (loi normale).\n", "- Entraînez-le et testez-le.\n", "- Quelle score (accuracy) obtenez-vous ?\n", "- Que pouvez-vous dire de la précision et du rappel ?\n", "- Comparez avec les scores obtenus sur les arbres de décision au module 5\n", "- Avez-vous des hypothèses pour expliquer cette différence ?" ] }, { "cell_type": "code", "execution_count": 7, "id": "dd0f1d68", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "5a68e940-c814-44fe-927b-e66c8904d99a", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "1af14ab5", "metadata": {}, "source": [ "### Question n°2\n", "Affichez une matrice de corrélation des données du jeu d'entraînement, en y incluant un affichage textuel de la valeur de la corrélation.\n", "- Voyez-vous des informations permettant d'expliquer les performance de l'algorithme _Naive Bayes_ ?" ] }, { "cell_type": "code", "execution_count": 10, "id": "3b3d1c81", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "00130884-072e-4d7b-9d16-7f6dded39a8c", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "351eae75", "metadata": {}, "source": [ "### Question n°3\n", "Proposez une représentation graphique des attributs continus, permettant de vérifier l'hypothèse que nous avons faite, selon laquelle ces données suivent une loi normale (Gaussienne)." ] }, { "cell_type": "code", "execution_count": 13, "id": "b6b5b059", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "627d1608-9f5b-42cf-9666-10f86709f5b9", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "dab510d0", "metadata": {}, "source": [ "## Partie 2 : découvrir KNN" ] }, { "cell_type": "markdown", "id": "90779015", "metadata": {}, "source": [ "### Question n°1\n", "Commencez par créer un modèle KNN, en gardant le nombre de voisins par défaut (à regarder dans la documentation).\n", "- Que pouvez-vous dire de l'accuracy, de la précision et du rappel ?" ] }, { "cell_type": "code", "execution_count": 17, "id": "8f8e1696", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "1e4734d3-58a3-483f-8ffb-a898dadab63c", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "f991f919", "metadata": {}, "source": [ "### Question n°2\n", "Nous allons maintenant observer l'impact du nombre de voisins à prendre en considération.\n", "- Faite varier k entre 1 et 20.\n", "- Calculez à chaque fois accuracy, précision, et rappel.\n", "- Tracez l'évolution de ces trois scores en fonction de k, sur un même graphique.\n", "- Que constatez-vous ?\n", "- Affichez la valeur de k pour laquelle l'accuracy est la plus élevée." ] }, { "cell_type": "code", "execution_count": 20, "id": "b65bb998", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "88905973-56e2-42a7-9fce-6619592b9b7a", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "18ec66e2", "metadata": {}, "source": [ "### Question n°3\n", "En prenant la valeur de _k_ qui vous semble la plus pertinente, faite varier la dimension (p) utilisée pour calculer la distance de Minkowski entre 2 données.\n", "- Cette distance a-t'elle un fort impact sur les résultats d'accuracy obtenus ?\n", "- Montrez-le en montrant l'évolution de ce score en fonction de _p_
(faire varier entre 1 et 10).\n", "- Ajoutez également la précision et le rappel." ] }, { "cell_type": "code", "execution_count": 23, "id": "ce6b99d8", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "d13a3756-fc4c-441d-846d-26e848db111b", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "fec73153-fbe1-4503-8bda-be6125a3691e", "metadata": {}, "source": [ "## Partie 3 : découvrir les SVM" ] }, { "cell_type": "markdown", "id": "0a7c6024", "metadata": {}, "source": [ "### Question n°1\n", "Créez un modèle de classification basée sur les machines à vecteur de support.\n", "- Dans un premier temps, gardez les options par défaut.\n", "- Que pouvez-vous dire des performances obtenues (accuracy, précision, rappel) ?" ] }, { "cell_type": "code", "execution_count": 27, "id": "3b136dbf", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "b07b1658-849c-4cdc-9f9b-c763291c1890", "metadata": {}, "source": [ "#### Observations :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "905b31a7", "metadata": {}, "source": [ "### Question n°2\n", "Testez les différents noyaux disponibles pour l'algorithme SVM (linéaire, polynomial, rbf et sigmoïde).\n", "- Représentez graphiquement l'accuracy, la précision et le rappel, pour chaque noyau.\n", "- Il y en a t'il un qui semble plus pertinent que les autres ?\n", "- Affichez-le, ainsi que les scores obtenus pour ce noyau." ] }, { "cell_type": "code", "execution_count": 30, "id": "e68429cd", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "014b5138", "metadata": {}, "source": [ "### Question n°3\n", "Nous allons essayer d'améliorer les performances obtenues avec le noyau polynomial.\n", "- Utilisez ce noyau (`poly`), et faites varier le degré du polynôme utilisé de 1 à 10.\n", "- Représentez graphiquement l'accuracy, la précision et le rappel, en fonction du degré du polynôme.\n", "- Il y en a-t-il un qui semble plus pertinent que les autres ?\n", "- Affichez-le, ainsi que les scores obtenus pour cette valeur.\n", "- Comparez avec le meilleur score obtenu à la question précédente." ] }, { "cell_type": "code", "execution_count": 32, "id": "544318b0", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "25f11b31", "metadata": {}, "source": [ "## Partie 4 : découvrir les réseaux de neurones (ANN)" ] }, { "cell_type": "markdown", "id": "77448c8c", "metadata": {}, "source": [ "### Question n°1\n", "Commençons par étudier le réseau le plus simple : un _perceptron_.\n", "- À l'aide de la classe `sklearn.linear_model.Perceptron`,
créez un perceptron, en gardant les options par défaut.\n", "- Affichez `accuracy`, `précision` et `rappel` : Que pensez-vous de ces performances ?" ] }, { "cell_type": "code", "execution_count": 35, "id": "0d2620da", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "646a3f3a-7382-4728-951d-d14637df4ca4", "metadata": {}, "source": [ "#### Observation :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "bda13ed8", "metadata": {}, "source": [ "### Question n°2\n", "Regardez la documentation pour créer un réseau de neurones (`sklearn.neural_network.MLPClassifier`) :\n", "- Quelle est la structure d'un réseau de neurones par défaut avec scikit-learn ?\n", "- Combien de couches cachées ?\n", "- Combien de neurones par couche ?\n", "\n", "_N.B. : Un message d'alerte (⚠Warning: Stochastic Optimizer: Maximum iterations) est suceptible d'apparaître._" ] }, { "cell_type": "markdown", "id": "e627e744-c82a-4cd9-b215-58694948a2c3", "metadata": {}, "source": [ "#### Réponse :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "f4ae8d40", "metadata": {}, "source": [ "### Question n°3\n", "- Créer un réseau de neurones, en gardant ces options par défaut.\n", "- Affichez `accuracy`, `précision` et `rappel` :\n", " - Que pensez-vous de ces performances, notamment en comparant par rapport au perceptron ?\n", " - Avez-vous un message d'alerte ?
(⚠Warning: Stochastic Optimizer: Maximum iterations)" ] }, { "cell_type": "code", "execution_count": 40, "id": "652f5cca", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "06a6ba7f-2e4b-4a51-9ed8-42a1a5c36551", "metadata": {}, "source": [ "#### Observation :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "3f9b9f82", "metadata": {}, "source": [ "### Question n°4\n", "Si vous avez observé un message d'alerte sur la question précédent :\n", "- Que signifie-t'il selon vous ?\n", "- Que pouvez-vous faire pour y remédier ?\n", "- Proposez un code permettant d'obtenir des résultats, sans message d'alerte.\n", "- Qu'observez-vous sur l'évolution des scores ?" ] }, { "cell_type": "code", "execution_count": 43, "id": "7268b9a1", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "720ecf9a-c376-41e1-bbf3-7e3261a53120", "metadata": {}, "source": [ "#### Observation :\n", "`à compléter`" ] }, { "cell_type": "markdown", "id": "132b2069", "metadata": {}, "source": [ "### Question n°5\n", "Nous allons à présent comparer différentes architectures du réseau de neurones :\n", "- 3 couches de 50 neurones chacune\n", "- 5 couches de 50 neurones chacune\n", "- 3 couches :\n", " 1. 50 neurones,\n", " 2. 100 neurones,\n", " 3. 50 neurones\n", "- 5 couches :\n", " 1. 50 neurones,\n", " 2. 100 neurones,\n", " 3. 50 neurones,\n", " 4. 100 neurones,\n", " 5. 50 neurones\n", "\n", "**Les attendus :**\n", "- Représentez graphiquement l'_accuracy_, la _précision_ et le _rappel_, pour chaque architecture.\n", "- Il y en a t'il une qui semble plus pertinente que les autres ?\n", "- Affichez-la, ainsi que les scores obtenus pour cette architecture.\n", "- Comparez avec le score obtenu par l'architecture par défaut.\n", "- Votre code ne doit générer aucun message d'alerte." ] }, { "cell_type": "code", "execution_count": 46, "id": "1027a554", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "e437de59", "metadata": {}, "source": [ "### Question n°6\n", "En utilisant l'architecture qui vous donnait les meilleures performances, étudier l'impact de la fonction d'activation utilisée sur les performances.\n", "- Représentez sur un graphiques les scores (accuracy, précision et rappel) obtenus pour les quatres fonctions d'activation proposées par _Scikit-Learn_.\n", "- Affichez la fonction qui vous parait la plus pertinente, ainsi que les scores associés." ] }, { "cell_type": "code", "execution_count": 48, "id": "9ad2a684", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "60141a50", "metadata": {}, "source": [ "## Partie 5 : comparer les performances des différents algorithmes\n", "\n", "Nous allons à présent résumer les différentes performances des algorithmes que vous avez testé dans ce TP :\n", "- Récupérez les meilleurs scores (accuracy) obtenu pour chaque algorithme.\n", "- Représentez-les sur un diagramme en barres, en regroupant par algorithme, et en représentant chaque score par une couleur.\n", "- Un algorithme semble-t'il obtenir de meilleures performances que les autres ?" ] }, { "cell_type": "code", "execution_count": 50, "id": "2318f1a5", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "fe7a5b28", "metadata": {}, "source": [ "## Partie 6 : optimiser la recherche des paramètres optimaux" ] }, { "cell_type": "markdown", "id": "62b98a2e-281c-49fb-93b4-0a71d690e572", "metadata": {}, "source": [ "Dans ce TP, nous avons souvent cherché à identifier la meilleur combinaison de paramètres. Nous avons procédé par itération, en cherchant à fixer un paramètre avant de faire évoluer les autres. Cette méthode est coûteuse, et pour faire une recherche exhaustive, nécessite, de répéter très souvent le même code. Scikit-learn propose une classe, `sklearn.model_selection.GridSearchCV`, qui va permettre d'optimiser cette recherche de paramétrage optimal.\n", "\n", "_Lien vers la documentation :_ [sklearn.model_selection.GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)\n", "\n", "Le principe est de définir un dictionnaire, où la clé correspond à un paramètre, et la valeur à la liste de valeurs possibles à tester pour le paramètre considéré. \n", "\n", "### Consigne :\n", "Appliquez ce principe pour déterminer la meilleure combinaison possible pour le réseau de neurones, en repartant des différentes configurations testées dans les parties précédentes." ] }, { "cell_type": "code", "execution_count": 53, "id": "7f6eeac1", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "code", "execution_count": 54, "id": "40f04782-02e8-47f6-8f01-195c0b7f882f", "metadata": {}, "outputs": [], "source": [ "#TODO" ] }, { "cell_type": "markdown", "id": "82eca36d-3c7d-4440-ab03-066762fea747", "metadata": {}, "source": [ "# Fin du TP !" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }