PrecisionRecall

Calcula os valores para traçar a curva precision-recall. Esse método, assim como o método ClassificationScore, é aplicado a um vetor de valores verdadeiros.

bool vector::PrecisionRecall(
   const matrix&              pred_scores,   // matriz que contém a distribuição de probabilidade para cada classe
   const ENUM_ENUM_AVERAGE_MODE  mode           // modo de cálculo da média
   matrix&                       precision,     // valores de precision calculados para cada valor de limite
   matrix&                       recall,        // valores de recall calculados para cada valor de limite
   matrix&                       thresholds,    // limiares classificados em ordem decrescente
   );

Parâmetros

pred_scores

[in] Matriz que contém um conjunto de vetores horizontais com probabilidades para cada classe. O número de linhas da matriz deve corresponder ao tamanho do vetor de valores reais.

mode

[in]  Modo de cálculo da média a partir da enumeração ENUM_AVERAGE_MODE. São usados apenas AVERAGE_NONE, AVERAGE_BINARY e AVERAGE_MICRO.

precision

[out]  Matriz com valores calculados da curva precision. Se não houver cálculo de média (AVERAGE_NONE), o número de linhas na matriz corresponderá ao número de classes de modelo. O número de colunas corresponde ao tamanho do vetor de valores verdadeiros (ou o número de linhas na matriz de distribuição de probabilidade pred_score). No caso da micro-média, o número de linhas na matriz corresponde ao número total de limites, excluindo as duplas.

recall

[out]  Matriz com valores calculados da curva recall.

threshold

[out]  Matriz de limiar obtida pela classificação da matriz de probabilidade

 

Observação

Consulte as notas sobre o método ClassificationScore.

Exemplo:

Exemplo de coleta de estatísticas do modelo mnist.onnx (99% de precisão).

//--- 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 da precisão

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

Exemplo de geração de gráficos precision-recall, em que os valores de precision são plotados no eixo y e os valores de recall são plotados no eixo x. Assim como a geração de gráficos separados de precision e recall, em que os valores de limite são plotados no eixo 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