Come eseguire la convalida incrociata per le prestazioni del modello in r


In statistica, spesso costruiamo modelli per due motivi:

  • Comprendere la relazione tra una o più variabili predittive e una variabile di risposta.
  • Utilizzare un modello per prevedere le osservazioni future.

La convalida incrociata è utile per stimare quanto bene un modello sia in grado di prevedere le osservazioni future.

Ad esempio, possiamo costruire un modello di regressione lineare multipla che utilizza età e reddito come variabili predittive e lo stato predefinito come variabile di risposta. In questo caso, potremmo voler adattare il modello a un set di dati e quindi utilizzare tale modello per prevedere, in base al reddito e all’età del nuovo richiedente, la probabilità che non riesca a onorare il prestito.

Per determinare se il modello ha una forte capacità predittiva, dobbiamo usarlo per fare previsioni su dati mai visti prima. Questo ci permetterà di stimare l’ errore di previsione del modello.

Utilizzo della convalida incrociata per stimare l’errore di previsione

La convalida incrociata si riferisce a diversi modi in cui possiamo stimare l’errore di previsione. L’approccio generale alla convalida incrociata è:

1. Mettere da parte un certo numero di osservazioni nel set di dati, in genere il 15-25% di tutte le osservazioni.
2. Adattare (o “addestrare”) il modello alle osservazioni che conserviamo nel set di dati.
3. Testare la capacità del modello di fare previsioni sulle osservazioni che non abbiamo utilizzato per addestrare il modello.

Misurare la qualità di un modello

Quando utilizziamo il modello adattato per fare previsioni su nuove osservazioni, possiamo utilizzare diversi parametri per misurare la qualità del modello, tra cui:

R quadrato multiplo: misura la forza della relazione lineare tra le variabili predittive e la variabile di risposta. Un multiplo R quadrato di 1 indica una relazione lineare perfetta mentre un multiplo R quadrato di 0 indica alcuna relazione lineare. Maggiore è il multiplo R quadrato, maggiore è la probabilità che le variabili predittive prevedano la variabile di risposta.

Errore quadratico medio (RMSE): misura l’errore di previsione medio commesso dal modello quando prevede il valore di una nuova osservazione. Questa è la distanza media tra il valore reale di un’osservazione e il valore previsto dal modello. Valori più bassi per RMSE indicano un migliore adattamento del modello.

Errore assoluto medio (MAE): questa è la differenza media assoluta tra il valore reale di un’osservazione e il valore previsto dal modello. Questa metrica è generalmente meno sensibile ai valori anomali rispetto a RMSE. Valori più bassi per MAE indicano un migliore adattamento del modello.

Implementazione di quattro diverse tecniche di convalida incrociata in R

Spiegheremo quindi come implementare le seguenti tecniche di convalida incrociata in R:

1. Approccio dell’insieme di validazione
2. validazione incrociata k-fold
3. Lasciare da parte la convalida incrociata
4. Convalida incrociata k-fold ripetuta

Per illustrare come utilizzare queste diverse tecniche, utilizzeremo un sottoinsieme del set di dati R integrato in mtcars :

 #define dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#view first six rows of new data
head(data)

# mpg disp hp drat
#Mazda RX4 21.0 160 110 3.90
#Mazda RX4 Wag 21.0 160 110 3.90
#Datsun 710 22.8 108 93 3.85
#Hornet 4 Drive 21.4 258 110 3.08
#Hornet Sportabout 18.7 360 175 3.15
#Valiant 18.1 225 105 2.76

Costruiremo un modello di regressione lineare multipla utilizzando disp , hp e drat come variabili predittive e mpg come variabile di risposta.

Approccio dell’insieme di validazione

L’ approccio del set di validazione funziona come segue:

1. Dividere i dati in due insiemi: un insieme viene utilizzato per addestrare il modello (ovvero stimare i parametri del modello) e l’altro insieme viene utilizzato per testare il modello. In genere, il set di addestramento viene generato selezionando casualmente il 70-80% dei dati e il restante 20-30% dei dati viene utilizzato come set di test.

2. Crea il modello utilizzando il set di dati di training.
3. Utilizzare il modello per fare previsioni sui dati del set di test.
4. Misurare la qualità del modello utilizzando parametri come R-squared, RMSE e MAE.

Esempio:

L’esempio seguente utilizza il set di dati definito in precedenza. Per prima cosa dividiamo i dati in
un training set e un test set, utilizzando l’80% dei dati come training set e il restante 20% dei dati come test set. Successivamente, costruiamo il modello utilizzando il set di training. Quindi utilizziamo il modello per fare previsioni sul set di test. Infine, misuriamo la qualità del modello utilizzando R-squared, RMSE e MAE.

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#split the dataset into a training set (80%) and test set (20%).
training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE)

train <- data[training_obs, ]
test <- data[-training_obs, ]

# Build the linear regression model on the training set
model <- lm(mpg ~ ., data = train)

# Use the model to make predictions on the test set
predictions <- model %>% predict(test)

#Examine R-squared, RMSE, and MAE of predictions
data.frame(R_squared = R2(predictions, test$mpg),
           RMSE = RMSE(predictions, test$mpg),
           MAE = MAE(predictions, test$mpg))

#R_squared RMSE MAE
#1 0.9213066 1.876038 1.66614

Quando si confrontano modelli diversi, quello che produce il RMSE più basso sul set di test è il modello preferito.

Vantaggi e svantaggi di questo approccio

Il vantaggio dell’approccio del set di validazione è che è semplice ed efficiente dal punto di vista computazionale. Lo svantaggio è che il modello viene costruito utilizzando solo una parte dei dati totali. Se i dati che lasciamo fuori dal training set contengono informazioni interessanti o preziose, il modello non ne terrà conto.

Approccio di convalida incrociata k-fold

L’ approccio di convalida incrociata k-fold funziona come segue:

1. Dividere casualmente i dati in k “pieghe” o sottoinsiemi (ad esempio, 5 o 10 sottoinsiemi).
2. Addestrare il modello su tutti i dati, tralasciando solo un sottoinsieme.
3. Utilizzare il modello per fare previsioni sui dati del sottoinsieme che è stato escluso.
4. Ripetere questo processo finché ciascuno dei k sottoinsiemi non è stato utilizzato come set di test.
5 . Misurare la qualità del modello facendo la media dei k errori del test. Questo è noto
come errore di convalida incrociata.

Esempio

In questo esempio, dividiamo prima i dati in 5 sottoinsiemi. Quindi adattiamo il modello utilizzando tutti i dati tranne un sottoinsieme. Quindi utilizziamo il modello per fare previsioni sul sottoinsieme che è stato escluso e registriamo l’errore del test (utilizzando R quadrato, RMSE e MAE). Ripetiamo questo processo finché ciascun sottoinsieme non è stato utilizzato come set di test. Quindi calcoliamo semplicemente la media dei 5 errori del test.

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#define the number of subsets (or "folds") to use
train_control <- trainControl(method = "cv", number = 5)

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#Summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Cross-Validated (5 fold) 
#Summary of sample sizes: 26, 25, 26, 25, 26 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.095501 0.7661981 2.467427
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

Vantaggi e svantaggi di questo approccio

Il vantaggio dell’approccio di convalida incrociata k-fold rispetto all’approccio del set di convalida è che costruisce il modello più volte utilizzando pezzi di dati diversi ogni volta, quindi non dobbiamo rischiare di omettere dati importanti durante la costruzione del modello.

La parte soggettiva di questo approccio è scegliere il valore da utilizzare per k, ovvero il numero di sottoinsiemi in cui dividere i dati. In generale, valori k più bassi portano a una distorsione più elevata ma a una variabilità inferiore, mentre valori k più alti portano a una distorsione inferiore ma a una variabilità più elevata.

In pratica, k viene generalmente scelto pari a 5 o 10, perché questo numero di sottoinsiemi tende ad evitare contemporaneamente troppa distorsione e troppa variabilità.

Approccio LOOCV (Leave One Out Cross-Validation).

L’ approccio LOOCV funziona come segue:

1. Costruisci il modello utilizzando tutte le osservazioni tranne una nel set di dati.
2. Utilizzare il modello per prevedere il valore dell’osservazione mancante. Registra l’errore nel testare questa previsione.
3. Ripetere questo processo per ciascuna osservazione nel set di dati.
4. Misurare la qualità del modello calcolando la media di tutti gli errori di previsione.

Esempio

L’esempio seguente dimostra come utilizzare perform LOOCV per lo stesso set di dati utilizzato negli esempi precedenti:

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#specify that we want to use LOOCV
train_control <- trainControl( method = "LOOCV" )

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Leave-One-Out Cross-Validation 
#Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.168763 0.7170704 2.503544
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

Vantaggi e svantaggi di questo approccio

Il vantaggio di LOOCV è che utilizziamo tutti i punti dati, il che generalmente riduce potenziali distorsioni. Tuttavia, poiché utilizziamo il modello per prevedere il valore di ciascuna osservazione, ciò potrebbe portare a una maggiore variabilità nell’errore di previsione.

Un altro svantaggio di questo approccio è che deve adattarsi a un numero così elevato di modelli che può diventare inefficiente e computazionalmente pesante.

Approccio di convalida incrociata ripetuto k-fold

Possiamo eseguire ripetute validazioni incrociate k-fold semplicemente eseguendo la convalida incrociata k-fold più volte. L’errore finale è l’errore medio del numero di ripetizioni.

L’esempio seguente esegue una convalida incrociata 5 volte, ripetuta 4 volte:

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#define the number of subsets to use and number of times to repeat k-fold CV
train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 )

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Cross-Validated (5 fold, repeated 4 times) 
#Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.176339 0.7909337 2.559131
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

Vantaggi e svantaggi di questo approccio

Il vantaggio dell’approccio di validazione incrociata ripetuta k-fold è che per ogni ripetizione i dati verranno suddivisi in sottoinsiemi leggermente diversi, il che dovrebbe fornire una stima ancora più imparziale dell’errore di previsione del modello. Lo svantaggio di questo approccio è che può essere impegnativo dal punto di vista computazionale poiché dobbiamo ripetere il processo di adattamento del modello più volte.

Come scegliere il numero di pieghe nella convalida incrociata

La parte più soggettiva della convalida incrociata è decidere quante pieghe (ovvero sottoinsiemi) utilizzare. In generale, minore è il numero di pieghe, più distorta è la stima dell’errore, ma meno variabile sarà. Al contrario, maggiore è il numero di pieghe, meno distorte saranno le stime degli errori, ma più variabili saranno.

È anche importante tenere presente il tempo di calcolo. Per ogni piega, dovrai addestrare un nuovo modello e, sebbene si tratti di un processo lento, potrebbe richiedere molto tempo se scegli un numero elevato di pieghe.

In pratica, la convalida incrociata viene solitamente eseguita con 5 o 10 volte, poiché ciò fornisce un buon equilibrio tra variabilità e distorsione, pur essendo efficiente dal punto di vista computazionale.

Come scegliere un modello dopo aver eseguito la convalida incrociata

La convalida incrociata viene utilizzata per valutare l’errore di previsione di un modello. Questo può aiutarci a scegliere tra due o più modelli diversi evidenziando quale modello ha l’errore di previsione più basso (basato su RMSE, R-squared, ecc.).

Dopo aver utilizzato la convalida incrociata per selezionare il modello migliore, utilizziamo tutti i dati disponibili per adattarli al modello scelto. Non utilizziamo le istanze del modello effettivo che abbiamo addestrato durante la convalida incrociata per il nostro modello finale.

Ad esempio, possiamo utilizzare la convalida incrociata 5 volte per determinare quale modello è meglio utilizzare tra due diversi modelli di regressione. Tuttavia, una volta identificato il modello migliore da utilizzare, utilizziamo tutti i dati per adattarli al modello finale. In altre parole, non dimentichiamo nessuna delle pieghe durante la costruzione del modello finale.

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *