PrecisionRecall

Berechnen der Werte, mit denen eine Precision-Recall-Kurve erstellt wird. Ähnlich wie ClassificationScore wird diese Methode auf den Vektor mit wahren Werte angewendet.

bool vector::PrecisionRecall(
   const Matrix&                 pred_scores,   // Matrix, die die Wahrscheinlichkeitsverteilung für jede Klasse enthält
   const ENUM_ENUM_AVERAGE_MODE  mode           // Mittelungsmodus
   matrix&                       precision,     // berechnete Präzisionswerte für jeden Schwellenwert
   matrix&                       recall,        // berechnete „Recall“-Werte für jeden Schwellenwert
   matrix&                       thresholds,    // Schwellenwerte in absteigender Reihenfolge sortiert
   );

Parameter

pred_scores

[in]  Eine Matrix, die eine Reihe horizontaler Vektoren mit Wahrscheinlichkeiten für jede Klasse enthält. Die Anzahl der Matrixzeilen muss der Größe des Vektors der wahren Werte entsprechen.

mode

[in]  Der Modus der Durchschnittsermittlung aus der Enumeration ENUM_AVERAGE_MODE. Es werden nur AVERAGE_NONE, AVERAGE_BINARY und AVERAGE_MICRO verwendet.

precision

[out]  Eine Matrix mit den berechneten werten der Präzisionskurve. Wenn keine Mittelung angewendet wird (AVERAGE_NONE), entspricht die Anzahl der Zeilen in der Matrix der Anzahl der Modellklassen.Die Anzahl der Spalten entspricht der Größe des Vektors der wahren Werte (oder der Anzahl der Zeilen in der Wahrscheinlichkeitsverteilungsmatrix pred_score). Bei der Mikromittelung entspricht die Anzahl der Zeilen in der Matrix der Gesamtzahl der Schwellenwerte, ohne Duplikate.

recall

[out]  Eine Matrix mit berechneten Werten der „Reacll-“-Kurve.

threshold

[out]  Schwellenwertmatrix, die durch Sortieren der Wahrscheinlichkeitsmatrix erhalten wird.

 

Hinweis

Siehe die Hinweise zur Methode ClassificationScore.

Beispiel

Ein Beispiel für das Sammeln von Statistiken aus dem Modell mnist.onnx (99 % Genauigkeit).

//--- Daten für Klassifizierungsmetriken
   vectorf y_true(images);
   vectorf y_pred(images);
   matrixf y_scores(images,10);

//--- Ein- und Ausgabe
   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);

     //--- Erheben der Daten
      y_true[test]=(float)test_data[test].label;
      y_pred[test]=(float)result.ArgMax();
      y_scores.Row(result,test);
     }    }

 
Berechnung der Genauigkeit

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

Ein Beispiel für das Zeichnen des Diagramms von precision-recall, bei dem die Werte von „precision“ auf der y-Achse und die „Recall“-Werte auf der x-Achse aufgetragen werden. Außerdem werden Präzisions- und Recall-Diagramme separat dargestellt, wobei auf der x-Achse Schwellenwerte aufgetragen sind.  

   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);
     }

Resultierende Kurven:

Precision-Recall Kurve

Precision-Recall Diagramm