PrecisionRecall

Calcola i valori per costruire una curva di precisione-richiamo. Analogamente a ClassificationScore, questo metodo viene applicato al vettore dei valori reali.

bool vector::PrecisionRecall(
   const matrix&                 pred_scores,   // matrice contenente la distribuzione di probabilità per ogni classe
   const ENUM_ENUM_AVERAGE_MODE  mode           // modalità di calcolo della media
   matrix&                       precision,     // valori di precisione calcolati per ogni valore soglia
   matrix&                       recall,        // valori di richiamo calcolati per ogni valore di soglia
   matrix&                       thresholds,    // Valori di soglia ordinati in ordine decrescente
   );

Parametri

pred_scores

[in] Matrice contenente un insieme di vettori orizzontali con le probabilità per ciascuna classe. Il numero di righe della matrice deve corrispondere alla dimensione del vettore dei valori reali.

mode

[in] Modalità di media dall'enumerazione ENUM_AVERAGE_MODE. Vengono utilizzati solo AVERAGE_NONE, AVERAGE_BINARY e AVERAGE_MICRO.

precision

[out] Matrice con i valori calcolati della curva di precisione. Se non viene applicata la media (AVERAGE_NONE), il numero di righe nella matrice corrisponde al numero di classi del modello. Il numero di colonne corrisponde alla dimensione del vettore dei valori reali (o al numero di righe nella matrice di distribuzione di probabilità pred_score). Nel caso della micro media, il numero di righe nella matrice corrisponde al numero totale dei valori soglia, escludendo i duplicati.

recall

[out] Matrice con i valori calcolati della curva di richiamo.

threshold

[out] Matrice di soglia ottenuta ordinando la matrice di probabilità

 

Note

Vedi note per il metodo ClassificationScore.

Esempio

Un esempio di raccolta di statistiche dal modello mnist.onnx (precisione del 99%).

//-- dati per le metriche di classificazione
   vectorf y_true(images);
   vectorf y_pred(images);
   matrixf y_scores(images,10);

//--- input-output
   matrixf image(28,28);
   vectorf result(10);
 

//-- test
   for(int test=0; test<images; test++)
     {
      image=test_data[test].image;
      if(!OnnxRun(model,ONNX_DEFAULT,image,result))
        {
         Print("OnnxRun error ",GetLastError());
         break;
        }
      result.Activation(result,AF_SOFTMAX);

     //-- raccolta dei dati
      y_true[test]=(float)test_data[test].label;
      y_pred[test]=(float)result.ArgMax();
      y_scores.Row(result,test);
     }    }

 
Calcolo della precisione

   vectorf accuracy=y_pred.ClassificationMetric(y_true,CLASSIFICATION_ACCURACY);
   PrintFormat("accuracy=%f",accuracy[0]);
 
accuracy=0.989000

Un esempio di tracciamento di grafici di precisione-richiamo, dove i valori di precisione sono tracciati sull'asse y e i valori di richiamo sono tracciati sull'asse x. Anche i grafici di precisione e richiamo sono tracciati separatamente, con i valori di soglia tracciati sull'asse x  

   if(y_true.PrecisionRecall(y_scores,AVERAGE_MICRO,mat_precision,mat_recall,mat_thres))
     {
      double precision[],recall[],thres[];
      ArrayResize(precision,mat_thres.Cols());
      ArrayResize(recall,mat_thres.Cols());
      ArrayResize(thres,mat_thres.Cols());
 
      for(uint i=0; i<thres.Size(); i++)
        {
         precision[i]=mat_precision[0][i];
         recall[i]=mat_recall[0][i];
         thres[i]=mat_thres[0][i];
        }
      thres[0]=thres[1]+0.001;
 
      PlotCurve("Precision-Recall curve (micro average)","p-r","",recall,precision);
      Plot2Curves("Precision-Recall (micro average)","precision","recall",thres,precision,recall);
     }

Curve risultanti:

Curva di Precisione-Richiamo

Grafico di Precisione-Richiamo