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.
| Soglia | Prec. | P.mono | Sensib. |
|---|
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).
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
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]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)).
Costruisci la curva P-S: coppie (Sensibilità((t)), Precisione((t))), ordinate per Sensibilità crescente.
Rendi monotona la Precisione:
\[P_{\text{mono}}[i] = \max_{j \ge i} P[j]\]
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])\]
mAP = media delle AP di tutte le classi. In questa EP c’è solo 1 classe, quindi mAP = AP.
📐 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à.
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):
Successivamente, per tutte le soglie, stampa:
,| 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 |
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, APModifica 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.
| Soglia | Prec. | P.mono | Sensib. |
|---|
%%writefile EP01_03.cpp
// your solutionOverwriting EP01_03.cpp
TestSuite("EP01_03.cpp").run()✔️ EP01_03.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP01_03.cases
🔍 Test di C++: EP01_03.cpp
⚠️ EP01_03.cpp: file vuoto (meno di 3 righe). Test saltati.