{ "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-08-30T00:00:38+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "it" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## Introduzione alla classificazione: Pulisci, prepara e visualizza i tuoi dati\n", "\n", "In queste quattro lezioni, esplorerai un aspetto fondamentale del machine learning classico: *la classificazione*. Utilizzeremo vari algoritmi di classificazione con un dataset che riguarda tutte le brillanti cucine dell'Asia e dell'India. Speriamo che tu abbia fame!\n", "\n", "

\n", " \n", "

Festeggia le cucine pan-asiatiche in queste lezioni! Immagine di Jen Looper
\n", "\n", "\n", "\n", "\n", "La classificazione è una forma di [apprendimento supervisionato](https://wikipedia.org/wiki/Supervised_learning) che ha molto in comune con le tecniche di regressione. Nella classificazione, si addestra un modello per prevedere a quale `categoria` appartiene un elemento. Se il machine learning riguarda la previsione di valori o nomi utilizzando dataset, allora la classificazione si divide generalmente in due gruppi: *classificazione binaria* e *classificazione multiclass*.\n", "\n", "Ricorda:\n", "\n", "- **La regressione lineare** ti ha aiutato a prevedere le relazioni tra variabili e a fare previsioni accurate su dove un nuovo punto dati si posizionerebbe rispetto a quella linea. Ad esempio, potresti prevedere valori numerici come *il prezzo di una zucca a settembre rispetto a dicembre*.\n", "\n", "- **La regressione logistica** ti ha aiutato a scoprire \"categorie binarie\": a questo prezzo, *questa zucca è arancione o non arancione*?\n", "\n", "La classificazione utilizza vari algoritmi per determinare altri modi di assegnare un'etichetta o una classe a un punto dati. Lavoriamo con questi dati sulle cucine per vedere se, osservando un gruppo di ingredienti, possiamo determinare la cucina di origine.\n", "\n", "### [**Quiz pre-lezione**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n", "\n", "### **Introduzione**\n", "\n", "La classificazione è una delle attività fondamentali per i ricercatori di machine learning e i data scientist. Dalla classificazione di un valore binario di base (\"questa email è spam o no?\") alla classificazione e segmentazione complessa di immagini utilizzando la visione artificiale, è sempre utile essere in grado di ordinare i dati in classi e porre domande su di essi.\n", "\n", "Per esprimere il processo in modo più scientifico, il tuo metodo di classificazione crea un modello predittivo che ti consente di mappare la relazione tra variabili di input e variabili di output.\n", "\n", "

\n", " \n", "

Problemi binari vs. multiclass per gli algoritmi di classificazione. Infografica di Jen Looper
\n", "\n", "\n", "\n", "Prima di iniziare il processo di pulizia dei dati, visualizzarli e prepararli per i nostri compiti di ML, impariamo un po' sui vari modi in cui il machine learning può essere utilizzato per classificare i dati.\n", "\n", "Derivata dalla [statistica](https://wikipedia.org/wiki/Statistical_classification), la classificazione utilizzando il machine learning classico utilizza caratteristiche come `fumatore`, `peso` e `età` per determinare *la probabilità di sviluppare X malattia*. Come tecnica di apprendimento supervisionato simile agli esercizi di regressione che hai svolto in precedenza, i tuoi dati sono etichettati e gli algoritmi di ML utilizzano quelle etichette per classificare e prevedere classi (o 'caratteristiche') di un dataset e assegnarle a un gruppo o risultato.\n", "\n", "✅ Prenditi un momento per immaginare un dataset sulle cucine. A cosa potrebbe rispondere un modello multiclass? A cosa potrebbe rispondere un modello binario? E se volessi determinare se una determinata cucina è probabilmente solita utilizzare il fieno greco? E se volessi vedere se, dato un sacchetto di generi alimentari pieno di anice stellato, carciofi, cavolfiori e rafano, potresti creare un tipico piatto indiano?\n", "\n", "### **Ciao 'classificatore'**\n", "\n", "La domanda che vogliamo porre a questo dataset sulle cucine è effettivamente una domanda **multiclass**, poiché abbiamo diverse potenziali cucine nazionali con cui lavorare. Dato un gruppo di ingredienti, a quale di queste molte classi si adatteranno i dati?\n", "\n", "Tidymodels offre diversi algoritmi da utilizzare per classificare i dati, a seconda del tipo di problema che vuoi risolvere. Nelle prossime due lezioni, imparerai a conoscere alcuni di questi algoritmi.\n", "\n", "#### **Prerequisiti**\n", "\n", "Per questa lezione, avremo bisogno dei seguenti pacchetti per pulire, preparare e visualizzare i nostri dati:\n", "\n", "- `tidyverse`: Il [tidyverse](https://www.tidyverse.org/) è una [collezione di pacchetti R](https://www.tidyverse.org/packages) progettata per rendere la scienza dei dati più veloce, facile e divertente!\n", "\n", "- `tidymodels`: Il [framework tidymodels](https://www.tidymodels.org/) è una [collezione di pacchetti](https://www.tidymodels.org/packages/) per la modellazione e il machine learning.\n", "\n", "- `DataExplorer`: Il [pacchetto DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) è pensato per semplificare e automatizzare il processo di EDA e la generazione di report.\n", "\n", "- `themis`: Il [pacchetto themis](https://themis.tidymodels.org/) fornisce passaggi extra per gestire dati sbilanciati.\n", "\n", "Puoi installarli con:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n", "\n", "In alternativa, lo script qui sotto verifica se hai i pacchetti necessari per completare questo modulo e li installa per te nel caso in cui manchino.\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": [ "Caricheremo successivamente questi fantastici pacchetti e li renderemo disponibili nella nostra attuale sessione R. (Questo è solo a scopo illustrativo, `pacman::p_load()` lo ha già fatto per te)\n" ], "metadata": { "id": "YkKAxOJvGD4C" } }, { "cell_type": "markdown", "source": [ "## Esercizio - pulire e bilanciare i tuoi dati\n", "\n", "Il primo compito da svolgere, prima di iniziare questo progetto, è pulire e **bilanciare** i tuoi dati per ottenere risultati migliori.\n", "\n", "Facciamo conoscenza con i dati!🕵️\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": [ "Interessante! A quanto pare, la prima colonna è una sorta di colonna `id`. Cerchiamo di ottenere qualche informazione in più sui dati.\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": [ "Dall'output, possiamo vedere immediatamente che abbiamo `2448` righe e `385` colonne e `0` valori mancanti. Abbiamo anche 1 colonna discreta, *cuisine*.\n", "\n", "## Esercizio - conoscere le cucine\n", "\n", "Ora il lavoro inizia a diventare più interessante. Scopriamo la distribuzione dei dati, per cucina.\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": [ "Esistono un numero finito di cucine, ma la distribuzione dei dati è disomogenea. Puoi risolvere questo problema! Prima di farlo, esplora un po' di più.\n", "\n", "Successivamente, assegniamo ogni cucina al proprio tibble e scopriamo quanti dati sono disponibili (righe, colonne) per ciascuna cucina.\n", "\n", "> Un [tibble](https://tibble.tidyverse.org/) è un moderno data frame.\n", "\n", "

\n", " \n", "

Illustrazione di @allison_horst
\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": [ "## **Esercizio - Scoprire gli ingredienti principali per cucina usando dplyr**\n", "\n", "Ora puoi approfondire i dati e scoprire quali sono gli ingredienti tipici per ogni cucina. Dovresti eliminare i dati ricorrenti che creano confusione tra le cucine, quindi impariamo a gestire questo problema.\n", "\n", "Crea una funzione `create_ingredient()` in R che restituisca un dataframe di ingredienti. Questa funzione inizierà eliminando una colonna poco utile e ordinerà gli ingredienti in base al loro conteggio.\n", "\n", "La struttura di base di una funzione in R è:\n", "\n", "`myFunction <- function(arglist){`\n", "\n", "**`...`**\n", "\n", "**`return`**`(value)`\n", "\n", "`}`\n", "\n", "Una introduzione chiara alle funzioni in R può essere trovata [qui](https://skirmer.github.io/presentations/functions_with_r.html#1).\n", "\n", "Passiamo subito all'azione! Utilizzeremo i [verbi di dplyr](https://dplyr.tidyverse.org/) che abbiamo imparato nelle lezioni precedenti. Come promemoria:\n", "\n", "- `dplyr::select()`: ti aiuta a scegliere quali **colonne** mantenere o escludere.\n", "\n", "- `dplyr::pivot_longer()`: ti aiuta a \"allungare\" i dati, aumentando il numero di righe e diminuendo il numero di colonne.\n", "\n", "- `dplyr::group_by()` e `dplyr::summarise()`: ti aiutano a trovare statistiche riassuntive per diversi gruppi e a metterle in una tabella ordinata.\n", "\n", "- `dplyr::filter()`: crea un sottoinsieme dei dati contenente solo le righe che soddisfano le tue condizioni.\n", "\n", "- `dplyr::mutate()`: ti aiuta a creare o modificare colonne.\n", "\n", "Dai un'occhiata a questo [tutorial learnr pieno di *arte*](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) di Allison Horst, che introduce alcune funzioni utili per la manipolazione dei dati in dplyr *(parte del 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": [ "Ora possiamo usare la funzione per avere un'idea dei dieci ingredienti più popolari per cucina. Proviamola con `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": [ "Nella sezione precedente, abbiamo utilizzato `geom_col()`, vediamo come puoi usare anche `geom_bar` per creare grafici a barre. Usa `?geom_bar` per ulteriori letture.\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": [ "Ecco la traduzione:\n", "\n", "# Cosa dire della cucina cinese?\n", "\n", "La cucina cinese è una delle più antiche e variegate al mondo. Con una storia che risale a migliaia di anni fa, offre una vasta gamma di sapori, tecniche di cottura e ingredienti. \n", "\n", "## Regioni principali\n", "\n", "La cucina cinese può essere suddivisa in diverse regioni principali, ognuna con le proprie caratteristiche uniche:\n", "\n", "- **Cucina del Sichuan**: Famosa per il suo sapore piccante e speziato, grazie all'uso del pepe del Sichuan.\n", "- **Cucina cantonese**: Conosciuta per la sua delicatezza e l'uso di ingredienti freschi, spesso cotta al vapore o saltata in padella.\n", "- **Cucina dello Shandong**: Caratterizzata da sapori forti e piatti a base di frutti di mare.\n", "- **Cucina dello Jiangsu**: Celebre per la sua raffinatezza e l'attenzione ai dettagli nella presentazione dei piatti.\n", "\n", "## Tecniche di cottura\n", "\n", "Alcune delle tecniche di cottura più comuni includono:\n", "\n", "- **Saltare in padella**: Una tecnica veloce che preserva il sapore e la consistenza degli ingredienti.\n", "- **Cottura al vapore**: Ideale per mantenere la freschezza e il valore nutrizionale degli alimenti.\n", "- **Brasatura**: Utilizzata per creare piatti ricchi e saporiti.\n", "\n", "## Ingredienti tipici\n", "\n", "Gli ingredienti comuni nella cucina cinese includono:\n", "\n", "- Riso e noodles\n", "- Salsa di soia e olio di sesamo\n", "- Tofu e verdure fresche\n", "- Carne di maiale, pollo e anatra\n", "- Spezie come zenzero, aglio e cipollotti\n", "\n", "## Piatti famosi\n", "\n", "Alcuni piatti cinesi famosi che potresti aver già provato:\n", "\n", "- **Anatra alla pechinese**: Un piatto iconico con pelle croccante e carne succosa.\n", "- **Mapo tofu**: Tofu piccante con carne macinata e salsa speziata.\n", "- **Dim sum**: Piccoli bocconcini serviti in cestini di bambù, perfetti per condividere.\n", "\n", "La cucina cinese è un viaggio culinario che vale la pena esplorare!\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": [], "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": [ "Dai visualizzazioni dei dati, possiamo ora eliminare gli ingredienti più comuni che generano confusione tra le diverse cucine, utilizzando `dplyr::select()`.\n", "\n", "Tutti amano il riso, l'aglio e lo zenzero!\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": [ "## Pre-elaborazione dei dati usando le ricette 👩‍🍳👨‍🍳 - Gestire i dati sbilanciati ⚖️\n", "\n", "

\n", " \n", "

Illustrazione di @allison_horst
\n", "\n", "Dato che questa lezione riguarda le cucine, dobbiamo contestualizzare le `ricette`.\n", "\n", "Tidymodels offre un altro pacchetto interessante: `recipes` - un pacchetto per la pre-elaborazione dei dati.\n" ], "metadata": { "id": "kkFd-JxdIaL6" } }, { "cell_type": "markdown", "source": [ "Diamo un'occhiata di nuovo alla distribuzione delle nostre cucine.\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": [ "Come puoi vedere, c'è una distribuzione piuttosto disuguale nel numero di cucine. Le cucine coreane sono quasi 3 volte quelle tailandesi. I dati sbilanciati spesso hanno effetti negativi sulle prestazioni del modello. Pensa a una classificazione binaria. Se la maggior parte dei tuoi dati appartiene a una classe, un modello di machine learning tenderà a prevedere quella classe più frequentemente, semplicemente perché ci sono più dati per essa. Bilanciare i dati serve a correggere eventuali squilibri e aiuta a rimuovere questa disuguaglianza. Molti modelli funzionano meglio quando il numero di osservazioni è uguale e, di conseguenza, tendono a incontrare difficoltà con dati sbilanciati.\n", "\n", "Ci sono principalmente due modi per affrontare set di dati sbilanciati:\n", "\n", "- aggiungere osservazioni alla classe minoritaria: `Over-sampling`, ad esempio utilizzando un algoritmo SMOTE\n", "\n", "- rimuovere osservazioni dalla classe maggioritaria: `Under-sampling`\n", "\n", "Ora dimostriamo come affrontare set di dati sbilanciati utilizzando una `ricetta`. Una ricetta può essere considerata come un progetto che descrive quali passaggi devono essere applicati a un set di dati per prepararlo all'analisi dei dati.\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": [ "Analizziamo i nostri passaggi di pre-elaborazione.\n", "\n", "- La chiamata a `recipe()` con una formula indica alla ricetta i *ruoli* delle variabili utilizzando i dati di `df_select` come riferimento. Ad esempio, la colonna `cuisine` è stata assegnata al ruolo di `outcome`, mentre il resto delle colonne è stato assegnato al ruolo di `predictor`.\n", "\n", "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) crea una *specifica* di un passaggio della ricetta che genera sinteticamente nuovi esempi della classe minoritaria utilizzando i vicini più prossimi di questi casi.\n", "\n", "Ora, se volessimo vedere i dati pre-elaborati, dovremmo [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) e [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) la nostra ricetta.\n", "\n", "`prep()`: stima i parametri richiesti da un set di addestramento che possono essere successivamente applicati ad altri set di dati.\n", "\n", "`bake()`: applica una ricetta pre-elaborata a qualsiasi set di dati.\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": [ "Ora controlliamo la distribuzione delle nostre cucine e confrontiamola con i dati sbilanciati.\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": [ "Yum! I dati sono puliti, bilanciati e molto gustosi 😋!\n", "\n", "> Normalmente, una ricetta viene solitamente utilizzata come preprocessore per la modellazione, dove definisce quali passaggi devono essere applicati a un set di dati per renderlo pronto per la modellazione. In tal caso, si utilizza tipicamente un `workflow()` (come abbiamo già visto nelle lezioni precedenti) invece di stimare manualmente una ricetta.\n", ">\n", "> Pertanto, di solito non è necessario **`prep()`** e **`bake()`** le ricette quando si utilizza tidymodels, ma sono funzioni utili da avere nel proprio toolkit per confermare che le ricette stiano facendo ciò che ci si aspetta, come nel nostro caso.\n", ">\n", "> Quando si **`bake()`** una ricetta preparata con **`new_data = NULL`**, si ottengono i dati forniti durante la definizione della ricetta, ma che hanno subito i passaggi di preprocessamento.\n", "\n", "Ora salviamo una copia di questi dati per utilizzarli nelle lezioni future:\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": [ "Questo nuovo file CSV si trova ora nella cartella principale dei dati.\n", "\n", "**🚀Sfida**\n", "\n", "Questo curriculum contiene diversi dataset interessanti. Esplora le cartelle `data` e verifica se contengono dataset adatti alla classificazione binaria o multi-classe. Quali domande potresti porre a questo dataset?\n", "\n", "## [**Quiz post-lezione**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n", "\n", "## **Revisione e Studio Autonomo**\n", "\n", "- Dai un'occhiata al [pacchetto themis](https://github.com/tidymodels/themis). Quali altre tecniche potremmo utilizzare per gestire dati sbilanciati?\n", "\n", "- Sito di riferimento per i modelli Tidy: [Tidy models](https://www.tidymodels.org/start/).\n", "\n", "- H. Wickham e G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n", "\n", "#### GRAZIE A:\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) per aver creato le straordinarie illustrazioni che rendono R più accogliente e coinvolgente. Trova altre illustrazioni nella sua [galleria](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) e [Jen Looper](https://www.twitter.com/jenlooper) per aver creato la versione originale in Python di questo modulo ♥️\n", "\n", "

\n", " \n", "

Illustrazione di @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n" ] } ] }