Files
ENI-Jupyter/M06_TP01_Exercice.ipynb
johanleroy 10477cdf94 TP
2025-09-19 08:58:26 +02:00

615 lines
16 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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_<br/> (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`,<br/> 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 ?<br/>(⚠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
}