This commit is contained in:
johanleroy
2025-09-19 08:58:26 +02:00
parent b6da7f744c
commit 10477cdf94
4 changed files with 3416 additions and 0 deletions

614
M06_TP01_Exercice.ipynb Normal file
View File

@@ -0,0 +1,614 @@
{
"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
}