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.
447 lines
17 KiB
447 lines
17 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-08-29T23:10:30+00:00",
|
|
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
|
|
"language_code": "it"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "YJUHCXqK57yz"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## Introduzione alla Regressione - Lezione 1\n",
|
|
"\n",
|
|
"#### Mettiamolo in prospettiva\n",
|
|
"\n",
|
|
"✅ Esistono molti tipi di metodi di regressione, e quale scegliere dipende dalla risposta che stai cercando. Se vuoi prevedere l'altezza probabile di una persona di una certa età, useresti la `regressione lineare`, poiché stai cercando un **valore numerico**. Se invece sei interessato a scoprire se un tipo di cucina dovrebbe essere considerato vegano o meno, stai cercando un **assegnamento di categoria**, quindi utilizzeresti la `regressione logistica`. Imparerai di più sulla regressione logistica più avanti. Rifletti un po' su alcune domande che puoi porre ai dati e su quale di questi metodi sarebbe più appropriato.\n",
|
|
"\n",
|
|
"In questa sezione, lavorerai con un [piccolo dataset sul diabete](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Immagina di voler testare un trattamento per pazienti diabetici. I modelli di Machine Learning potrebbero aiutarti a determinare quali pazienti risponderebbero meglio al trattamento, basandoti su combinazioni di variabili. Anche un modello di regressione molto semplice, se visualizzato, potrebbe mostrare informazioni sulle variabili che ti aiuterebbero a organizzare i tuoi studi clinici teorici.\n",
|
|
"\n",
|
|
"Detto ciò, iniziamo con questo compito!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Illustrazione di @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Illustrazione di @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Caricare il nostro set di strumenti\n",
|
|
"\n",
|
|
"Per questo compito, avremo bisogno dei seguenti pacchetti:\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",
|
|
"Puoi installarli con il seguente comando:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Lo script qui sotto verifica se hai i pacchetti necessari per completare questo modulo e li installa per te nel caso in cui alcuni siano mancanti.\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": [
|
|
"Ora, carichiamo questi fantastici pacchetti e rendiamoli disponibili nella nostra sessione R corrente. (Questo è solo a scopo illustrativo, `pacman::p_load()` lo ha già fatto per te)\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. Il dataset sul diabete\n",
|
|
"\n",
|
|
"In questo esercizio, metteremo in pratica le nostre competenze di regressione facendo previsioni su un dataset relativo al diabete. Il [dataset sul diabete](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) include `442 campioni` di dati sul diabete, con 10 variabili predittive: `età`, `sesso`, `indice di massa corporea`, `pressione sanguigna media` e `sei misurazioni del siero ematico`, oltre a una variabile di risultato `y`: una misura quantitativa della progressione della malattia un anno dopo la baseline.\n",
|
|
"\n",
|
|
"|Numero di osservazioni|442|\n",
|
|
"|----------------------|:---|\n",
|
|
"|Numero di predittori|Le prime 10 colonne sono predittive numeriche|\n",
|
|
"|Risultato/Target|La colonna 11 è una misura quantitativa della progressione della malattia un anno dopo la baseline|\n",
|
|
"|Informazioni sui predittori|- età in anni\n",
|
|
"||- sesso\n",
|
|
"||- bmi indice di massa corporea\n",
|
|
"||- bp pressione sanguigna media\n",
|
|
"||- s1 tc, colesterolo totale nel siero\n",
|
|
"||- s2 ldl, lipoproteine a bassa densità\n",
|
|
"||- s3 hdl, lipoproteine ad alta densità\n",
|
|
"||- s4 tch, colesterolo totale / HDL\n",
|
|
"||- s5 ltg, probabilmente logaritmo del livello di trigliceridi nel siero\n",
|
|
"||- s6 glu, livello di zucchero nel sangue|\n",
|
|
"\n",
|
|
"> 🎓 Ricorda, questo è apprendimento supervisionato, e abbiamo bisogno di un target denominato 'y'.\n",
|
|
"\n",
|
|
"Prima di poter manipolare i dati con R, è necessario importare i dati nella memoria di R o stabilire una connessione ai dati che R possa utilizzare per accedervi in remoto.\n",
|
|
"\n",
|
|
"> Il pacchetto [readr](https://readr.tidyverse.org/), che fa parte del Tidyverse, offre un modo rapido e intuitivo per leggere dati rettangolari in R.\n",
|
|
"\n",
|
|
"Ora, carichiamo il dataset sul diabete fornito in questo URL sorgente: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Inoltre, eseguiremo un controllo di base sui nostri dati utilizzando `glimpse()` e mostreremo le prime 5 righe con `slice()`.\n",
|
|
"\n",
|
|
"Prima di procedere, introduciamo anche qualcosa che incontrerai spesso nel codice R 🥁🥁: l'operatore pipe `%>%`\n",
|
|
"\n",
|
|
"L'operatore pipe (`%>%`) esegue operazioni in sequenza logica passando un oggetto a una funzione o a un'espressione di chiamata. Puoi pensare all'operatore pipe come a dire \"e poi\" nel tuo codice.\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()` ci mostra che questi dati contengono 442 righe e 11 colonne, con tutte le colonne di tipo `double`.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> glimpse() e slice() sono funzioni di [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, parte del Tidyverse, è una grammatica per la manipolazione dei dati che offre un insieme coerente di verbi per affrontare le sfide più comuni nella manipolazione dei dati.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"Ora che abbiamo i dati, concentriamoci su una caratteristica (`bmi`) come obiettivo per questo esercizio. Questo richiederà di selezionare le colonne desiderate. Quindi, come possiamo farlo?\n",
|
|
"\n",
|
|
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ci permette di *selezionare* (e opzionalmente rinominare) colonne in un data frame.\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. Dati di addestramento e test\n",
|
|
"\n",
|
|
"È una pratica comune nell'apprendimento supervisionato *suddividere* i dati in due sottoinsiemi: un set (tipicamente più grande) con cui addestrare il modello e un set più piccolo \"di riserva\" con cui verificare come si è comportato il modello.\n",
|
|
"\n",
|
|
"Ora che abbiamo i dati pronti, possiamo vedere se una macchina può aiutare a determinare una suddivisione logica tra i numeri in questo dataset. Possiamo utilizzare il pacchetto [rsample](https://tidymodels.github.io/rsample/), che fa parte del framework Tidymodels, per creare un oggetto che contiene le informazioni su *come* suddividere i dati, e poi altre due funzioni di rsample per estrarre i set di addestramento e test creati:\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. Addestrare un modello di regressione lineare con Tidymodels\n",
|
|
"\n",
|
|
"Ora siamo pronti per addestrare il nostro modello!\n",
|
|
"\n",
|
|
"In Tidymodels, i modelli vengono specificati utilizzando `parsnip()` definendo tre concetti:\n",
|
|
"\n",
|
|
"- Il **tipo** di modello distingue tra modelli come la regressione lineare, la regressione logistica, i modelli ad albero decisionale e così via.\n",
|
|
"\n",
|
|
"- La **modalità** del modello include opzioni comuni come regressione e classificazione; alcuni tipi di modelli supportano entrambe le modalità, mentre altri ne hanno solo una.\n",
|
|
"\n",
|
|
"- Il **motore** del modello è lo strumento computazionale che verrà utilizzato per adattare il modello. Spesso si tratta di pacchetti R, come **`\"lm\"`** o **`\"ranger\"`**.\n",
|
|
"\n",
|
|
"Queste informazioni sul modello vengono catturate in una specifica del modello, quindi creiamone una!\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": [
|
|
"Dopo che un modello è stato *specificato*, il modello può essere `stimato` o `addestrato` utilizzando la funzione [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), tipicamente usando una formula e alcuni dati.\n",
|
|
"\n",
|
|
"`y ~ .` significa che adatteremo `y` come quantità/obiettivo previsto, spiegato da tutti i predittori/caratteristiche, cioè `.` (in questo caso, abbiamo solo un predittore: `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": [
|
|
"Dai risultati del modello, possiamo osservare i coefficienti appresi durante l'addestramento. Essi rappresentano i coefficienti della retta di miglior adattamento che ci fornisce l'errore complessivo più basso tra la variabile reale e quella prevista.\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"## 5. Fare previsioni sul set di test\n",
|
|
"\n",
|
|
"Ora che abbiamo addestrato un modello, possiamo utilizzarlo per prevedere la progressione della malattia y per il dataset di test usando [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Questo sarà utilizzato per tracciare la linea tra i gruppi di dati.\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": [
|
|
"Evviva! 💃🕺 Abbiamo appena addestrato un modello e lo abbiamo utilizzato per fare previsioni!\n",
|
|
"\n",
|
|
"Quando si effettuano previsioni, la convenzione di tidymodels è di produrre sempre un tibble/data frame di risultati con nomi di colonne standardizzati. Questo rende facile combinare i dati originali e le previsioni in un formato utilizzabile per operazioni successive, come la creazione di grafici.\n",
|
|
"\n",
|
|
"`dplyr::bind_cols()` unisce in modo efficiente più data frame per colonna.\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. Tracciare i risultati del modello\n",
|
|
"\n",
|
|
"Ora è il momento di vedere tutto questo visivamente 📈. Creeremo un grafico a dispersione di tutti i valori `y` e `bmi` del set di test, quindi utilizzeremo le previsioni per tracciare una linea nella posizione più appropriata, tra i raggruppamenti di dati del modello.\n",
|
|
"\n",
|
|
"R ha diversi sistemi per creare grafici, ma `ggplot2` è uno dei più eleganti e versatili. Questo ti permette di comporre grafici **combinando componenti indipendenti**.\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": [
|
|
"✅ Pensa un attimo a cosa sta succedendo qui. Una linea retta attraversa molti piccoli punti di dati, ma cosa sta facendo esattamente? Riesci a capire come potresti usare questa linea per prevedere dove un nuovo punto dati, mai visto prima, dovrebbe posizionarsi in relazione all'asse y del grafico? Prova a mettere in parole l'utilità pratica di questo modello.\n",
|
|
"\n",
|
|
"Congratulazioni, hai costruito il tuo primo modello di regressione lineare, hai creato una previsione con esso e l'hai mostrata in un grafico!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zrPtHIxx_tNI"
|
|
}
|
|
},
|
|
{
|
|
"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"
|
|
]
|
|
}
|
|
]
|
|
} |