Dati, analisi e valutazione ML
Una divisione fortunata: come capire se il tuo modello è davvero migliore
Un caso illustrativo: il tuo nuovo modello ottiene 0,87 sul set di test, quello vecchio 0,85. Cambi? Forse. Ma lo scarto di 0,02 potrebbe dipendere da quali righe sono finite per caso nel set di test. Dividi i dati in un altro modo e la classifica potrebbe cambiare. Ecco un modo più attento di guardarci prima che una decisione ne dipenda.
Perché una sola divisione non basta
Una sola divisione tra addestramento e test dà un numero per modello. Quel numero mescola l'abilità del modello e la fortuna della divisione: esempi di test insolitamente facili, oppure una classe rara finita quasi tutta nell'addestramento. Con una sola divisione non puoi separare le due cose, e con dataset piccoli o sbilanciati la fortuna può pesare molto.
Passo 1: ripeti l'esperimento, con uno schema adatto
La validazione incrociata divide i dati in k parti (fold), addestra su k−1 e testa su quella rimanente, poi ruota. La validazione incrociata ripetuta lo fa più volte con mescolamenti diversi, così ogni modello ottiene molti punteggi invece di uno.
Alcuni dettagli contano:
- Usa gli stessi fold per ogni modello. Fold condivisi allineano i dati di valutazione per un confronto appaiato. Quanto un fold difficile pesi su ciascun modello può comunque variare.
- Conserva ogni punteggio, non solo la media. La dispersione descrive quanto variano i punteggi; non è di per sé un intervallo di confidenza sulle prestazioni future.
- Scegli lo schema di divisione adatto ai dati. Le divisioni casuali ordinarie presuppongono che le righe siano intercambiabili. Se uno stesso cliente o azienda compare in molte righe, usa divisioni per gruppi. Se i dati sono ordinati nel tempo, usa divisioni temporali. I fold stratificati mantengono simili le proporzioni tra le classi; non risolvono ogni problema di sbilanciamento e non rendono le righe indipendenti.
Librerie come scikit-learn offrono divisioni stratificate, per gruppi, temporali e ripetute.
Passo 2: fai la domanda che ti interessa
La domanda abituale è "la differenza è statisticamente significativa?". Ha due problemi. Con abbastanza dati, differenze minuscole e inutili diventano "significative". E un risultato non significativo viene spesso letto, a torto, come "i modelli sono uguali".
Una domanda più utile è: quanto è probabile, sotto un modello dichiarato, che A sia migliore di un margine che per noi conta?
Passo 3: un confronto bayesiano con una zona "non conta"
Bayesian-Classifier-Lab usa un t-test bayesiano correlato con una regione di equivalenza pratica (ROPE), secondo Benavoli e colleghi (2017):
- Decidi prima quale differenza è troppo piccola per contare, ad esempio ±0,01 di accuratezza (illustrativo). Quella fascia è la ROPE. Sceglierla è una decisione di business.
- Calcola le differenze appaiate tra i due modelli su ogni fold.
- Tieni conto della sovrapposizione, in modo approssimato. I fold della validazione incrociata condividono dati di addestramento, quindi i loro punteggi sono correlati. Il t-test correlato usa una correlazione euristica ρ = dimensione del test / dimensione totale, legata alla correzione di Nadeau e Bengio (2003), insieme a una distribuzione a priori piatta (non informativa). Questo riduce l'eccesso di sicurezza che nasce dal trattare i fold come indipendenti; non elimina tutta la dipendenza e non garantisce un'incertezza ben calibrata.
- Leggi tre probabilità: che A sia migliore di più della ROPE, che i due siano praticamente equivalenti, e che B sia migliore di più della ROPE. Dipendono dal modello e dalla distribuzione a priori qui sopra. Non sono probabilità misurate di successo per il business.
Poi decidi tenendo presenti le ipotesi. Esempi illustrativi:
- "96% di probabilità che A sia praticamente migliore" supererebbe la soglia di decisione di 0,95 che Bayesian-Classifier-Lab usa di default. Se valga la pena cambiare dipende comunque dai costi e dai rischi del cambio.
- "60% equivalenti, 30% A, 10% B" suggerisce che il nuovo modello probabilmente non vale il cambio.
- "Non concludente" è una risposta ammessa. Prima di raccogliere più dati, verifica che lo schema di divisione non abbia fughe di informazione, problemi di gruppi o di ordine temporale.
Se usi una soglia diversa, dichiarala e spiega perché.
Rendilo riproducibile
La documentazione e il codice di Bayesian-Classifier-Lab descrivono queste pratiche:
- seed casuali fissi, con le impostazioni delle divisioni in un file di configurazione;
- identificativo, punteggio e tempi di ogni fold salvati, così i numeri si possono ricondurre all'origine;
- un registro dell'esecuzione con le versioni del software;
- pre-elaborazione (ad esempio la normalizzazione) adattata dentro ogni fold di addestramento, così i dati di test non trapelano nell'addestramento;
- confronti rifiutati quando gli identificativi dei fold non corrispondono, invece di confrontare in silenzio divisioni diverse.
Sono funzionalità documentate del progetto, non una sua nuova validazione indipendente.
Trappole comuni
- Ottimizzare sui fold riportati. Se gli iperparametri sono stati scelti sugli stessi fold che riporti, i punteggi sono ottimistici. Usa la validazione incrociata annidata o una divisione di validazione separata.
- Confrontare molti modelli e riportare solo il vincitore. Con abbastanza candidati, uno sembra il migliore per caso. Riporta ogni confronto.
- Ignorare la calibrazione. Due modelli con la stessa accuratezza possono dare stime di probabilità molto diverse. Se le decisioni usano le probabilità, verifica anche la calibrazione.
Provalo
Il framework è open source: Bayesian-Classifier-Lab su GitHub. Confronta cinque famiglie di classificatori su dati tabellari puliti e include un dataset dimostrativo sintetico, che mostra il flusso di lavoro e non è una prova su alcun problema reale.
In sintesi
Prima di fidarti di "il modello B batte il modello A":
- Ripeti la divisione con uno schema adatto ai tuoi dati, con gli stessi fold per ogni modello.
- Decidi in anticipo quanto deve essere grande una differenza per contare, e quale probabilità richiedi.
- Riporta le probabilità con le loro ipotesi, compresi "praticamente equivalenti" e "non concludente".
Ti serve un secondo parere su un modello? Offriamo questa valutazione, con verifica della calibrazione e spiegazioni, nel nostro servizio di dati e valutazione ML. Verifica di fattibilità gratuita
Fonti
- Benavoli, A., Corani, G., Demšar, J., Zaffalon, M. (2017). "Time for a Change: a Tutorial for Comparing Multiple Classifiers Through Bayesian Analysis." Journal of Machine Learning Research 18(77):1–36. https://jmlr.org/papers/v18/16-305.html (consultato il 3 ottobre 2026).
- Nadeau, C., Bengio, Y. (2003). "Inference for the Generalization Error." Machine Learning 52:239–281. https://link.springer.com/article/10.1023/A:1024068626366 (consultato il 3 ottobre 2026; abstract e metadati).
- Guida di scikit-learn, "Cross-validation: evaluating estimator performance", https://scikit-learn.org/stable/modules/cross_validation.html (consultato il 3 ottobre 2026).
- README e codice di Bayesian-Classifier-Lab (soglia di decisione predefinita 0,95; correlazione ρ = n_test/n_totale), https://github.com/Foysal-A-Al/Bayesian-Classifier-Lab (consultati il 2–3 ottobre 2026, come verificato da company-senior-researcher).
Diamo forma al tuo prossimo strumento.
Inviaci fino a 3 esempi o descrivi un processo. Ti rispondiamo via email spiegandoti cosa è fattibile e come lo misureremmo.