PrecisionRecall

Calcula los valores para construir la curva precision-recall. Este método, al igual que el método ClassificationScore, se aplica al vector de valores verdaderos.

bool vector::PrecisionRecall(
   const matrix&                 pred_scores,   // matriz que contiene la distribución de probabilidad de cada clase
   const ENUM_ENUM_AVERAGE_MODE  mode           // modo de promediación
   matrix&                       precision,     // valores precision calculados para cada valor umbral
   matrix&                       recall,        // valores recall calculados para cada valor umbral
   matrix&                       thresholds,    // valores umbral clasificados en orden descendente
   );

Parámetros

pred_scores

[in]  Matriz que contiene un conjunto de vectores horizontales con probabilidades para cada clase. El número de filas de la matriz debe corresponderse con el tamaño del vector de valores verdaderos.

mode

[in]  Modo de promediación de la enumeración ENUM_AVERAGE_MODE. Se usan solo AVERAGE_NONE, AVERAGE_BINARY y AVERAGE_MICRO.

precision

[out]  Matriz con los valores calculados de la curva precision. Si no hay promediación (AVERAGE_NONE), el número de filas de la matriz se corresponderá con el número de clases del modelo. El número de columnas se corresponde con el tamaño del vector de valores verdaderos (o al número de filas de la matriz de distribución de probabilidad pred_score). En caso de micro-promediación, el número de filas de la matriz se corresponderá con el número total de valores umbral excluyendo los dobles.

recall

[out]  Matriz con los valores calculados de la curva recall.

threshold

[out]  Matriz de valores umbral obtenida clasificando la matriz de probabilidades

 

Observación

Consulte las notas para el método ClassificationScore.

Ejemplo

Ejemplo de recopilación de estadísticas del modelo mnist.onnx (precisión 99%).

//--- data for classification metrics
   vectorf y_true(images);
   vectorf y_pred(images);
   matrixf y_scores(images,10);

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

//--- testing
   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);

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

 
Cálculo de la precisión

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

Ejemplo de gráfico precision-recall en el que los valores precision se representan en el eje y, mientras que los valores recall se representan en el eje x. También se obtienen gráficos precision y recall independientes, en los que los valores umbral se representan en el eje 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);
     }

Resultado:

Precision-Recall curve

Precision-Recall graph