EDI+VA · Esercizio di Programmazione

EP01_03 — 📈 Mean Average Precision (mAP) — Curva Precisione-Sensibilità

1.17.3 EP01_03 📈 Mean Average Precision (mAP) — Curva Precisione-Sensibilità

In questa attività valuterai un classificatore binario (es.: rilevamento della deforestazione in immagini satellitari, vedi dgi.inpe.br) tramite la curva Precisione-Sensibilità e la metrica mAP (Mean Average Precision). L’mAP è uno standard in competizioni come COCO (Common Objects in Context) e PASCAL VOC (Visual Object Classes) e nei modelli YOLO (You Only Look Once).

1.17.3.1 🧠 Perché l’mAP è la metrica standard?

Nella EP01_02 hai visto che la scelta della soglia altera significativamente Precisione e Sensibilità. L’mAP (Mean Average Precision) risolve questo problema: valuta il modello su più soglie (ogni soglia deve generare una matrice di confusione diversa) e riassume le prestazioni tramite l’area sotto la curva Precisione-Sensibilità (P-S).

Mentre l’F1‑Score considera un singolo punto di equilibrio, l’mAP considera l’intera curva. Più il valore è vicino a 1,0, migliore è il rilevatore su tutte le soglie e classi (es.: monete da 25, 50 centesimi e 1 euro).

Metrica Cosa riassume Limitazione
F1‑Score Equilibrio P × S su una singola soglia Dipende dalla soglia scelta
AP Area sotto la curva P-S di una classe Valida solo per una classe
mAP Media delle AP su tutte le classi Più complesso da implementare

Riferimenti: Roboflow — mAP · Video esplicativo

1.17.3.2 🔢 Come viene calcolato l’mAP — passo dopo passo

  1. Soglie fisse (usa sempre questa lista):

    limiares = [0.00, 0.09, 0.21, 0.31, 0.39, 0.52, 0.60, 0.71, 0.81, 0.89, 1.00]
  2. Per ogni soglia (t), classifica i campioni: predito = 1 se confiança ≥ t, altrimenti 0.
    Calcola VP, FP, FN, VN e ottieni Precisione((t)) e Sensibilità((t)).

  3. Costruisci la curva P-S: coppie (Sensibilità((t)), Precisione((t))), ordinate per Sensibilità crescente.

  4. Rendi monotona la Precisione:
    \[P_{\text{mono}}[i] = \max_{j \ge i} P[j]\]

  5. Calcola l’AP (area sotto la curva monotona) usando la regola del trapezio (approssimazione più accurata rispetto alla semplice somma di Riemann):
    \[AP = \sum_{i=1}^{m-1} \frac{P_{\text{mono}}[i-1] + P_{\text{mono}}[i]}{2} \cdot (S[i] - S[i-1])\]

  6. mAP = media delle AP di tutte le classi. In questa EP c’è solo 1 classe, quindi mAP = AP.

Nota

📐 Differenza riassunta:
La somma di Riemann approssima l’area tramite rettangoli, potendo sottostimare o sovrastimare. La regola del trapezio usa trapezi, riducendo l’errore considerando la media tra i valori agli estremi dell’intervallo, risultando generalmente più precisa per funzioni continue a tratti, come la curva Precisione-Sensibilità.

1.17.3.3 📋 Compito

Leggi un intero n (quantità di campioni). Poi leggi n righe, ciascuna con: verdade (0 o 1) e confiança (float 0.0–1.0).

Calcola e stampa, per la soglia 0.85 (indice 9 della lista):

  • Matrice di Confusione (VP, FN, FP, VN)
  • Accuratezza, Precisione, Sensibilità e F1‑Score

Successivamente, per tutte le soglie, stampa:

  • Precisioni grezze, Precisioni monotone e Sensibilità, separate da ,
  • mAP finale

1.17.3.4 📌 Importante

  • Soglia fissa per le metriche individuali: 0.85
  • Divisione sicura: se il denominatore è zero, usa 0
  • Formattazione: due cifre decimali
  • Rendi monotona da destra verso sinistra
  • La Figura 1.13 presenta una simulazione di questa domanda

1.17.3.5 📌 Esempio di Esecuzione

Input Output Atteso
7
0 0.94
1 0.80
1 0.69
0 0.67
1 0.30
1 0.15
1 0.15
# MÉTRICHE PER LA SOGLIA 0.85 #
Matrice di Confusione:
VP = 0, FN = 5
FP = 1, VN = 1

Metriche di Valutazione:
Accuratezza: 0.14
Precisione: 0.00
Sensibilità: 0.00
F1-Score: 0.00

# MÉTRICHE PER TUTTE LE SOGLIE #
Precisioni: 0.00, 0.00, 0.00, 0.50, 0.50, 0.50, 0.50, 0.50, 0.60, 0.71, 0.71
Precisioni mon.: 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71, 0.71
Sensibilità: 0.00, 0.00, 0.00, 0.20, 0.40, 0.40, 0.40, 0.40, 0.60, 1.00, 1.00
mAP: 0.71

1.17.3.6 🐍 Suggerimento per calcolare l’AP (con regola del trapezio)

def calcular_AP(verdades, confiancas, limiares):
    m = len(limiares)
    precisoes = [0.0] * m
    sensibilidades = [0.0] * m
    for i in range(m):
        p, s = calcular_metricas(verdades, confiancas, limiares[i])
        precisoes[m-1-i] = p
        sensibilidades[m-1-i] = s
    prec_mono = precisoes.copy()
    for i in range(m-2, -1, -1):
        if prec_mono[i] < prec_mono[i+1]:
            prec_mono[i] = prec_mono[i+1]
    AP = 0.0
    for i in range(1, m):
        # Regola del trapezio: media delle altezze per la base
        area_trapezio = (prec_mono[i-1] + prec_mono[i]) / 2.0
        AP += area_trapezio * (sensibilidades[i] - sensibilidades[i-1])
    return precisoes, prec_mono, sensibilidades, AP
📊 Simulatore EP01_03: Curva Precisione-Sensibilità & mAP mAP & Curva P-S

Modifica i campioni (classe reale e confidenza) oppure scegli uno scenario predefinito per visualizzare la matrice di confusione, la curva P-S e il valore di mAP in tempo reale.

CAMPIONI (CLASSE REALE | CONFIDENZA)
# Vero Confidenza
SOGLIA PER METRICHE INDIVIDUALI
0.85
Soglie: 0.00 · 0.09 · 0.21 · 0.31 · 0.39 · 0.52 · 0.60 · 0.71 · 0.81 · 0.89 · 1.00
METRICHE ALLA SOGLIA 0.85
Pred +
Pred −
Reale +
VP
0
FN
5
Reale −
FP
1
VN
1
Accuratezza
0.14
Precisione
0.00
Sensib.
0.00
F1
0.00
CURVA PRECISIONE-SENSIBILITÀ
mAP = 0.71
Curva P-S Monotonica Area (AP)
Soglia Prec. P.mono Sensib.
Figura 1.13: Simulatore EP01_03: Mean Average Precision (mAP) e Curva P-S
%%writefile EP01_03.py
# la tua soluzione
Overwriting EP01_03.py
TestSuite("EP01_03.py").run()
✔️ EP01_03.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP01_03.cases

🔍 Test di Python: EP01_03.py
⚠️ EP01_03.py: file vuoto (meno di 3 righe). Test saltati.