Cross-validation: definizione e funzionamento
La cross-validation è una tecnica di valutazione che misura la capacità di un modello di generalizzare su dati nuovi, dividendo più volte i dati disponibili in sottoinsiemi di addestramento e di test. In italiano si chiama convalida incrociata. Serve a stimare l’errore atteso prima di portare il modello in produzione.
Come scegliere la cross-validation giusta
- Cos’è: una procedura che addestra e testa lo stesso modello su partizioni diverse dei dati, invece di un’unica divisione train/test.
- A cosa serve: stima l’errore di generalizzazione e segnala l’overfitting prima che il modello arrivi in produzione.
- Come funziona la variante più usata: la k-fold divide i dati in k parti, ne usa k-1 per addestrare e una per testare, ripetendo il ciclo k volte.
- Tipologie principali: holdout, k-fold, stratified k-fold, leave-one-out, leave-p-out, time series split.
- Come scegliere k: k=5 o k=10 sono i valori più usati; il dataset piccolo spinge verso leave-one-out, quello grande verso k-fold classico.
Cos’è la cross-validation
La cross-validation appartiene alla famiglia delle tecniche statistiche di convalida dei modelli: la differenza rispetto a una verifica statistica generica è che qui il modello viene addestrato e testato più volte su porzioni diverse dello stesso dataset, non su un singolo campione. Il nome italiano, convalida incrociata, descrive proprio questo incrocio: ogni porzione dei dati diventa a turno sia materiale di addestramento sia materiale di verifica.
La differenza con un semplice split train/test è questa: con una sola divisione, il risultato dipende da quali righe sono finite nel test. Un dataset diviso male può far sembrare un modello migliore o peggiore di quanto sia davvero. Ripetendo la divisione più volte e mediando i risultati, la stima diventa più stabile. Quando un modello viene valutato su un’unica porzione di dati, prima di fidarsi del numero conviene verificare come è stato ottenuto.
La tecnica nasce nel contesto più ampio del machine learning, dove un modello impara da esempi passati e deve poi funzionare su casi che non ha mai visto. La cross-validation è il controllo che verifica se quell’apprendimento regge fuori dal dataset di partenza.
A cosa serve la cross-validation
La cross-validation serve a stimare l’errore che un modello commetterà su dati mai visti, prima di metterlo in produzione. Un modello può ottenere un punteggio alto sui dati di addestramento e crollare su dati reali: è il sovradattamento, in gergo overfitting. La cross-validation lo rivela perché confronta le prestazioni ottenute sui dati di training con quelle ottenute sui dati tenuti fuori a ogni iterazione.
Oltre a questo, la tecnica serve a confrontare più modelli o più configurazioni dello stesso algoritmo in modo equo: se due modelli vengono valutati sulle stesse partizioni dei dati, il confronto non dipende da una divisione fortunata. Per chi deve scegliere tra due architetture o tra due impostazioni di un modello, è il metodo con cui prendere la decisione, non a sensazione. Chi lavora su scelte di questo tipo trova utile anche capire come viene costruito un algoritmo di apprendimento, perché la cross-validation entra proprio nella fase in cui l’algoritmo viene regolato sui suoi parametri.
La cross-validation viene usata anche per l’ottimizzazione degli iperparametri: si prova una combinazione di valori, la si valuta con la cross-validation, si tiene quella con l’errore medio più basso. È un ciclo ripetuto, non un calcolo singolo.
Perché testare su dataset di provenienza diversa
Un modello valutato solo con cross-validation sullo stesso dataset può comunque fallire su dati raccolti in condizioni diverse: un sensore diverso, un periodo diverso, una popolazione diversa. Un test su dati provenienti da un’altra fonte verifica in modo più severo la capacità di generalizzazione, perché quei dati non condividono le caratteristiche di raccolta del dataset originale. Se il progetto lo permette, un secondo controllo su dati raccolti altrove è il modo più diretto per sapere se il modello generalizza davvero o se ha solo imparato le abitudini di quella singola raccolta dati.

Come funziona il procedimento k-fold
La k-fold cross-validation divide il dataset in k parti di dimensione simile, chiamate fold, e ripete k volte il ciclo di addestramento e test. I passi sono questi:
- Si divide il dataset in k parti uguali, tipicamente k=5 o k=10.
- Si addestra il modello su k-1 parti e lo si testa sulla parte rimanente.
- Si ripete il passo precedente k volte, cambiando ogni volta la parte usata come test, finché ognuna è stata usata una sola volta.
- Si calcola la media (e spesso la deviazione standard) dei risultati ottenuti nelle k iterazioni per ottenere la stima finale.
Un esempio concreto: con un dataset di 1000 righe e k=5, i dati vengono divisi in cinque blocchi da 200 righe. Nella prima iterazione i blocchi 2-5 addestrano il modello e il blocco 1 lo testa; nella seconda iterazione tocca al blocco 2 fare da test, e così via fino al quinto giro. Alla fine si hanno cinque punteggi, e la media di questi cinque punteggi è la stima che si riporta.
Il fold usato come test in ciascuna iterazione svolge la stessa funzione del validation set in una divisione classica dei dati: una porzione tenuta fuori dall’addestramento per verificare le prestazioni. Quando un progetto prevede anche un tuning ripetuto degli iperparametri, conviene tenere separato un terzo blocco di dati mai toccato nemmeno dalla cross-validation, da usare come test set finale: la logica completa della suddivisione in training, validation e test set è trattata nell’articolo sul funzionamento del machine learning.

Principali tipologie di cross-validation
Esistono più varianti della cross-validation e la scelta dipende dalla dimensione del dataset, dall’equilibrio tra le classi e dalla presenza di una sequenza temporale nei dati.
| Tipologia | Come divide i dati | Quando conviene | Costo computazionale |
|---|---|---|---|
| Holdout | una sola divisione, es. 80% training e 20% test | prototipi veloci, dataset molto grandi | basso |
| K-fold | k parti, ognuna usata una volta come test | caso generale, dataset di dimensione media | medio |
| Stratified k-fold | k parti che mantengono la proporzione delle classi | classificazione con classi sbilanciate | medio |
| Leave-one-out (LOOCV) | ogni singola osservazione è test una volta | dataset molto piccoli | molto alto |
| Leave-p-out | p osservazioni come test, tutte le combinazioni possibili | analisi statistiche su campioni ridotti | alto, cresce rapidamente con p |
| Time series split | blocchi ordinati nel tempo, il passato addestra, il futuro testa | serie storiche e dati sequenziali | medio |
Accanto a queste esiste anche la generalized cross-validation, una variante pensata per modelli di regressione regolarizzata, che stima l’errore senza dover rifare l’addestramento k volte: è una tecnica meno diffusa nei progetti applicativi quotidiani, utile soprattutto in contesti statistici più formali.
Se il dataset è piccolo
Con poche decine o centinaia di righe, una k-fold con k=5 lascia troppo pochi esempi in ogni fold di test. In questi casi preferisco il leave-one-out, anche se richiede un addestramento per ogni singola osservazione: con dataset piccoli il tempo di calcolo resta gestibile.
Se le classi sono sbilanciate
Quando una classe è rara, come in un problema di rilevamento frodi, una k-fold normale rischia di creare fold senza nessun esempio della classe minoritaria. La stratified k-fold evita il problema perché costringe ogni fold a mantenere la stessa proporzione tra le classi presente nel dataset originale.
Se i dati sono temporali
Con serie storiche, mescolare i dati prima di dividerli in fold produce una stima falsamente ottimistica, perché il modello finirebbe per imparare dal futuro per prevedere il passato. La time series split evita questo problema addestrando sempre su un blocco di dati precedente a quello usato per il test. Per gli stessi motivi, i modelli di deep learning più pesanti ricorrono raramente al leave-one-out: il costo di addestrare una rete profonda tante volte quante sono le osservazioni è quasi sempre fuori portata.
Come scegliere il valore di k
La scelta di k è un compromesso tra bias e varianza della stima. Un k piccolo, come 3, lascia pochi fold: ogni addestramento usa meno dati e la stima tende a essere più pessimista (bias più alto). Un k grande, vicino al numero totale di osservazioni, riduce il bias ma rende la stima più sensibile a come sono distribuiti i dati, oltre ad aumentare il tempo di calcolo.
Nella pratica, k=5 o k=10 sono i valori più usati perché trovano un punto di equilibrio accettabile nella maggior parte dei progetti. La mia regola è partire da k=5 quando il dataset è di dimensione media e passare a 10 solo se il tempo di calcolo lo permette e serve una stima più stabile.
La quantità e la qualità dei dati disponibili pesano su questa scelta quanto il valore di k in sé: con pochi dati etichettati, anche la miglior configurazione di cross-validation fatica a dare una stima affidabile, perché ogni fold di test resta troppo piccolo per essere rappresentativo.
Come usare la cross-validation in pratica
In Python, la libreria scikit-learn mette a disposizione funzioni dedicate per ciascuna delle tipologie viste sopra, oltre a strumenti per la grid search, la ricerca sistematica della combinazione di iperparametri che ottiene il punteggio medio migliore nelle iterazioni di cross-validation. La logica resta la stessa a prescindere dal tipo di dato: la cross-validation si applica a modelli su dati tabellari, immagini o testo, incluso l’addestramento di modelli di transformer per compiti di linguaggio, adattando ogni volta la variante alla struttura dei dati. Anche nel rilevamento di oggetti su immagini, dove si usano architetture come YOLO, la cross-validation serve a verificare che il modello riconosca oggetti in scene diverse da quelle su cui è stato addestrato, non solo in quelle del training set.
Errori comuni e data leakage
L’errore più frequente è preparare i dati, per esempio normalizzandoli o selezionando le feature, prima di dividerli in fold. Così facendo, informazioni del fold di test finiscono nel calcolo usato per addestrare il modello: è il data leakage, e produce una stima ottimistica che poi non regge sui dati reali. La regola è semplice da enunciare e facile da dimenticare: ogni trasformazione dei dati va calcolata dentro il ciclo di cross-validation, usando solo i dati del fold di addestramento di quell’iterazione.
Altri errori ricorrenti: usare una k-fold normale su classi sbilanciate invece della variante stratificata, mescolare dati temporali prima di dividerli, e scegliere k senza considerare quanto è piccolo il dataset. Nessuno di questi errori dà un risultato visibilmente sbagliato: il modello sembra funzionare, finché non arriva su dati nuovi.
Domande frequenti sulla cross-validation
Che cos’è la cross-validation?
La cross-validation è una tecnica che addestra e testa lo stesso modello su più partizioni dei dati, invece che su un’unica divisione train/test, per stimare come si comporterà su dati nuovi. In italiano si chiama convalida incrociata.
A cosa serve la cross-validation?
Serve a stimare l’errore di generalizzazione di un modello e a rivelare l’overfitting prima che il modello venga messo in produzione. Si usa anche per confrontare modelli diversi e per ottimizzare gli iperparametri in modo equo.
Come funziona la k-fold cross-validation?
La k-fold divide i dati in k parti, ne usa k-1 per addestrare il modello e una per testarlo, ripetendo il ciclo k volte finché ogni parte è stata usata come test. Il risultato finale è la media dei punteggi ottenuti.
Qual è la differenza tra k-fold e leave-one-out?
Il leave-one-out è un caso particolare di k-fold in cui k è uguale al numero totale di osservazioni: ogni singolo dato diventa test una volta. È più preciso su dataset piccoli ma molto più lento su dataset grandi, perché richiede un addestramento per ogni osservazione.
Come si dice “validation” in italiano?
Validation si traduce con convalida o validazione; la cross-validation si traduce quindi come convalida incrociata, il termine usato anche nella letteratura statistica italiana.
Cos’è il validation set?
Il validation set è la porzione di dati tenuta fuori dall’addestramento e usata per valutare le prestazioni del modello durante lo sviluppo. Nella cross-validation, questo ruolo viene svolto a turno da ciascun fold; per la suddivisione completa in training, validation e test set rimando all’articolo sul funzionamento del machine learning.
Quando conviene usare la time series split?
Conviene usarla quando i dati seguono un ordine temporale, come serie storiche o misurazioni sequenziali: addestrare sempre su un blocco precedente al blocco di test evita che il modello impari dal futuro per prevedere il passato.
Perché testare un modello su dataset provenienti da centri diversi?
Perché un modello valutato solo con cross-validation sullo stesso dataset può comunque fallire su dati raccolti in condizioni diverse, come un sensore o una popolazione differente. Un test su dati provenienti da un’altra fonte verifica la generalizzazione in modo più severo.