TP
This commit is contained in:
1328
M05_TP01_Solution.ipynb
Normal file
1328
M05_TP01_Solution.ipynb
Normal file
File diff suppressed because one or more lines are too long
614
M06_TP01_Exercice.ipynb
Normal file
614
M06_TP01_Exercice.ipynb
Normal 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
|
||||
}
|
||||
1142
M06_TP01_Solution.ipynb
Normal file
1142
M06_TP01_Solution.ipynb
Normal file
File diff suppressed because one or more lines are too long
332
M07_TP01_Exercice.ipynb
Normal file
332
M07_TP01_Exercice.ipynb
Normal file
@@ -0,0 +1,332 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c6c97ebc",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# TP n°1 du module 7 : L'apprentissage non supervisé pour le _Machine Learning_\n",
|
||||
"\n",
|
||||
"Dans ce TP, nous allons mettre en pratique les principes de l'apprentissage non supervisé.\n",
|
||||
"\n",
|
||||
"Objectifs :\n",
|
||||
"- Passer en revue les principaux algorithmes de clustering\n",
|
||||
"- Comparer les performances de ces différents algorithmes\n",
|
||||
"- Comparer avec les performances de la classification supervisée.\n",
|
||||
"\n",
|
||||
"La recherche d'itemsets fréquents et de règles d'associaion ne sera pas abordée dans ce TP.\n",
|
||||
"\n",
|
||||
"_NB. : Des messages d'alertes sont suceptibles d'apparaître…_"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "3d02d7de",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Ajoutez ici les imports de librairies nécessaires\n",
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "925311c6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Même si ce module concerne l'apprentissage non supervisé, nous allons continuer à explorer le jeu de données du Titanic :\n",
|
||||
"- Cela nous permettra, à la fin, de comparer les clusters obtenus, avec les deux classes réelles obtenus via les labels du jeu de données.\n",
|
||||
"\n",
|
||||
"Nous allons donc commencer par charger les données. Pour cela, repartez du csv obtenu à la fin du TP n°1 du module 4 :\n",
|
||||
"- Construisez, comme pour l'apprentissage supervisé, deux dataframe : un avec les attributs, l'autre avec les labels."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "8660a70c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7ab5c627",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 1 - Découverte de KMeans"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "596a7460-2256-40dc-9fcf-d1cbdd4164d2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°1\n",
|
||||
"Nous allons commencer par faire un premier clustering avec KMeans.\n",
|
||||
"- Comme nous connaissons le nombre de clusters à rechercher, créer un modèle avec la classe de scikit-learn, en fixant le nombre de clusters.\n",
|
||||
"- Appliquez ce clustering aux attributs de _Titanic.csv_\n",
|
||||
"- Récupérer dans une liste le numéro du cluster prédit pour chaque donnée."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "ad5f4f32",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "23f5200c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°2\n",
|
||||
"- Quelle est la classe majoritaire dans le premier cluster ?\n",
|
||||
"- Dans le deuxième cluster ?\n",
|
||||
"- Affichez une matrice, qui donne pour chaque classe le nombre de fois où elle apparaît dans chaque cluster.\n",
|
||||
"- Qu'observez-vous ?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "35da6202",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5b356cb5",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°3\n",
|
||||
"Faites un pairplot des données du Titanic, en colorant chaque donnée en fonction du cluster auquel elle a été affectée.\n",
|
||||
"- Remarquez-vous des phénomènes intéressants ?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "32bf66f5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "20edcaa2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°4\n",
|
||||
"Les algorithmes de clustering impliquant des mesures de distances sont très sensibles aux plages de valeurs des différents attributs.\n",
|
||||
"- Normalisez vos données, et refaites les mêmes étapes que précédemment.\n",
|
||||
"- Observez-vous une différence ?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "ee230dda",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "69d9c149",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "0b188d1d-94b5-4c11-806f-374a797986ca",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Observation :\n",
|
||||
"`à compléter`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "462ecef1",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°5\n",
|
||||
"Étudions l'évolution du coefficient de _silhouette_.\n",
|
||||
"- Pour k variant de 2 à 10, tracez l'évolution de ce coefficient pour un clustering kmeans appliqué au données normalisées.\n",
|
||||
"- Le nombre de clusters utilisé aux questions précédentes vous semble-t'il pertinent ?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "3b0c59a0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "08525d4b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 2 - Clustering hiérarchique\n",
|
||||
"\n",
|
||||
"⚠ Attention : Pour toute la suite du TP, nous travaillerons avec les données normalisées. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "975de584-bd9e-4837-b443-3a17c49983e8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°1\n",
|
||||
"Créez un modèle de clustering hiérarchique (`AgglomerativeClustering`). En utilisant le coefficient de silhouette, comparez le score obtenu pour deux clusters avec celui obtenu par KMeans sur la section précédente."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"id": "6c8c8175",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6516e52f-c916-4d0a-a4db-87128de828ce",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Observation :\n",
|
||||
"`à compléter`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7527fa93",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°2\n",
|
||||
"Représentez graphiquement ce nouveau clustering, à l'aide d'un pairplot.\n",
|
||||
"- Remarquez-vous des tendances ou des changements intéressants ?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"id": "6cb2ad2c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8305067c",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Question n°3\n",
|
||||
"Étudiez l'impact du paramètre `linkage` sur les résultats de votre clustering hiérarchique.\n",
|
||||
"- Pour rappel, ce paramètre désigne la manière dont est calculée la distance entre deux clusters, pour décider lesquels réunir à une itération donnée.\n",
|
||||
"- Construisez un graphique montrant la valeur du coefficient silhouette en fonction de la méthode utilisée."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"id": "5e3fa74f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "34eef8e2",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 3 - Comparaison des différents clustering\n",
|
||||
"\n",
|
||||
"Nous allons à présent comparer les résultats obtenus avec les autres algorithmes de clustering proposés par _Scikit-Learn_.\n",
|
||||
"- Testez ces différents algorithmes, et calculez à chaque fois le coefficient de slihouette obtenu.\n",
|
||||
"- Pour les algorithmes qui ne demandent pas de préciser le nombre de clusters à construire :\n",
|
||||
" - Affichez le nombre de clusters déduit par l'algorithme."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "9b1d9bc9-b50f-4c35-91fd-310bf3948e71",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Présentez une synthèse de vos résultats sous forme d'un tableau et d'un graphique.\n",
|
||||
"\n",
|
||||
"Liste des algorithmes à prendre en compte : `KMeans`, `DBScan`, `Spectral`, `Affinity_Propagation`, `agglomerativeClustering`, `OPTICS`, `BIRCH`, …\n",
|
||||
"\n",
|
||||
"⚠Attention : Pour certains algorithmes, vous devrez jouer avec les paramètres à votre disposition pour parvenir à obtenir au moins deux clusters."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"id": "cd9df865",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#TODO"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4fe16763-a151-4516-80cd-8f8ba0069fa3",
|
||||
"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
|
||||
}
|
||||
Reference in New Issue
Block a user