PrecisionRecall

値を計算して適合率-再現率曲線を構築します。ClassificationScoreと同様、このメソッドは真の値のベクトルに適用されます。

bool vector::PrecisionRecall(
  const matrix&                 pred_scores,   // 各クラスの確率分布を含む行列
  const ENUM_ENUM_AVERAGE_MODE mode          // 平均化モード
  matrix&                      precision,     // 各閾値に対して計算された精度値
  matrix&                      recall,       // 各閾値に対して計算された再現率
  matrix&                      thresholds,   // 降順に並び替えられた閾値
  );

パラメータ

pred_scores

[in] 各クラスの確率を含む一連の水平ベクトルを含む行列。行列の行数は、真の値のベクトルのサイズに対応する必要があります。

mode

[in] ENUM_AVERAGE_MODE列挙の平均化モード。AVERAGE_NONE、AVERAGE_BINARY、AVERAGE_MICROのみが使用されます。

precision

[out] 計算された精度曲線値を含む行列。平均化が適用されない場合(AVERAGE_NONE)、行列の行数はモデル クラスの数に対応します。列の数は、真の値のベクトルのサイズ(または確率分布行列pred_scoreの行数)に対応します。マイクロ平均化の場合、行列の行数は、重複を除いた閾値の合計数に対応します。

recall

[out] 計算された再現率曲線値を含む行列。

threshold

[out] 確率行列を並び替えて得られた閾値行列。

 

注意事項

ClassificationScoreメソッドの注意事項を参照してください。

mnist.onnxモデルから統計を収集する例(精度99%)。

//--- 分類メトリクスのデータ
  vectorf y_true(images);
  vectorf y_pred(images);
  matrixf y_scores(images,10);

//--- 入力-出力
  matrixf image(28,28);
  vectorf result(10);
 

//--- テスト
  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);

     //--- データ収集
     y_true[test]=(float)test_data[test].label;
     y_pred[test]=(float)result.ArgMax();
     y_scores.Row(result,test);
    }    }

 
精度計算

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

適合率と再現率のグラフをプロットする例。適合率の値がY軸にプロットされ、再現率の値がX軸にプロットされます。また、精度と再現率のグラフは個別にプロットされ、閾値が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);
    }

結果の曲線:

適合率-再現率曲線

適合率-再現率グラフ