You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/fr/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

450 lines
18 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
"translation_date": "2025-09-04T01:31:15+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "fr"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Introduction à la Régression - Leçon 1\n",
"\n",
"#### Mettre les choses en perspective\n",
"\n",
"✅ Il existe de nombreux types de méthodes de régression, et le choix dépend de la réponse que vous cherchez. Si vous voulez prédire la taille probable d'une personne en fonction de son âge, vous utiliseriez la `régression linéaire`, car vous recherchez une **valeur numérique**. Si vous souhaitez déterminer si un type de cuisine doit être considéré comme végétalien ou non, vous cherchez une **catégorie** et utiliseriez donc la `régression logistique`. Vous en apprendrez davantage sur la régression logistique plus tard. Réfléchissez un peu aux questions que vous pourriez poser à partir des données, et à laquelle de ces méthodes elles conviendraient le mieux.\n",
"\n",
"Dans cette section, vous travaillerez avec un [petit ensemble de données sur le diabète](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imaginez que vous vouliez tester un traitement pour des patients diabétiques. Les modèles d'apprentissage automatique pourraient vous aider à déterminer quels patients répondraient mieux au traitement, en fonction de combinaisons de variables. Même un modèle de régression très basique, lorsqu'il est visualisé, pourrait révéler des informations sur des variables qui vous aideraient à organiser vos essais cliniques théoriques.\n",
"\n",
"Cela dit, commençons cette tâche !\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Illustration par @allison_horst</figcaption>\n",
"\n",
"<!--![Illustration par \\@allison_horst](../../../../../../translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.fr.jpg)<br>Illustration par @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Chargement de notre ensemble d'outils\n",
"\n",
"Pour cette tâche, nous aurons besoin des packages suivants :\n",
"\n",
"- `tidyverse` : Le [tidyverse](https://www.tidyverse.org/) est une [collection de packages R](https://www.tidyverse.org/packages) conçue pour rendre la science des données plus rapide, plus facile et plus agréable !\n",
"\n",
"- `tidymodels` : Le framework [tidymodels](https://www.tidymodels.org/) est une [collection de packages](https://www.tidymodels.org/packages/) dédiée à la modélisation et à l'apprentissage automatique.\n",
"\n",
"Vous pouvez les installer avec la commande suivante :\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Le script ci-dessous vérifie si vous avez les packages nécessaires pour compléter ce module et les installe pour vous si certains sont manquants.\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"Maintenant, chargeons ces packages géniaux et rendons-les disponibles dans notre session R actuelle. (Ceci est juste pour illustration, `pacman::p_load()` l'a déjà fait pour vous)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Le jeu de données sur le diabète\n",
"\n",
"Dans cet exercice, nous allons mettre en pratique nos compétences en régression en réalisant des prédictions sur un jeu de données sur le diabète. Le [jeu de données sur le diabète](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) comprend `442 échantillons` de données relatives au diabète, avec 10 variables prédictives, notamment `l'âge`, `le sexe`, `l'indice de masse corporelle`, `la pression artérielle moyenne`, et `six mesures de sérum sanguin`, ainsi qu'une variable cible `y` : une mesure quantitative de la progression de la maladie un an après la ligne de base.\n",
"\n",
"|Nombre d'observations|442|\n",
"|----------------------|:---|\n",
"|Nombre de prédicteurs|Les 10 premières colonnes sont des prédicteurs numériques|\n",
"|Cible/Variable cible|La colonne 11 est une mesure quantitative de la progression de la maladie un an après la ligne de base|\n",
"|Informations sur les prédicteurs|- âge en années\n",
"||- sexe\n",
"||- bmi indice de masse corporelle\n",
"||- bp pression artérielle moyenne\n",
"||- s1 tc, cholestérol sérique total\n",
"||- s2 ldl, lipoprotéines de basse densité\n",
"||- s3 hdl, lipoprotéines de haute densité\n",
"||- s4 tch, cholestérol total / HDL\n",
"||- s5 ltg, possiblement le logarithme du taux de triglycérides sériques\n",
"||- s6 glu, taux de sucre dans le sang|\n",
"\n",
"\n",
"\n",
"\n",
"> 🎓 Rappelez-vous, il s'agit d'un apprentissage supervisé, et nous avons besoin d'une cible nommée 'y'.\n",
"\n",
"Avant de pouvoir manipuler des données avec R, vous devez importer les données dans la mémoire de R ou établir une connexion permettant à R d'accéder aux données à distance.\n",
"\n",
"> Le package [readr](https://readr.tidyverse.org/), qui fait partie de Tidyverse, offre une manière rapide et conviviale de lire des données rectangulaires dans R.\n",
"\n",
"Maintenant, chargeons le jeu de données sur le diabète disponible à cette URL source : <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Nous effectuerons également une vérification de cohérence sur nos données en utilisant `glimpse()` et afficherons les 5 premières lignes avec `slice()`.\n",
"\n",
"Avant d'aller plus loin, introduisons également un élément que vous rencontrerez souvent dans le code R 🥁🥁 : l'opérateur pipe `%>%`\n",
"\n",
"L'opérateur pipe (`%>%`) permet d'exécuter des opérations dans une séquence logique en passant un objet à une fonction ou une expression d'appel. Vous pouvez considérer l'opérateur pipe comme signifiant \"et ensuite\" dans votre code.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` nous montre que ces données contiennent 442 lignes et 11 colonnes, toutes de type de données `double`.\n",
"\n",
"<br>\n",
"\n",
"> glimpse() et slice() sont des fonctions de [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, qui fait partie du Tidyverse, est une grammaire de manipulation de données offrant un ensemble cohérent de verbes pour résoudre les défis les plus courants en matière de manipulation de données.\n",
"\n",
"<br>\n",
"\n",
"Maintenant que nous avons les données, concentrons-nous sur une seule caractéristique (`bmi`) à cibler pour cet exercice. Cela nécessitera de sélectionner les colonnes souhaitées. Alors, comment faire cela ?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nous permet de *sélectionner* (et éventuellement renommer) des colonnes dans un tableau de données.\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Données d'entraînement et de test\n",
"\n",
"Il est courant en apprentissage supervisé de *diviser* les données en deux sous-ensembles : un ensemble (généralement plus grand) pour entraîner le modèle, et un ensemble plus petit \"mis de côté\" pour évaluer les performances du modèle.\n",
"\n",
"Maintenant que nous avons des données prêtes, nous pouvons voir si une machine peut aider à déterminer une séparation logique entre les nombres de ce jeu de données. Nous pouvons utiliser le package [rsample](https://tidymodels.github.io/rsample/), qui fait partie du framework Tidymodels, pour créer un objet contenant les informations sur *comment* diviser les données, puis deux autres fonctions de rsample pour extraire les ensembles d'entraînement et de test créés :\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Entraîner un modèle de régression linéaire avec Tidymodels\n",
"\n",
"Nous sommes maintenant prêts à entraîner notre modèle !\n",
"\n",
"Dans Tidymodels, vous spécifiez les modèles en utilisant `parsnip()` en définissant trois concepts :\n",
"\n",
"- Le **type** de modèle distingue les modèles tels que la régression linéaire, la régression logistique, les modèles d'arbres de décision, etc.\n",
"\n",
"- Le **mode** du modèle inclut des options courantes comme la régression et la classification ; certains types de modèles prennent en charge l'un ou l'autre, tandis que d'autres n'ont qu'un seul mode.\n",
"\n",
"- Le **moteur** du modèle est l'outil de calcul qui sera utilisé pour ajuster le modèle. Souvent, il s'agit de packages R, tels que **`\"lm\"`** ou **`\"ranger\"`**.\n",
"\n",
"Ces informations sur le modèle sont capturées dans une spécification de modèle, alors construisons-en une !\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Après qu'un modèle a été *spécifié*, il peut être `estimé` ou `entraîné` en utilisant la fonction [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), généralement avec une formule et des données.\n",
"\n",
"`y ~ .` signifie que nous allons ajuster `y` comme la quantité/variable cible prédite, expliquée par tous les prédicteurs/caractéristiques, c'est-à-dire `.` (dans ce cas, nous n'avons qu'un seul prédicteur : `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"À partir des résultats du modèle, nous pouvons observer les coefficients appris lors de l'entraînement. Ils représentent les coefficients de la ligne de meilleure adéquation qui minimise l'erreur globale entre la variable réelle et la variable prédite.\n",
"<br>\n",
"\n",
"## 5. Faire des prédictions sur le jeu de test\n",
"\n",
"Maintenant que nous avons entraîné un modèle, nous pouvons l'utiliser pour prédire la progression de la maladie y pour le jeu de données de test en utilisant [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Cela servira à tracer la ligne entre les groupes de données.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Youhou ! 💃🕺 Nous venons de former un modèle et de l'utiliser pour faire des prédictions !\n",
"\n",
"Lorsqu'on effectue des prédictions, la convention de tidymodels est de toujours produire un tibble/data frame de résultats avec des noms de colonnes standardisés. Cela permet de combiner facilement les données originales et les prédictions dans un format utilisable pour des opérations ultérieures, comme la création de graphiques.\n",
"\n",
"`dplyr::bind_cols()` lie efficacement plusieurs data frames par colonne.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Visualiser les résultats du modèle\n",
"\n",
"Il est maintenant temps de voir cela visuellement 📈. Nous allons créer un nuage de points avec toutes les valeurs de `y` et `bmi` du jeu de test, puis utiliser les prédictions pour tracer une ligne à l'endroit le plus approprié, entre les regroupements de données du modèle.\n",
"\n",
"R propose plusieurs systèmes pour créer des graphiques, mais `ggplot2` est l'un des plus élégants et des plus polyvalents. Cela permet de composer des graphiques en **combinant des composants indépendants**.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Réfléchissez un peu à ce qui se passe ici. Une ligne droite traverse de nombreux petits points de données, mais que fait-elle exactement ? Pouvez-vous voir comment cette ligne pourrait vous permettre de prédire où un nouveau point de données, encore jamais vu, devrait se situer par rapport à l'axe y du graphique ? Essayez de mettre en mots l'utilité pratique de ce modèle.\n",
"\n",
"Félicitations, vous avez construit votre premier modèle de régression linéaire, créé une prédiction avec celui-ci, et l'avez affichée dans un graphique !\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
]
}
]
}