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/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

720 lines
29 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-09-04T02:43:42+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "fr"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Construire un modèle de classification : Délicieuses cuisines asiatiques et indiennes\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Introduction à la classification : Nettoyer, préparer et visualiser vos données\n",
"\n",
"Dans ces quatre leçons, vous explorerez un aspect fondamental de l'apprentissage automatique classique : *la classification*. Nous allons parcourir l'utilisation de divers algorithmes de classification avec un jeu de données sur toutes les cuisines brillantes d'Asie et d'Inde. Préparez-vous à avoir l'eau à la bouche !\n",
"\n",
"<p>\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Célébrez les cuisines pan-asiatiques dans ces leçons ! Image par Jen Looper</figcaption>\n",
"\n",
"La classification est une forme d'[apprentissage supervisé](https://wikipedia.org/wiki/Supervised_learning) qui partage de nombreux points communs avec les techniques de régression. En classification, vous entraînez un modèle à prédire à quelle `catégorie` appartient un élément. Si l'apprentissage automatique consiste à prédire des valeurs ou des noms en utilisant des jeux de données, alors la classification se divise généralement en deux groupes : *classification binaire* et *classification multiclasses*.\n",
"\n",
"Rappelons-nous :\n",
"\n",
"- **La régression linéaire** vous a aidé à prédire les relations entre des variables et à faire des prédictions précises sur la position d'un nouveau point de données par rapport à cette ligne. Par exemple, vous pouviez prédire des valeurs numériques comme *quel serait le prix d'une citrouille en septembre par rapport à décembre*.\n",
"\n",
"- **La régression logistique** vous a permis de découvrir des \"catégories binaires\" : à ce prix, *cette citrouille est-elle orange ou non-orange* ?\n",
"\n",
"La classification utilise divers algorithmes pour déterminer d'autres façons d'attribuer une étiquette ou une classe à un point de données. Travaillons avec ces données culinaires pour voir si, en observant un groupe d'ingrédients, nous pouvons déterminer son origine culinaire.\n",
"\n",
"### [**Quiz avant la leçon**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Introduction**\n",
"\n",
"La classification est l'une des activités fondamentales du chercheur en apprentissage automatique et du data scientist. Qu'il s'agisse de classer de manière basique une valeur binaire (\"cet email est-il un spam ou non ?\") ou de réaliser une classification et une segmentation complexes d'images à l'aide de la vision par ordinateur, il est toujours utile de pouvoir trier des données en classes et de leur poser des questions.\n",
"\n",
"Pour formuler le processus de manière plus scientifique, votre méthode de classification crée un modèle prédictif qui vous permet de cartographier la relation entre les variables d'entrée et les variables de sortie.\n",
"\n",
"<p>\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Problèmes binaires vs multiclasses pour les algorithmes de classification. Infographie par Jen Looper</figcaption>\n",
"\n",
"Avant de commencer le processus de nettoyage de nos données, de leur visualisation et de leur préparation pour nos tâches d'apprentissage automatique, apprenons un peu plus sur les différentes façons dont l'apprentissage automatique peut être utilisé pour classer des données.\n",
"\n",
"Dérivée des [statistiques](https://wikipedia.org/wiki/Statistical_classification), la classification utilisant l'apprentissage automatique classique utilise des caractéristiques, telles que `fumeur`, `poids` et `âge`, pour déterminer *la probabilité de développer une maladie X*. En tant que technique d'apprentissage supervisé similaire aux exercices de régression que vous avez effectués précédemment, vos données sont étiquetées et les algorithmes d'apprentissage automatique utilisent ces étiquettes pour classer et prédire des classes (ou 'caractéristiques') d'un jeu de données et les attribuer à un groupe ou un résultat.\n",
"\n",
"✅ Prenez un moment pour imaginer un jeu de données sur les cuisines. Qu'est-ce qu'un modèle multiclasses pourrait répondre ? Qu'est-ce qu'un modèle binaire pourrait répondre ? Et si vous vouliez déterminer si une cuisine donnée était susceptible d'utiliser du fenugrec ? Et si vous vouliez voir si, avec un sac de courses contenant de l'anis étoilé, des artichauts, du chou-fleur et du raifort, vous pouviez créer un plat typique indien ?\n",
"\n",
"### **Bonjour 'classificateur'**\n",
"\n",
"La question que nous voulons poser à ce jeu de données culinaires est en fait une question **multiclasses**, car nous avons plusieurs cuisines nationales potentielles à examiner. Étant donné un lot d'ingrédients, à laquelle de ces nombreuses classes les données appartiendront-elles ?\n",
"\n",
"Tidymodels propose plusieurs algorithmes différents pour classer les données, en fonction du type de problème que vous souhaitez résoudre. Dans les deux prochaines leçons, vous apprendrez à utiliser plusieurs de ces algorithmes.\n",
"\n",
"#### **Prérequis**\n",
"\n",
"Pour cette leçon, nous aurons besoin des packages suivants pour nettoyer, préparer et visualiser nos données :\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 amusante !\n",
"\n",
"- `tidymodels` : Le [framework tidymodels](https://www.tidymodels.org/) est une [collection de packages](https://www.tidymodels.org/packages/) pour la modélisation et l'apprentissage automatique.\n",
"\n",
"- `DataExplorer` : Le [package DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) est conçu pour simplifier et automatiser le processus d'exploration des données (EDA) et la génération de rapports.\n",
"\n",
"- `themis` : Le [package themis](https://themis.tidymodels.org/) fournit des étapes supplémentaires pour traiter les données déséquilibrées.\n",
"\n",
"Vous pouvez les installer avec :\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativement, le script ci-dessous vérifie si vous avez les packages nécessaires pour compléter ce module et les installe pour vous s'ils manquent.\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"Nous chargerons plus tard ces packages géniaux et les rendrons disponibles dans notre session R actuelle. (Ceci est juste pour illustration, `pacman::p_load()` l'a déjà fait pour vous)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Exercice - nettoyer et équilibrer vos données\n",
"\n",
"La première tâche à accomplir, avant de commencer ce projet, est de nettoyer et **équilibrer** vos données pour obtenir de meilleurs résultats.\n",
"\n",
"Faisons connaissance avec les données ! 🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"Intéressant ! À première vue, la première colonne semble être une sorte de colonne `id`. Obtenons un peu plus d'informations sur les données.\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"D'après les résultats, nous constatons immédiatement que nous avons `2448` lignes et `385` colonnes, et `0` valeurs manquantes. Nous avons également 1 colonne discrète, *cuisine*.\n",
"\n",
"## Exercice - découvrir les cuisines\n",
"\n",
"C'est maintenant que le travail devient plus intéressant. Découvrons la répartition des données, par type de cuisine.\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"Il existe un nombre fini de cuisines, mais la répartition des données est inégale. Vous pouvez corriger cela ! Avant de le faire, explorez un peu plus.\n",
"\n",
"Ensuite, attribuons chaque cuisine à son propre tibble et découvrons combien de données sont disponibles (lignes, colonnes) par cuisine.\n",
"\n",
"> Un [tibble](https://tibble.tidyverse.org/) est une version moderne d'un data frame.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Illustration par @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"## **Exercice - Découvrir les principaux ingrédients par cuisine avec dplyr**\n",
"\n",
"Vous pouvez maintenant explorer les données plus en profondeur et découvrir quels sont les ingrédients typiques par cuisine. Il est important d'éliminer les données récurrentes qui créent de la confusion entre les cuisines, alors apprenons à résoudre ce problème.\n",
"\n",
"Créez une fonction `create_ingredient()` en R qui retourne un dataframe d'ingrédients. Cette fonction commencera par supprimer une colonne inutile et triera les ingrédients en fonction de leur fréquence.\n",
"\n",
"La structure de base d'une fonction en R est la suivante :\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Une introduction claire aux fonctions en R est disponible [ici](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Allons-y ! Nous allons utiliser les [verbes dplyr](https://dplyr.tidyverse.org/) que nous avons appris dans nos leçons précédentes. Pour rappel :\n",
"\n",
"- `dplyr::select()`: vous aide à choisir quelles **colonnes** conserver ou exclure.\n",
"\n",
"- `dplyr::pivot_longer()`: vous permet de \"réorganiser\" les données, en augmentant le nombre de lignes et en réduisant le nombre de colonnes.\n",
"\n",
"- `dplyr::group_by()` et `dplyr::summarise()`: vous aident à calculer des statistiques récapitulatives pour différents groupes et à les présenter dans un tableau clair.\n",
"\n",
"- `dplyr::filter()`: crée un sous-ensemble des données ne contenant que les lignes qui satisfont vos conditions.\n",
"\n",
"- `dplyr::mutate()`: vous aide à créer ou modifier des colonnes.\n",
"\n",
"Découvrez ce [tutoriel *artistique* learnr](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) par Allison Horst, qui introduit certaines fonctions utiles de manipulation de données dans dplyr *(partie du Tidyverse)*.\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"Nous pouvons maintenant utiliser la fonction pour avoir une idée des dix ingrédients les plus populaires par cuisine. Testons-la avec `thai_df`.\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"Dans la section précédente, nous avons utilisé `geom_col()`, voyons maintenant comment utiliser également `geom_bar` pour créer des diagrammes en barres. Utilisez `?geom_bar` pour en savoir plus.\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"Qu'en est-il des cuisines chinoises ?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"Enfin, tracez les ingrédients coréens.\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"À partir des visualisations de données, nous pouvons maintenant éliminer les ingrédients les plus courants qui créent de la confusion entre les cuisines distinctes, en utilisant `dplyr::select()`.\n",
"\n",
"Tout le monde adore le riz, l'ail et le gingembre !\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## Prétraitement des données avec des recettes 👩‍🍳👨‍🍳 - Gérer des données déséquilibrées ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Illustration par @allison_horst</figcaption>\n",
"\n",
"Étant donné que cette leçon porte sur les cuisines, nous devons mettre les `recettes` dans leur contexte.\n",
"\n",
"Tidymodels propose un autre package pratique : `recipes` - un package pour le prétraitement des données.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Jetons un coup d'œil à la répartition de nos cuisines à nouveau.\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"Comme vous pouvez le constater, il existe une répartition assez inégale dans le nombre de cuisines. Les cuisines coréennes sont presque trois fois plus nombreuses que les cuisines thaïlandaises. Les données déséquilibrées ont souvent des effets négatifs sur les performances du modèle. Prenons l'exemple d'une classification binaire. Si la majorité de vos données appartient à une seule classe, un modèle d'apprentissage automatique va prédire cette classe plus fréquemment, simplement parce qu'il dispose de plus de données pour celle-ci. Équilibrer les données permet de corriger tout déséquilibre et d'éliminer cette disparité. De nombreux modèles fonctionnent mieux lorsque le nombre d'observations est égal et, par conséquent, ont tendance à rencontrer des difficultés avec des données déséquilibrées.\n",
"\n",
"Il existe principalement deux façons de traiter les ensembles de données déséquilibrés :\n",
"\n",
"- ajouter des observations à la classe minoritaire : `Sur-échantillonnage`, par exemple en utilisant un algorithme SMOTE\n",
"\n",
"- supprimer des observations de la classe majoritaire : `Sous-échantillonnage`\n",
"\n",
"Voyons maintenant comment traiter les ensembles de données déséquilibrés en utilisant une `recette`. Une recette peut être considérée comme un plan qui décrit les étapes à appliquer à un ensemble de données afin de le préparer à l'analyse.\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"Décomposons nos étapes de prétraitement.\n",
"\n",
"- L'appel à `recipe()` avec une formule indique à la recette les *rôles* des variables en utilisant les données de `df_select` comme référence. Par exemple, la colonne `cuisine` a été assignée au rôle de `outcome`, tandis que les autres colonnes ont été assignées au rôle de `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) crée une *spécification* d'une étape de recette qui génère de manière synthétique de nouveaux exemples de la classe minoritaire en utilisant les plus proches voisins de ces cas.\n",
"\n",
"Maintenant, si nous souhaitons voir les données prétraitées, nous devons [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) et [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) notre recette.\n",
"\n",
"`prep()`: estime les paramètres nécessaires à partir d'un ensemble d'entraînement qui peuvent ensuite être appliqués à d'autres ensembles de données.\n",
"\n",
"`bake()`: applique une recette préparée à tout ensemble de données.\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"Vérifions maintenant la répartition de nos cuisines et comparons-les avec les données déséquilibrées.\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"Miam ! Les données sont propres, équilibrées et très appétissantes 😋 !\n",
"\n",
"> Normalement, une recette est généralement utilisée comme préprocesseur pour la modélisation, où elle définit les étapes à appliquer à un ensemble de données afin de le préparer pour la modélisation. Dans ce cas, un `workflow()` est typiquement utilisé (comme nous l'avons déjà vu dans nos leçons précédentes) au lieu d'estimer manuellement une recette.\n",
">\n",
"> Ainsi, vous n'avez généralement pas besoin d'utiliser **`prep()`** et **`bake()`** pour les recettes lorsque vous utilisez tidymodels, mais ce sont des fonctions utiles à avoir dans votre boîte à outils pour vérifier que les recettes font ce que vous attendez, comme dans notre cas.\n",
">\n",
"> Lorsque vous utilisez **`bake()`** sur une recette préparée avec **`new_data = NULL`**, vous obtenez les données que vous avez fournies lors de la définition de la recette, mais ayant subi les étapes de prétraitement.\n",
"\n",
"Sauvegardons maintenant une copie de ces données pour les utiliser dans les prochaines leçons :\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"Ce nouveau fichier CSV se trouve maintenant dans le dossier racine des données.\n",
"\n",
"**🚀Défi**\n",
"\n",
"Ce programme contient plusieurs ensembles de données intéressants. Explorez les dossiers `data` et voyez si certains contiennent des ensembles de données adaptés à une classification binaire ou multi-classes. Quelles questions poseriez-vous à propos de cet ensemble de données ?\n",
"\n",
"## [**Quiz après le cours**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Révision & Étude personnelle**\n",
"\n",
"- Consultez [le package themis](https://github.com/tidymodels/themis). Quelles autres techniques pourrions-nous utiliser pour gérer des données déséquilibrées ?\n",
"\n",
"- Site de référence des modèles Tidy [site web de référence](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham et G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### REMERCIEMENTS À :\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) pour avoir créé les illustrations incroyables qui rendent R plus accueillant et engageant. Retrouvez plus d'illustrations dans sa [galerie](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) et [Jen Looper](https://www.twitter.com/jenlooper) pour avoir créé la version originale en Python de ce module ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Illustration par @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"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"
]
}
]
}