{ "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", "
\n",
" \n",
"
\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",
"
\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",
"
\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"
]
}
]
}