Sii sicuro dei tuoi modelli di Machine Learning con l’aiuto della Cross-Validation
Cross-Validation assicura la sicurezza dei modelli di Machine Learning
La cross-validation è uno strumento fondamentale per verificare se il tuo modello di machine learning è affidabile al punto da funzionare su nuovi dati. Questo articolo discuterà della cross-validation, dal motivo per cui è necessaria al modo di eseguirla sui tuoi dati.
Overfitting
Valutare il modello di machine learning allenato sui dati di allenamento stessi è fondamentalmente sbagliato. Se fatto, il modello restituirà solo i valori che ha imparato durante l’allenamento. Questa valutazione darà sempre un’accuratezza del 100% e non fornirà alcuna indicazione su quanto buono sarà il modello allenato sui nuovi dati. C’è una grande possibilità che un tale modello si comporti male su nuovi dati. Una condizione del genere, in cui il modello funziona con alta accuratezza sui dati di allenamento ma molto male sui nuovi dati, è nota come overfitting.
Dividere i dati in dati di allenamento e dati di test
Spesso, i dati vengono divisi in due parti per contrastare il problema dell’overfitting e conoscere l’accuratezza effettiva del modello allenato. Queste due parti divise vengono chiamate dati di allenamento e dati di test. I dati di test sono di dimensioni più piccole, circa il 10%-20% dei dati originali.
- Conoscere le diverse misure di performance per il problema di classificazione del Machine Learning
- Esplora intuitivamente le metriche R2 e R2 corretto
- Migliori strumenti di correzione grammaticale AI 2023
L’idea qui è allenare i dati sui dati di allenamento e quindi valutare il modello allenato sui dati di test.
Ma anche in questo approccio c’è una piccola possibilità di overfitting. Prendiamo ad esempio un algoritmo di support vector machine lineare. L’algoritmo di support vector machine ha un parametro ‘C’ che viene utilizzato per la regolarizzazione (ovvero aumentare o diminuire i vincoli sul modello). Si può regolare il valore di ‘C’ per ottenere l’alta accuratezza del modello allenato sui dati di test. Anche questo potrebbe portare al problema dell’overfitting. Un tale modello potrebbe funzionare male in tempo reale dopo il rilascio in produzione poiché è stato adattato per ottenere alte prestazioni sui dati di test nella fase sperimentale anziché migliorare effettivamente l’accuratezza.
Per affrontare meglio il problema dell’overfitting, possiamo dividere i dati in tre parti, ovvero dati di allenamento, dati di convalida e dati di test.
Dividere i dati in dati di allenamento, convalida e dati di test
La divisione dei dati in tre parti ci impedirà di sintonizzare il modello per ottenere un’alta accuratezza nella fase sperimentale.
I dati di allenamento saranno la parte più grande della divisione (circa l’80% dei dati originali). I dati di convalida e i dati di test saranno circa il 10% ciascuno dei dati originali. Si noti che queste percentuali sono solo indicative e possono essere modificate a piacere.
Il modello di machine learning verrà allenato sui dati di allenamento. La valutazione del modello allenato verrà eseguita utilizzando i dati di convalida. E infine, la previsione sui dati di test sarà il nostro modo per verificare quanto bene il modello allenato si comporterà in tempo reale.
Anche se si cerca di sintonizzare il modello per ottenere un’alta accuratezza sui dati di convalida, sapremo se il modello allenato è affidabile o meno grazie alle sue prestazioni sui dati di test.
Anche questo approccio non è privo di svantaggi.
Stiamo dividendo i dati in tre parti, riducendo così i dati che avrebbero potuto essere utilizzati per scopi di allenamento. Dividendo i dati, si potrebbero potenzialmente perdere il 20% dei dati.
Un altro svantaggio di questo approccio è che l’accuratezza del modello sarà diversa in base alle divisioni effettuate. È possibile che una delle divisioni dia un’accuratezza molto buona, mentre una delle altre dia un’accuratezza bassa.
Il metodo della cross-validation viene utilizzato per affrontare questi due svantaggi in modo parziale.
Cross-validation
Nella cross-validation, abbiamo ancora bisogno di avere dati di test ma non è necessario avere dati di convalida.
Prima, dividiamo i dati originali in dati di allenamento e dati di test. E quindi, il modello viene allenato sui dati di allenamento nel seguente modo:
- I dati di allenamento vengono divisi in ‘n’ parti uguali. Chiamiamo ogni divisione da divisione 1 a divisione n.
- Il modello viene allenato su ogni gruppo di ‘n-1’ divisioni possibili. Otterremo n tali gruppi.
- Il modello allenato viene valutato utilizzando la divisione rimanente per ogni gruppo di (n-1) divisioni.
Prendiamo un esempio per capire meglio questo concetto.

Diciamo che dividiamo i dati di addestramento in 5 parti. Ora, troveremo tutti i possibili gruppi di 4 divisioni. Questi gruppi sono mostrati nel diagramma sopra in colore verde. E l’ultima divisione rimanente per ogni gruppo di quattro divisioni è in colore blu nel diagramma sopra.
Per la divisione 1, il modello viene addestrato sul gruppo (Fold2, Fold3, Fold4, Fold5). Dopo l’addestramento, il modello viene valutato su Fold1.
Per la divisione 2, il modello viene addestrato sul gruppo (Fold1, Fold3, Fold4, Fold5). Dopo l’addestramento, il modello viene valutato su Fold2.
Per la divisione 3, il modello viene addestrato sul gruppo (Fold1, Fold2, Fold4, Fold5). Dopo l’addestramento, il modello viene valutato su Fold3.
Per la divisione 4, il modello viene addestrato sul gruppo (Fold1, Fold2, Fold3, Fold5). Dopo l’addestramento, il modello viene valutato su Fold4.
Per la divisione 5, il modello viene addestrato sul gruppo (Fold1, Fold2, Fold3, Fold4). Dopo l’addestramento, il modello viene valutato su Fold5.
Infine, facciamo la media dell’accuratezza di tutte le divisioni per ottenere l’accuratezza finale. Questa accuratezza media sarà la nostra prestazione di validazione. Dal momento che otteniamo l’accuratezza per ciascuna delle divisioni, possiamo anche ottenere la deviazione standard di queste accuratezze.
Possiamo quindi verificare la prestazione del modello addestrato sui parametri utilizzati nella cross-validazione utilizzando i dati di test per una valutazione finale. Chiamiamo questa accuratezza prestazione del test.
Se la prestazione di validazione e la prestazione di test del modello sono buone e confrontabili, allora possiamo considerare il nostro modello affidabile per l’uso in tempo reale.
Eseguire la cross-validazione sui dati utilizzando il metodo cross_val_score di scikit-learn
Utilizziamo il dataset dei fiori iris per la dimostrazione.
## Importazione delle librerie richiesteimport warningswarnings.filterwarnings('ignore')import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_split, cross_val_score, cross_val_predictfrom sklearn.ensemble import RandomForestClassifier## Esecuzione del caricamento dei dati = load_iris()df = pd.DataFrame()df[data.feature_names] = data.datadf['target'] = data.target## Divisione dei dati in feature indipendenti e dipendentiX, y = df.drop('target', axis=1), df['target']## Divisione dei dati in dati di addestramento e dati di testX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)## Valutazione del modello del classificatore random forest utilizzando la cross-validazionerfc = RandomForestClassifier(max_depth=3)cross_validation_score = cross_val_score(rfc, X_train.values, y_train.values, cv=5, scoring = 'accuracy')print(f"Il punteggio della cross-validazione del classificatore random forest è {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
Qui, per il valore ‘cv’ è un intero. Possiamo fornire il valore al parametro ‘cv’ utilizzando iteratori di cross-validazione come KFold e StratifiedKFold.
## Utilizzo dell'iteratore di cross-validazione KFoldfrom sklearn.model_selection import KFoldrfc = RandomForestClassifier(max_depth=3)kf = KFold(n_splits=5)cross_validation_score = cross_val_score(rfc, X_train, y_train, cv=kf, scoring = 'accuracy')print(f"Il punteggio della cross-validazione del classificatore random forest è {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
## Utilizzo dell'iteratore di cross-validazione StratifiedKFoldfrom sklearn.model_selection import StratifiedKFoldrfc = RandomForestClassifier(max_depth=3)skf = StratifiedKFold(n_splits=5)cross_validation_score = cross_val_score(rfc, X_train, y_train, cv=skf, scoring = 'accuracy')print(f"Il punteggio della cross-validazione del classificatore random forest è {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
I dati vengono divisi in proporzioni uguali in dati di addestramento e di test in base alle classi obiettivo quando utilizziamo l’iteratore StratifiedKFold.
Possiamo persino scoprire le previsioni utilizzando il modello addestrato durante la cross-validazione.
## effettuare previsioni utilizzando cross_val_predictfrom sklearn.model_selection import cross_val_predictrfc = RandomForestClassifier(max_depth=3)cv_predictions = cross_val_predict(rfc, X, y, cv=5)print(f"Le previsioni sui dati di test sono: {cv_predictions} (forma: {cv_predictions.shape})")
Utilizzare la cross-validazione con le pipeline di scikit-learn
Eseguiremo una fase di pre-elaborazione dei dati prima di addestrare il modello sui dati. Creiamo una pipeline e quindi troviamo il punteggio di cross-validazione.
from sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerpipe = Pipeline([ ('standardization', StandardScaler()), ('model', RandomForestClassifier(max_depth=3))])cross_validation_score = cross_val_score(pipe, X_train, y_train, cv=5, scoring = 'accuracy')print(f"Il punteggio di cross-validazione del classificatore random forest è {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
Spero che l’articolo vi piaccia. Se avete pensieri sull’articolo, fatemelo sapere. Ogni feedback costruttivo è molto apprezzato.Connettiti con me su LinkedIn. Buona giornata!