ELAI S.r.l.

Due modelli AI differiscono di due punti: ma su quali casi?

Dal 90% al 92%: perché l’accuratezza non basta per confrontare due modelli. Derivazione guidata del test esatto di McNemar con due esempi riproducibili.

Due modelli AI differiscono di due punti: ma su quali casi?

Il numero sul cruscotto nasconde il confronto

Un’impresa confronta due modelli che classificano immagini di componenti. Sullo stesso insieme di 1.000 immagini, A risponde correttamente 900 volte e B 920. B guadagna due punti percentuali: basta per dire che sia un miglioramento affidabile? Per rispondere dobbiamo recuperare un’informazione scomparsa dal cruscotto: B corregge gli errori di A senza introdurne altri, oppure risolve molti casi ma ne peggiora quasi altrettanti? Le percentuali finali possono essere identiche in queste due situazioni, mentre l’evidenza sul confronto cambia molto.

Abstract. Costruiamo due tabelle sintetiche con uguale numerosità e identiche accuratezze marginali, ma diverso numero di casi discordanti. Deriviamo il test esatto di McNemar come confronto binomiale condizionato ai casi in cui un solo modello è corretto. Il primo confronto produce p circa 0,00000191, il secondo circa 0,1565, pur mostrando entrambi un vantaggio osservato di due punti. Spieghiamo cosa significa questa differenza, perché non misura il valore economico del modello e quali ipotesi sono necessarie. Calcoli e figure sono riproducibili; nessun modello è stato addestrato o valutato su dati aziendali.

Due risposte per ogni immagine

Il prerequisito essenziale è capire l’appaiamento. Ogni immagine ha un identificatore, un’etichetta di riferimento e due esiti: corretto oppure errato per A, corretto oppure errato per B. Le due risposte si riferiscono allo stesso caso. Un’immagine difficile può mettere in crisi entrambi, e una facile può essere risolta da entrambi: non abbiamo due esperimenti separati. Definiamo quattro conteggi: a per entrambi corretti, b per solo B corretto, c per solo A corretto, d per entrambi errati. Le lettere sono una convenzione locale: quando si confrontano software o libri va controllato l’orientamento della tabella.

Confrontoa: entrambib: solo Bc: solo Ad: nessuno
I90020080
II820100800

Nel confronto I, B conserva tutte le 900 risposte corrette di A e ne aggiunge 20; entrambi sbagliano sugli altri 80 casi. Nel confronto II, B corregge 100 errori di A ma introduce 80 regressioni su immagini che A risolveva. Il saldo è ancora +20. Sono due popolazioni di esiti costruite appositamente, non due prove realmente eseguite. Il secondo caso, con nessun errore comune, è volutamente estremo: rende visibile l’informazione che le sole percentuali cancellano. Non stiamo suggerendo che questa struttura degli errori sia tipica di modelli reali.

Scriviamo ora ciò che il cruscotto calcola. N è il numero totale di immagini; Acc indica la quota di risposte corrette. La differenza Δ̂, letta “delta stimato”, è l’accuratezza di B meno quella di A. Il conteggio a si cancella nella sottrazione: tutte le vittorie condivise non favoriscono nessuno. Rimane il saldo fra b e c, diviso per N. La differenza vale 0,02, cioè due punti percentuali, non un aumento del 2% relativo. Rispetto a 90%, l’aumento relativo di accuratezza è circa 2,22%; useremo sempre i punti per evitare ambiguità.

N = a + b + c + d Acc(A) = (a + c)/N Acc(B) = (a + b)/N Δ̂ = Acc(B) − Acc(A) = (b − c)/N = 20/1000 = 0.02

Quale domanda statistica stiamo facendo?

La descrizione del campione è certa: nelle tabelle B ha 20 successi in più. L’inferenza riguarda invece una popolazione di casi da cui il campione potrebbe provenire. Chiediamo se i due modelli fissati abbiano la stessa probabilità di successo su quella popolazione. L’ipotesi nulla H₀ esprime questa uguaglianza. Non afferma che producano sempre la stessa risposta, né che sbaglino sulle stesse immagini. Anche due modelli molto diversi possono avere uguale accuratezza complessiva. Il test riguarda la differenza dei tassi, non la somiglianza interna delle architetture.

Assumiamo immagini campionate indipendentemente dalla medesima popolazione di interesse, etichette di riferimento corrette, modelli e soglie fissati prima di osservare questo test. L’indipendenza richiesta è fra coppie di esiti appartenenti a immagini diverse; non fra A e B sulla stessa immagine. Fotogrammi consecutivi del medesimo pezzo, duplicati e molti ritagli quasi identici violano facilmente la prima ipotesi. Un test matematicamente esatto non ripara un protocollo di raccolta sbagliato. Manteniamo queste condizioni esplicite, perché delimitano ciò che il risultato potrà sostenere.

Dai casi discordanti a una moneta ideale

Chiamiamo πb la probabilità, nella popolazione, che solo B sia corretto e πc quella che solo A sia corretto. La differenza fra le accuratezze della popolazione è πb − πc, per lo stesso motivo algebrico visto nei conteggi. H₀ equivale dunque a πb = πc. Se osserviamo un caso discordante, sappiamo già che uno dei due ha vinto: sotto H₀, quale? La probabilità condizionata che il vincitore sia B è πb/(πb + πc), cioè 1/2 quando il denominatore è positivo. Ecco da dove nasce la moneta ideale; non è un’ipotesi che i modelli tirino realmente a sorte.

H₀: πb = πc πb/(πb + πc) = 1/2 m = b + c K | m, H₀ ~ Binomial(m, 1/2)

m è il numero osservato di discordanti, 20 nel confronto I e 180 nel II. K è una variabile casuale: conta quante vittorie di B vedremmo fra m discordanti se H₀ fosse vera. Il suo valore osservato è b. Condizionare su m significa considerare quel numero fissato durante il test. Sotto le ipotesi di campionamento, le possibili direzioni delle vittorie seguono la distribuzione binomiale. L’analogia della moneta vale per queste direzioni condizionate: non descrive la probabilità che un’immagine sia facile, né la probabilità complessiva di un errore.

Costruire il p-value senza una scatola nera

Vogliamo misurare quanto sarebbe insolito un equilibrio delle vittorie almeno così sbilanciato, assumendo H₀. Usiamo un test bilaterale, perché consideriamo deviazioni sia a favore di A sia a favore di B. Per ciascun possibile k, il coefficiente binomiale C(m,k) conta quanti modi esistono di distribuire k vittorie di B su m posizioni; ogni sequenza di direzioni ha probabilità 2⁻ᵐ. Sommiamo la coda fino al conteggio minore fra b e c, poi raddoppiamo per includere la coda simmetrica. Tronchiamo il risultato a uno, perché una probabilità non può superarlo.

P(K = k | m, H₀) = C(m,k) / 2ᵐ p_exact = min[1, 2 × Σ(k=0…min(b,c)) C(m,k) / 2ᵐ]

Nel confronto I abbiamo b = 20 e c = 0. L’estremo osservato è che tutte le 20 vittorie vadano a B. Il test bilaterale conta anche l’estremo opposto, tutte ad A. Le due sequenze hanno probabilità complessiva 2/2²⁰ = 1/524288, circa 0,00000190735. Non è la probabilità che B sia peggiore o che l’ipotesi nulla sia vera. È una probabilità di esiti almeno così estremi, calcolata all’interno del modello nullo e condizionatamente ai 20 casi discordanti. Questa distinzione impedisce di trasformare il p-value in una confidenza sul prodotto.

Nel confronto II il test vede 100 vittorie di B e 80 di A. Sotto H₀ il centro della distribuzione è 90 vittorie per parte; osserviamo dieci vittorie di B sopra quel centro. Sommando le probabilità per K ≤ 80 e K ≥ 100 otteniamo circa 0,156531. Con una soglia di significatività α = 0,05 fissata in anticipo, il primo confronto porta a rifiutare H₀ e il secondo no. Il mancato rifiuto non dimostra uguaglianza: indica che questo test, su questi dati e con questa soglia, non fornisce sufficiente evidenza per respingerla.

Distribuzioni binomiali sotto H₀, condizionate a m discordanti. Le barre rosse appartengono alle due code sommate nel p-value; la linea tratteggiata indica b osservato. Nel pannello I le code sono quasi invisibili sulla scala lineare. Il pannello II mostra l’intervallo centrale 55–125 per leggibilità; il calcolo include tutti i valori 0–180. Aprire l’immagine per ingrandirla.
Distribuzioni binomiali sotto H₀, condizionate a m discordanti. Le barre rosse appartengono alle due code sommate nel p-value; la linea tratteggiata indica b osservato. Nel pannello I le code sono quasi invisibili sulla scala lineare. Il pannello II mostra l’intervallo centrale 55–125 per leggibilità; il calcolo include tutti i valori 0–180. Aprire l’immagine per ingrandirla.

Per leggere la figura, partiamo dal centro azzurro: sono gli esiti più probabili se le direzioni dei discordanti fossero equilibrate. Poi cerchiamo la linea nera. Nel primo pannello cade all’estremo; nel secondo è ancora vicina alla parte centrale della distribuzione. L’altezza di una singola barra non è il p-value: dobbiamo sommare entrambe le code rosse. Le ordinate dei due pannelli hanno scale diverse, quindi non confronteremo direttamente le altezze come se indicassero “quanto è buono B”. Il grafico visualizza il modello del test, non prestazioni misurate.

Perché il numero di regressioni cambia l’incertezza

Possiamo capire la differenza anche senza un test di ipotesi. Per ogni immagine definiamo Dᵢ: vale +1 se vince solo B, −1 se vince solo A e zero se i modelli concordano nel successo o nell’errore. La media di questi valori è proprio Δ̂. Nel confronto I osserviamo venti +1 e nessun −1; nel II cento +1 e ottanta −1. Il saldo resta venti, ma nel secondo caso la somma nasce dalla cancellazione di contributi molto più numerosi. Un diverso campione può modificare più facilmente il saldo quando molte vittorie e molte sconfitte si compensano.

La formula seguente rende quantitativa questa intuizione. Il quadrato Dᵢ² vale uno esattamente sui discordanti, quindi la somma dei quadrati è m. La varianza campionaria delle differenze è [m − NΔ̂²]/(N−1). Dividendo per N e prendendo la radice otteniamo una stima dell’errore standard della differenza media. “Errore standard” descrive qui la variabilità campionaria stimata, non quanti errori di classificazione faccia il modello. Non è il p-value esatto e non useremo questa approssimazione per sostituire il test binomiale appena derivato.

Δ̂ = (Σᵢ Dᵢ)/N Σᵢ Dᵢ² = m s²D = [m − NΔ̂²]/(N − 1) SE(Δ̂) = sqrt[(m/N − Δ̂²)/(N − 1)]

Con gli stessi N = 1.000 e Δ̂ = 0,02, otteniamo un errore standard di circa 0,00443 nel confronto I e 0,01341 nel II: rispettivamente 0,443 e 1,341 punti percentuali. Se fingessimo che le due accuratezze provengano da campioni indipendenti, la formula che ignora l’appaiamento darebbe circa 1,279 punti per entrambi. Perderemmo proprio la differenza che vogliamo capire. L’appaiamento non garantisce sempre un errore standard minore: dipende dalla relazione fra i risultati. Il secondo confronto mostra che ignorarla può anche sottostimare la variabilità.

Un altro confine riguarda l’origine delle 1.000 immagini. Se coincidessero con tutto l’universo che interessa, la differenza su quell’universo sarebbe semplicemente quella osservata: il test non aggiungerebbe nuove immagini. L’inferenza ha senso quando colleghiamo il campione a un processo di generazione di casi futuri o a una popolazione più ampia. Un benchmark pubblico scelto per comodità non rappresenta automaticamente le condizioni di una linea produttiva. Occorre spiegare quale generalizzazione si intende sostenere, quali casi sono esclusi e come sono stati selezionati quelli presenti, anche quando il calcolo numerico è impeccabile.

Esatto non significa universale

Il test esatto somma probabilità binomiali senza ricorrere all’approssimazione chi-quadro. “Esatto” riguarda la distribuzione di riferimento sotto le ipotesi, non la perfezione delle etichette o la certezza della conclusione. Esiste anche la statistica asintotica (b−c)²/(b+c), confrontata con una chi-quadro a un grado di libertà, e una variante con correzione di continuità. Con pochi discordanti l’approssimazione può essere poco soddisfacente. Qui usiamo lo stesso calcolo binomiale in entrambi gli esempi, evitando che una scelta diversa della variante confonda il confronto.

Se m = 0, non osserviamo nessuna discordanza: il codice restituisce p = 1 per convenzione coerente con l’assenza di evidenza direzionale. Non prova che i modelli saranno identici su ogni immagine futura. Inoltre la discrezione della distribuzione conta: non tutti i valori di p sono possibili per un m fissato, e il test esatto può essere conservativo. La soglia del 5% non è una legge naturale; serve una regola dichiarata prima del confronto. Cambiarla dopo aver visto 0,1565 trasformerebbe il protocollo per adattarlo al risultato.

Dalla significatività alla decisione aziendale

Un valore piccolo di p non stabilisce che B meriti il rilascio. Il vantaggio osservato resta due punti in entrambi i casi: bisogna valutarne dimensione, incertezza, costi di inferenza e conseguenze degli errori. Nella qualità industriale, non rilevare un difetto critico e scartare un pezzo conforme possono avere costi molto diversi. L’accuratezza li conta entrambi come errori unitari. Prima di applicare il test occorre decidere se questa metrica risponde davvero alla domanda operativa. Un confronto su perdite pesate richiede un’analisi adatta a quelle perdite, non la sostituzione arbitraria dei conteggi nella formula di McNemar.

Il test riguarda i due modelli già fissati. Se riaddestrassimo A e B con altri dati, semi o iperparametri, potremmo ottenere altri modelli: questa variabilità non è inclusa nei due conteggi. Non stiamo confrontando in generale due algoritmi di apprendimento. Allo stesso modo, scegliere B dopo avere confrontato decine di candidati sul medesimo test richiede di considerare quella selezione. La procedura qui descritta non annulla il problema dei confronti multipli o dell’uso ripetuto del test. Il legame fra domanda, campionamento e conclusione deve rimanere visibile.

Codice riproducibile e risultati da non inventare

Il pacchetto allegato contiene le due tabelle, le distribuzioni nulle complete e il programma che le genera. La funzione exact usa combinazioni intere e Fraction per sommare la coda come numero razionale, convertito in decimale soltanto in uscita. La funzione case ricostruisce accuratezze, discordanti, differenza ed errore standard. Gli assert controllano che le accuratezze coincidano fra i due scenari e che i p-value cadano sui due lati di 0,05. Non usiamo numeri casuali: il seed non è applicabile. Il frammento seguente richiede experiment.py nella stessa cartella estratta.

Una verifica aziendale proposta dovrebbe conservare l’esito di ciascun modello per ciascun caso, non soltanto i totali. Permetterebbe di ispezionare le regressioni, verificare le etichette e collegare i cambiamenti a categorie di errore definite in anticipo. Questo articolo non esegue tale verifica: non abbiamo raccolto immagini, coinvolto operatori o confrontato prodotti EL-AI. La copertina è illustrativa. I risultati qui dimostrati sono relazioni matematiche e calcoli su tabelle sintetiche; il protocollo applicativo resta una proposta da adattare ai dati effettivi.

Due punti non raccontano tutta la storia

La risposta iniziale è dunque concreta: per valutare due modelli sugli stessi casi, le accuratezze finali non bastano. Occorre sapere chi corregge quali errori e quali nuove regressioni introduce. Venti miglioramenti senza regressioni e cento miglioramenti con ottanta regressioni producono lo stesso saldo, ma non la stessa evidenza statistica. Il test esatto rende questa differenza verificabile sotto ipotesi dichiarate. La decisione finale richiede anche il significato operativo degli errori: un buon rapporto di valutazione deve far vedere sia la differenza numerica sia le condizioni che ne rendono credibile l’interpretazione.

Fonte metodologica e limiti della pubblicazione

Consultata la documentazione primaria NIST Dataplot, “McNemar Test”, aggiornata l’11 dicembre 2023: definizione del confronto appaiato, ipotesi, varianti esatta e asintotica. La formulazione sostanziale è l’uguaglianza delle probabilità discordanti; non interpretiamo la parola “independence” presente nel titolo descrittivo della pagina come un test di indipendenza fra i due modelli. Conteggi, spiegazione numerica, codice e figure dell’articolo sono propri esempi didattici. Non riproducono il dataset dimostrativo NIST e non costituiscono ricerca originale o un articolo sottoposto a peer review.

NIST Dataplot — McNemar Test (2023-12-11).

from experiment import case
for label, counts in [('I', (900,20,0,80)), ('II', (820,100,80,0))]:
    r = case(*counts)
    print(label, r['A_accuracy'], r['B_accuracy'], r['discordant'])
    print('exact p', r['exact_p'])
    print('paired SE', r['paired_standard_error'])

Codice, dati e istruzioni · JSON. Calcoli didattici eseguiti con Python 3.14.0; figure con Matplotlib 3.11.2. Analisi con assistenza AI, senza dichiarare peer review o revisione umana. Copertina originale ImageGen, illustrativa: non documenta persone, sedi o installazioni EL-AI. Fonti consultate il 9 ottobre 2026.