615 lines
16 KiB
Plaintext
615 lines
16 KiB
Plaintext
{
|
||
"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
|
||
}
|