Main Content

ROC 曲線とパフォーマンス メトリクス

このトピックでは、受信者動作特性 (ROC) 曲線や ROC 曲線の下の領域 (AUC) などの分類用のパフォーマンス メトリクスについて説明し、バイナリ分類問題とマルチクラス分類問題のパフォーマンス メトリクスの計算に使用できる Statistics and Machine Learning Toolbox™ オブジェクト rocmetrics を紹介します。

ROC 曲線の紹介

ClassificationNaiveBayesClassificationEnsemble などの分類モデルに学習させた後に、アルゴリズムの性能を特定のテスト データ セットで調べることができます。一般的な方法としては、二次損失や精度など、テスト データ セット全体で平均した全体的な性能測定を計算する方法があります。ROC 曲線をプロットしてパフォーマンス メトリクスを計算すると、より詳しく分類器の性能を検査できます。たとえば、分類精度を最大化するしきい値を見つけたり、高感度と高特異度の領域における分類器の性能を評価したりできます。

受信者動作特性 (ROC) 曲線

ROC 曲線は、分類スコアのさまざまなしきい値についての真陽性率 (TPR、感度) と偽陽性率 (FPR、1 - 特異度) の関係を示します。

ROC 曲線の各点は、特定のしきい値についての TPR と FPR の値のペアに対応します。しきい値を変化させてさまざまな TPR と FPR の値のペアを求め、それらのペアを使用して ROC 曲線を作成できます。

マルチクラス分類問題の場合、1 対他の符号化設計を使用し、各クラスの ROC 曲線を求めることができます。1 対他の符号化設計では、マルチクラス分類問題を一連のバイナリ分類問題として扱い、各バイナリ問題において 1 つのクラスが陽性で残りが陰性であると仮定します。

一般に、バイナリ分類器では、スコアが高い方のクラスに観測値を分類します。これは、1 対他のバイナリ分類問題の正の調整スコアに対応します。つまり、分類器は、通常は 0 をしきい値として使用し、観測値が陽性であるか陰性であるかを判定します。たとえば、観測値の調整スコアが 0.2 の場合、しきい値が 0 の分類器は観測値を陽性クラスに割り当てます。しきい値をすべての観測値に適用して TPR と FPR の値のペアを求め、そのペアを ROC 曲線の単一の点として使用できます。ここで、新しいしきい値 0.25 を使用するとします。この場合、しきい値が 0.25 の分類器は、調整スコアが 0.2 の観測値を陰性クラスに割り当てます。新しいしきい値をすべての観測値に適用することにより、新しい TPR と FPR の値のペアを求めることで ROC 曲線の新しい点が得られます。この処理をさまざまなしきい値について繰り返すことで、TPR と FPR の値のペアを求め、それらのペアを使用して ROC 曲線を作成できます。

ROC 曲線の下の領域 (AUC)

ROC 曲線の下の領域 (AUC) は、ROC 曲線の FPR = 0 から FPR = 1 までの FPR に対する積分 (TPR の値) に対応します。

AUC は、可能なすべてのしきい値についての集約した性能測定を提供します。AUC の値は 0 から 1 までの範囲で表され、AUC の値が大きいほど分類器の性能が高いことを示します。

  • 完璧な分類器は、陽性クラスの観測値を陽性クラスに常に正しく割り当て、いずれのしきい値についても真陽性率が 1 になります。したがって、[0,0][0,1]、および [1,1] を通る線は完璧な分類器を表し、AUC の値は 1 になります。

  • ランダムな分類器は、ランダムなスコア値を返し、いずれのしきい値についても偽陽性率と真陽性率の値が同じになります。したがって、ランダムな分類器の ROC 曲線は対角線になり、AUC の値は 0.5 になります。

MATLAB による性能曲線

rocmetrics オブジェクトを作成して、ROC 曲線やその他の性能曲線を計算できます。rocmetrics オブジェクトはバイナリ分類問題とマルチクラス分類問題の両方をサポートし、次のオブジェクト関数が用意されています。

  • plot — ROC 曲線や分類器のその他の性能曲線をプロットします。plot は、各曲線について ROCCurve グラフィックス オブジェクトを返します。オブジェクトのプロパティを変更して各曲線の外観を制御できます。詳細については、ROCCurve のプロパティ を参照してください。

  • average — マルチクラス問題の平均 ROC 曲線のパフォーマンス メトリクスを計算します。

  • addMetrics — 分類の追加のパフォーマンス メトリクスを計算します。

交差検証入力を提供するか入力データをブートストラッピングして、性能曲線の信頼区間を計算することもできます。

分類器に学習させた後、性能曲線を使用して、テスト データで分類器の性能を評価できます。平均二乗誤差、分類誤差、指数損失などのさまざまな測定値は単一の数の分類器の予測力を要約することができます。ただし、性能曲線では分類スコアのさまざまなしきい値で分類器の性能を調べることができるため、性能曲線を使用した方が多くの情報が得られます。

バイナリ分類器の ROC 曲線のプロット

rocmetrics オブジェクトを作成してバイナリ分類問題のパフォーマンス メトリクス (FPR と TPR) を計算し、関数 plot を使用して ROC 曲線をプロットします。

ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子 (X) と、不良 ('b') または良好 ('g') という 351 個の二項反応 (Y) が含まれています。

load ionosphere

データを学習セットとテスト セットに分割します。観測値の約 80% をサポート ベクター マシン (SVM) モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能の検定に使用します。データの分割には cvpartition を使用します。

rng("default") % For reproducibility of the partition
c = cvpartition(Y,Holdout=0.20);
trainingIndices = training(c); % Indices for the training set
testIndices = test(c); % Indices for the test set
XTrain = X(trainingIndices,:);
YTrain = Y(trainingIndices);
XTest = X(testIndices,:);
YTest = Y(testIndices);

SVM 分類モデルに学習させます。

Mdl = fitcsvm(XTrain,YTrain);

テスト セットの分類スコアを計算します。

[~,Scores] = predict(Mdl,XTest);
size(Scores)
ans = 1×2

    70     2

出力 Scores は、702 列のサイズの行列です。Scores の列の順序は Mdl のクラスの順序に従います。Mdl.ClassNames に格納されているクラスの順序を表示します。

Mdl.ClassNames
ans = 2x1 cell
    {'b'}
    {'g'}

YTest の真のラベルと Scores の分類スコアを使用して rocmetrics オブジェクトを作成します。Mdl.ClassNames を使用して Scores の列の順序を指定します。

rocObj = rocmetrics(YTest,Scores,Mdl.ClassNames);

rocObj は、各クラスの AUC の値とパフォーマンス メトリクスが AUC プロパティと Metrics プロパティに格納された rocmetrics オブジェクトです。AUC プロパティを表示します。

rocObj.AUC
ans = 1×2

    0.8587    0.8587

バイナリ分類問題の場合、AUC の値は互いに等しくなります。

Metrics の table には、両方のクラスについてのパフォーマンス メトリクスの値が、クラスの順序に従って垂直方向に連結して格納されます。table から 1 番目のクラスの行を特定し、最初の 8 行を表示します。

idx = strcmp(rocObj.Metrics.ClassName,Mdl.ClassNames(1));
head(rocObj.Metrics(idx,:))
    ClassName    Threshold    FalsePositiveRate    TruePositiveRate
    _________    _________    _________________    ________________

      {'b'}       15.545              0                     0      
      {'b'}       15.545              0                  0.04      
      {'b'}       15.105              0                  0.08      
      {'b'}       11.424              0                  0.16      
      {'b'}       10.077              0                   0.2      
      {'b'}       9.9716              0                  0.24      
      {'b'}       9.9417              0                  0.28      
      {'b'}       9.0338              0                  0.32      

関数 plot を使用して、各クラスの ROC 曲線をプロットします。

plot(rocObj)

Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 5 objects of type roccurve, scatter, line. These objects represent b (AUC = 0.8587), b Model Operating Point, g (AUC = 0.8587), g Model Operating Point.

関数 plot は、各クラスの ROC 曲線をプロットし、モデル操作点に塗りつぶされた円のマーカーを表示します。凡例に各曲線のクラスの名前と AUC の値が表示されます。

バイナリ分類問題では、両方のクラスの ROC 曲線を調べる必要はないことに注意してください。2 つの ROC 曲線は対称であり、AUC の値は同じになります。一方のクラスの TPR はもう一方のクラスの真陰性率 (TNR) であり、TNR は 1-FPR です。したがって、一方のクラスの TPR と FPR のプロットはもう一方のクラスの 1-FPR と 1-TPR のプロットと同じになります。

名前と値の引数 ClassNames を指定して、1 番目のクラスの ROC 曲線のみをプロットします。

plot(rocObj,ClassNames=Mdl.ClassNames(1))

Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 3 objects of type roccurve, scatter, line. These objects represent b (AUC = 0.8587), b Model Operating Point.

マルチクラス分類器の ROC 曲線のプロット

rocmetrics オブジェクトを作成してマルチクラス分類問題のパフォーマンス メトリクス (FPR と TPR) を計算し、関数 plot を使用して各クラスの ROC 曲線をプロットします。plot の名前と値の引数 AverageROCType を指定して、マルチクラス問題の平均 ROC 曲線を作成します。

fisheriris データ セットを読み込みます。行列 meas には、150 種類の花についての測定値が格納されています。ベクトル species には、それぞれの花の種類がリストされています。species には、3 種類の花の名前が格納されています。

load fisheriris

観測値を 3 つのラベルのいずれかに分類する分類木に学習させます。10 分割の交差検証をモデルに対して実行します。

rng("default") % For reproducibility
Mdl = fitctree(meas,species,Crossval="on");

検証分割観測値の分類スコアを計算します。

[~,Scores] = kfoldPredict(Mdl);
size(Scores)
ans = 1×2

   150     3

出力 Scores は、1503 列のサイズの行列です。Scores の列の順序は Mdl のクラスの順序に従います。Mdl.ClassNames に格納されているクラスの順序を表示します。

Mdl.ClassNames
ans = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

species の真のラベルと Scores の分類スコアを使用して rocmetrics オブジェクトを作成します。Mdl.ClassNames を使用して Scores の列の順序を指定します。

rocObj = rocmetrics(species,Scores,Mdl.ClassNames);

rocObj は、各クラスの AUC の値とパフォーマンス メトリクスが AUC プロパティと Metrics プロパティに格納された rocmetrics オブジェクトです。AUC プロパティを表示します。

rocObj.AUC
ans = 1×3

    1.0000    0.9636    0.9636

Metrics の table には、3 つのすべてのクラスについてのパフォーマンス メトリクスの値が、クラスの順序に従って垂直方向に連結して格納されます。table から 2 番目のクラスの行を特定して表示します。

idx = strcmp(rocObj.Metrics.ClassName,Mdl.ClassNames(2));
rocObj.Metrics(idx,:)
ans=13×4 table
      ClassName       Threshold    FalsePositiveRate    TruePositiveRate
    ______________    _________    _________________    ________________

    {'versicolor'}           1              0                    0      
    {'versicolor'}           1           0.01                  0.7      
    {'versicolor'}     0.95455           0.02                  0.8      
    {'versicolor'}     0.91304           0.03                  0.9      
    {'versicolor'}        -0.2           0.04                  0.9      
    {'versicolor'}    -0.33333           0.06                  0.9      
    {'versicolor'}        -0.6           0.08                  0.9      
    {'versicolor'}    -0.86957           0.12                 0.92      
    {'versicolor'}    -0.91111           0.16                 0.96      
    {'versicolor'}    -0.95122           0.31                 0.96      
    {'versicolor'}    -0.95238           0.38                 0.98      
    {'versicolor'}    -0.95349           0.44                 0.98      
    {'versicolor'}          -1              1                    1      

各クラスの ROC 曲線をプロットします。AverageROCType="micro" を指定し、マイクロ平均法を使用して平均 ROC 曲線のパフォーマンス メトリクスを計算します。

plot(rocObj,AverageROCType="micro")

Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 8 objects of type roccurve, scatter, line. These objects represent setosa (AUC = 1), setosa Model Operating Point, versicolor (AUC = 0.9636), versicolor Model Operating Point, virginica (AUC = 0.9636), virginica Model Operating Point, Micro-average (AUC = 0.9788).

塗りつぶされた円のマーカーはモデル操作点を示します。凡例に各曲線のクラスの名前と AUC の値が表示されます。

マルチクラス分類の ROC 曲線

マルチクラス分類器の場合、関数 rocmetrics で各クラスに対する 1 対他の ROC 曲線のパフォーマンス メトリクスを計算し、関数 average で ROC 曲線の平均のメトリクスを計算します。関数 plot を使用して、各クラスの ROC 曲線と平均 ROC 曲線をプロットできます。

1 対他 (OVA) 符号化設計

1 対他 (OVA) 符号化設計は、マルチクラス分類問題を一連のバイナリ分類問題に縮小します。この符号化設計では、各バイナリ分類で 1 つのクラスを陽性として扱い、残りのクラスを陰性として扱います。rocmetrics は、マルチクラス分類に OVA 符号化設計を使用し、各クラスについての性能をそのクラスが陽性であるバイナリ分類を使用して評価します。

たとえば、3 つのクラスに対する OVA 符号化設計では 3 つのバイナリ分類を定式化します。

Binary 1Binary 2Binary 3Class 1111Class 2111Class 3111

各行はクラスに対応し、各列はバイナリ分類問題に対応します。1 番目のバイナリ分類では、クラス 1 が陽性クラスで残りのクラスは陰性であると仮定しています。rocmetrics は、1 番目のクラスについての性能を 1 番目のバイナリ分類問題を使用して評価します。

分類スコアを 2 列の行列として指定した場合、rocmetrics はバイナリ分類問題にも OVA 符号化設計を適用します。rocmetrics は、1 対他のバイナリ分類問題を 2 つ定式化し、そのそれぞれで 1 つのクラスを陽性クラスとして扱い、他のクラスを陰性クラスとして扱います。rocmetrics は、それらの 2 つの ROC 曲線を求めます。そのいずれかを使用してバイナリ分類問題を評価できます。

パフォーマンス メトリクスの平均

平均 ROC 曲線のメトリクスは、関数 average を使用して計算できます。あるいは、関数 plot を使用することで、平均 ROC 曲線のメトリクスを計算してプロットできます。例については、平均 ROC 曲線の特定 (average の例) およびマルチクラス分類器の平均 ROC 曲線のプロット (plot の例) を参照してください。

averageplot は、平均 ROC 曲線を求めるために平均偽陽性率 (FPR) と平均真陽性率 (TPR) を計算する 3 つのアルゴリズムをサポートしています。

  • マイクロ平均 — 1 対他のすべてのバイナリ分類問題を 1 つのバイナリ分類問題に結合し、次のように平均パフォーマンス メトリクスを計算します。

    1. 各バイナリ問題について、rocmetrics オブジェクトの Labels プロパティの値を logical 1 (true) が陽性クラスを示す logical 値に変換します。

    2. 変換されたラベルのベクトルを各バイナリ問題から 1 つずつスタックして単一のベクトルにします。

    3. 分類スコアの調整値 (Scores プロパティ) を含む行列を、行列の列をスタックしてベクトルに変換します。

    4. 結合されたバイナリ問題に対する混同行列の成分について、それぞれのしきい値 (調整スコアのそれぞれの異なる値) に対する値を計算します。混同行列には、真陽性 (TP)、偽陰性 (FN)、偽陽性 (FP)、および真陰性 (TN) のインスタンスの数が格納されます。

    5. 混同行列の成分に基づいて平均の FPR と TPR を計算します。

  • マクロ平均 — 1 対他のすべてのバイナリ分類問題の値を平均して、FPR と TPR の平均値を計算します。

    しきい値、FPR、および TPR の 3 つのメトリクスを使用して、次のように平均値が計算されます。

    1. 固定のメトリクスを特定します。rocmetricsFixedMetric"FalsePositiveRate" または "TruePositiveRate" として指定した場合、関数は指定されたメトリクスを固定にします。それ以外の場合、関数はしきい値を固定にします。

    2. 固定のメトリクスの Metrics プロパティに含まれるすべての異なる値を特定します。

    3. 各バイナリ問題について、他の 2 つのメトリクスの対応する値を特定します。

    4. すべてのバイナリ問題の FPR と TPR の値の平均を計算します。

  • 加重マクロ平均 — マクロ平均アルゴリズムを使用し、事前クラス確率 (Prior プロパティ) を重みとして使用して、FPR と TPR の加重平均値を計算します。

パフォーマンス メトリクス

rocmetrics オブジェクトは、次の組み込みのパフォーマンス メトリクスをサポートしています。

  • 真陽性の数 (TP)

  • 偽陰性の数 (FN)

  • 偽陽性の数 (FP)

  • 真陰性の数 (TN)

  • TP と FP の和

  • 陽性予測率 (RPP)

  • 陰性予測率 (RNP)

  • 精度

  • 真陽性率 (TPR)、再現率、感度

  • 偽陰性率 (FNR)、失敗率

  • 偽陽性率 (FPR)、フォールアウト、1 - 特異度

  • 真陰性率 (TNR)、特異度

  • 陽性予測値 (PPV)、適合率

  • 陰性予測値 (NPR)

  • 予測コスト

rocmetrics は、関数ハンドルとして指定されるカスタム メトリクスもサポートします。詳細については、関数 rocmetrics の名前と値の引数 AdditionalMetrics を参照してください。

rocmetrics は、1 対他の各バイナリ分類問題について、混同行列、スケール ベクトル、および誤分類コスト行列を使用して、さまざまなしきい値に対するパフォーマンス メトリクスの値を計算します。各パフォーマンス メトリクスは混同行列とスケール ベクトルの関数です。また、予測コストは誤分類コスト行列の関数であり、カスタム メトリクスです。

  • 混同行列 — 混同行列には、真陽性 (TP)、偽陰性 (FN)、偽陽性 (FP)、および真陰性 (TN) のインスタンスの数が格納されます。rocmetrics は、各バイナリ問題について、さまざまなしきい値に対する混同行列を計算します。

  • スケール ベクトル — スケール ベクトルは、事前クラス確率と真のラベルのクラス数で定義されます。rocmetrics は、各バイナリ問題について、名前と値の引数 Prior で指定された事前クラス確率と入力引数 Labels で指定された真のラベルから確率とクラスの数を特定します。

  • 誤分類コスト行列 — rocmetrics は、各バイナリ問題について、名前と値の引数 Cost で指定された誤分類コスト行列を値に変換します。

既定では、rocmetrics は、各バイナリ問題について、すべての異なる調整スコアの値をしきい値として使用します。しきい値の詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。

混同行列

混同行列は次のように定義されます。

[TPFNFPTN],

ここで

  • P は "陽性" を意味します。

  • N は "陰性" を意味します。

  • T は "真" を意味します。

  • F は "偽" を意味します。

たとえば、混同行列の 1 列目は、分類器が陽性クラスのインスタンスを識別する方法を定義します。TP は正しく識別された陽性のインスタンスのカウントであり、FN は陰性と誤判別された陽性のインスタンスのカウントです。

rocmetrics は、1 対他の各バイナリ分類について、さまざまなしきい値に対する混同行列を計算します。1 対他のバイナリ分類モデルは、観測値のスコアがしきい値以上である場合に観測値を陽性クラスに分類します。

事前クラス確率

既定では、rocmetrics は、真のラベルのクラス頻度で表される経験的確率を使用します。

rocmetrics は、1 対他の各バイナリ分類について、1 行 K 列の事前確率ベクトル π を 12 列のベクトルに正規化します。ここで、K はクラスの数です。

陽性クラスが k 番目のクラスである k 番目のバイナリ分類の事前確率は [πk,1πk] です。ここで、πk はマルチクラス問題におけるクラス k の事前確率です。

スケール ベクトル

rocmetrics は、1 対他の各バイナリ分類問題について、21 列のサイズのスケール ベクトル sk を定義します。

sk=1πkN+(1πk)P[πkN(1πk)P],

ここで、P と N は、それぞれ陽性クラスと陰性クラスの合計インスタンス数を表します。つまり、P は TP と FN の和、N は FP と TN の和です。sk(1) (sk の 1 番目の要素) と sk(2) (sk の 2 番目の要素) は、それぞれ陽性クラス (k 番目のクラス) と陰性クラス (残り) のスケールです。

rocmetrics は、スケール値を対応するクラスのカウントに乗法係数として適用します。つまり、関数は陽性クラスのカウントに sk(1) を乗算し、陰性クラスのカウントに sk(2) を乗算します。たとえば、k 番目のバイナリ問題の陽性予測値 (PPV = TP/(TP+FP)) を計算する場合、rocmetricsPPV を次のようにスケーリングします。

PPV=sk(1)TPsk(1)TP+sk(2)FP.

誤分類コスト行列

既定では、rocmetrics は、K 行 K 列のコスト行列 C を使用します。ここで、i ~= j の場合は C(i,j) = 1i = j の場合は C(i,j) = 0 です。C(i,j) は、真のクラスが i である場合に点をクラス j に分類するコストです (つまり、行は真のクラス、列は予測クラスに対応します)。

rocmetrics は、1 対他の各バイナリ分類について、K 行 K 列のコスト行列 C を 22 列の行列に正規化します。

Ck=[0costk(N|P)costk(P|N)0].

Ck は、陽性クラスが k 番目のクラスである k 番目のバイナリ分類のコスト行列です。costk(N|P) は陽性クラスを陰性クラスとして誤分類するコストで、costk(P|N) は陰性クラスを陽性クラスとして誤分類するコストです。

クラス k について、πk+ と πk- が次の値をもつ K 行 1 列のベクトルであるとします。

πki+={πiif k=i,0otherwise.πki={0if k=i,πiotherwise.

πki+ と πki- は、それぞれ πk+ と πk- の i 番目の要素です。

陽性クラス (クラス k) の観測値を陰性クラス (残り) に分類するコストは次のようになります。

costk(N|P)=(πk+)Cπk.

同様に、陰性クラスの観測値を陽性クラスに分類するコストは次のようになります。

costk(P|N)=(πk)Cπk+.

分類スコアとしきい値

関数 rocmetrics は、入力分類スコアまたは名前と値の引数 FixedMetricValues からしきい値を決定します。

rocmetrics に対する分類スコアの入力

rocmetrics は、分類スコア (Scores) として、n 行 K 列のサイズの行列または n の長さのベクトルを受け入れます。ここで、n は観測値の数、K はクラスの数です。交差検証データの場合、Scores はベクトルの cell 配列または行列の cell 配列にすることができます。

  • n 行 K 列のサイズの行列 — 分類モデル オブジェクトの関数 predict (ClassificationTreepredict など) の 2 番目の出力引数を使用して Scores を指定します。出力の各行にすべてのクラスの観測値に対する分類スコアが格納され、出力の列の順序は分類モデル オブジェクトの ClassNames プロパティ内のクラスの順序に一致します。バイナリ分類問題とマルチクラス分類問題のどちらでも Scores を行列として指定できます。

    行列の形式を使用する場合、rocmetrics は、各クラスの分類スコアを残りのクラスのスコアとの関係で調整します。具体的には、観測値が与えられたクラスの調整スコアは、そのクラスのスコアと残りのクラスのスコアのうちの最大値との差になります。詳細については、マルチクラス分類問題の調整スコアを参照してください。

  • n の長さのベクトル — 1 つのクラスの分類スコアのみの場合は、ベクトルを使用して Scores を指定します。ベクトル入力は、マルチクラス問題で異なるタイプの調整スコアを使用する場合にも適しています。例として、ABC の 3 つのクラスの問題について考えてみます。C を無視して、クラス AB を分離する性能曲線を計算する場合は、B よりも A を選択してあいまいさに対処する必要があります。スコアの比 s(A)/s(B) またはスコアの差 s(A)–s(B) を使用して、rocmetrics にベクトルを渡すことができます。この方法は、スコアとその正規化の性質により異なる場合があります。

rocmetrics を任意の分類器、もしくは、入力データのインスタンス用に数値スコアを返す任意の関数と併用することができます。

  • 与えられたインスタンスとクラスに対して分類器が高いスコアを返す場合は、そのインスタンスが対応するクラスのものである可能性を示します。

  • 低いスコアは、インスタンスが対応するクラスのものでない可能性を示します。

分類器によっては、スコアを観測値が与えられたクラスのインスタンスを観測する事後確率として解釈できる場合があります。そのようなスコアの例としては、決定木の葉における特定のクラスの観測値の比率があります。この場合、スコアは 0 ~ 1 の範囲に収まり、すべてのクラスのスコアの合計が 1 になります。他の関数は、スコアから事後クラス確率への明確なマッピングがなくても、負の無限大から正の無限大までの範囲でスコアを返すことができます。

rocmetrics は入力スコア範囲にどのような制約も与えません。正規化がないため、いずれの分類関数、回帰関数、近似関数から返されたスコアも rocmetrics を使用して処理できます。rocmetrics では、入力スコアの性質について何も仮定しません。

rocmetrics はスコアを返す分類器での使用を意図しており、予測されたクラスのみを返す分類器のためのものではありません。2 つのクラスをもつデータについて分類ラベル 0 または 1 のみを返す分類器について考えてみます。この場合、分類されたインスタンスを陽性と陰性のカテゴリに一方向にしか分割できないため、性能曲線は単一の点まで減少します。

マルチクラス分類問題の調整スコア

Scores を行列として指定した場合、rocmetrics は、各クラスの分類スコア (rocmetrics の入力引数 Scores) を残りのクラスのスコアとの関係で調整します。具体的には、観測値が与えられたクラスの調整スコアは、そのクラスのスコアと残りのクラスのスコアのうちの最大値との差になります。

たとえば、3 つのクラスの分類問題で Scores の行が [s1,s2,s3] である場合、調整スコアの値は [s1-max(s2,s3),s2-max(s1,s3),s3-max(s1,s2)] になります。

rocmetrics は、各クラスのパフォーマンス メトリクスを調整スコアの値を使用して計算します。

バイナリ分類問題の場合、Scores を 2 列の行列または列ベクトルとして指定できます。分類オブジェクトの関数 predict は分類スコアを行列として返すため、2 列の行列を使用する方が、返される行列を rocmetrics に渡すことができて簡単です。スコアを 2 列の行列として渡すと、rocmetrics はマルチクラス分類のスコアの調整と同じ方法でスコアを調整し、両方のクラスのパフォーマンス メトリクスを計算します。2 つのクラスのうちの一方のメトリクスの値を使用してバイナリ分類問題を評価できます。2 列の行列を渡した場合に rocmetrics から返されるクラスのメトリクスの値は、クラスの分類スコアを列ベクトルとして指定した場合に rocmetrics から返されるメトリクスの値と等しくなります。

モデルの操作点

モデル操作点は、標準のしきい値に対応する FPR と TPR を表します。

標準のしきい値は、rocmetrics オブジェクトの作成時に指定された引数 Scores (分類スコア) の入力形式に応じて次のように決まります。

  • Scores を行列として指定した場合、rocmetricsScores の値がマルチクラス分類問題のスコアであると仮定し、調整スコアの値を使用します。マルチクラス分類モデルでは、スコアが最も高いクラスに観測値を分類します。これは、調整スコアの非負のスコアに対応します。したがって、しきい値は 0 になります。

  • Scores を列ベクトルとして指定した場合、rocmetricsScores の値が ClassNames で指定されたクラスの事後確率であると仮定します。バイナリ分類モデルでは、事後確率が高い方のクラス、つまり事後確率が 0.5 よりも高いクラスに観測値を分類します。したがって、しきい値は 0.5 になります。

バイナリ分類問題の場合、Scores を 2 列の行列または列ベクトルとして指定できます。ただし、分類スコアが事後確率でない場合は、Scores を行列として指定する必要があります。バイナリ分類器では、スコアが高い方のクラスに観測値を分類します。これは、調整スコアが非負になるクラスと等価です。そのため、バイナリ分類器に対して Scores を行列として指定すると、マルチクラス分類器に適用される方式と同じ方式を使用して、rocmetrics で正しいモデル操作点を特定できます。事後確率でない分類スコアをベクトルとして指定した場合は、モデル操作点のしきい値として常に 0.5 が使用されるため、rocmetrics で正しいモデル操作点を識別できません。

関数 plot は、各 ROC 曲線のモデル操作点に塗りつぶされた円のマーカーを表示します (ShowModelOperatingPoint を参照)。関数では標準のしきい値に対応する点が選択されます。曲線に標準のしきい値に対するデータ点がない場合、関数は標準のしきい値より大きい最小のしきい値をもつ点を特定します。曲線上の点は、標準のしきい値の性能と同じ性能を示します。

例については、モデル操作点と最適な操作点の特定を参照してください。

しきい値、固定のメトリクス、固定のメトリクスの値

rocmetrics は、固定のメトリクス (名前と値の引数 FixedMetric) の固定の値 (名前と値の引数 FixedMetricValues) に対応する ROC 曲線と他のメトリクスの値を求め、それらの値を Metrics プロパティに table として格納します。

FixedMetric の既定値は "Thresholds" で、FixedMetricValues の既定値は "all" です。rocmetrics は、各クラスについて、すべての異なる調整スコアの値をしきい値として使用し、それぞれのしきい値に対する混同行列の成分を計算し、混同行列の成分を使用してパフォーマンス メトリクスを計算します。

既定の FixedMetricValues の値 ("all") を使用する場合、既定以外の FixedMetric の値を指定しても、信頼区間を計算するように指定しない限りソフトウェアの動作は変わりません。rocmetrics で信頼区間を計算する場合、FixedMetricFixedMetricValues で固定され、他のメトリクスの信頼区間が計算されます。詳細については、点単位の信頼区間を参照してください。

FixedMetricValues に既定以外の値を指定した場合、rocmetrics は、指定された固定のメトリクスの値 (FixedMetricFixedMetricValues) に対応するしきい値を特定し、そのしきい値を使用して他のパフォーマンス メトリクスの値を計算します。

  • 名前と値の引数 UseNearestNeighborfalse に設定した場合、rocmetrics は、指定された固定のメトリクスの値に対応する厳密なしきい値を使用します。

  • UseNearestNeighbortrue に設定した場合、rocmetrics は、調整スコアから、指定された固定のメトリクスの各値に対応するしきい値に最も近い値を特定します。

Metrics プロパティには、ROC 曲線が原点 (0,0) から始まるように各クラスの最大のしきい値を複製する追加のしきい値が含まれます。この追加のしきい値は、TP = FP = 0 (陽性のインスタンスなし、つまり真陽性のインスタンスと偽陽性のインスタンスがいずれもゼロ) となる "すべて棄却" しきい値を表します。

Metrics には、もう 1 つの特殊なしきい値である "すべて確定" しきい値も含まれます。これは、TN = FN = 0 (陰性のインスタンスなし、つまり真陰性のインスタンスと偽陰性のインスタンスがいずれもゼロ) となる最小のしきい値です。

すべて棄却しきい値では陽性予測値 (PPV = TP/(TP+FP)) が NaN になり、すべて確定しきい値では陰性予測値 (NPV = TN/(TN+FN)) が NaN になることに注意してください。

NaN スコア値

rocmetrics は、分類スコアの入力 (Scores) に含まれる NaN 値を次の 2 つのいずれかの方法で処理します。

  • NaNFlag="omitnan" (既定) を指定した場合、rocmetricsNaN スコアの行を破棄します。

  • NaNFlag="includenan" を指定した場合、rocmetrics は、1 対他の各バイナリ分類について、NaN スコアのインスタンスを各クラスの偽分類カウントに追加します。つまり、どのようなしきい値でも、陽性クラスからの NaN スコアをもつインスタンスは偽陰性 (FN) としてカウントされ、陰性クラスからの NaN スコアをもつインスタンスは偽陽性 (FP) としてカウントされます。真陽性 (TP) のインスタンス数をゼロに設定し、真陰性 (TN) のインスタンス数を総数から陰性クラス内の NaN の数を引いた値に設定することにより、しきい値 1 に対応するメトリクスが計算されます。

陽性クラス内の 2 行と陰性クラス内の 2 行をもつ例を考えてみましょう (各ペアは NaN スコアをもちます)。

真のクラス ラベル分類スコア
陰性0.2
陰性NaN
陽性0.7
陽性NaN

NaN スコアをもつ行を破棄すると (NaNFlag="omitnan")、スコアのしきい値が変わり、rocmetrics はパフォーマンス メトリクスを次の表のように計算します。たとえば、中間行に対応するしきい値 0.5 について、rocmetrics は行 1 と 3 を正しく分類し、行 2 と 4 を省略しています。

しきい値TPFNFPTN
10101
0.51001
01010

NaN スコアをもつ行をそれぞれのクラスの偽のカテゴリに追加すると (NaNFlag="includenan")、rocmetrics はパフォーマンス メトリクスを次の表のように計算します。たとえば、中間行に対応するしきい値 0.5 について、rocmetrics は行 2 と 4 を正しく分類されたものとしてカウントしています。FN 列と FP 列のみがこの 2 つの表で異なることに注意してください。

しきい値TPFNFPTN
10211
0.51111
01120

点単位の信頼区間

rocmetrics は、ブートストラップ標本または交差検証データのいずれかを使用して、AUC の値やスコアのしきい値などのパフォーマンス メトリクスに対する点単位の信頼区間を計算します。これらの値は、オブジェクトの Metrics プロパティと AUC プロパティに格納されます。

  • ブートストラップ — ブートストラッピングを使用して信頼区間を計算するには、名前と値の引数 NumBootstraps を正の整数に設定します。rocmetricsNumBootstraps 個のブートストラップ標本が生成されます。関数は、復元抽出により n 行の入力データから n 個を無作為に選択することで各ブートストラップ標本を作成します。例については、ブートストラッピングを使用した信頼区間の計算を参照してください。

  • 交差検証 — 交差検証を使用して信頼区間を計算するには、真のクラス ラベル (Labels)、分類スコア (Scores)、および観測値の重み (Weights) の交差検証データを cell 配列を使用して指定します。rocmetrics で cell 配列の要素が交差検証分割として扱われます。例については、交差検証入力データを使用した信頼区間の計算を参照してください。

両方のオプションを指定することはできません。AdditionalMetrics でカスタム メトリクスを指定する場合は、信頼区間の計算にブートストラップを使用する必要があります。rocmetrics では、カスタム メトリクスに対する交差検証はサポートしていません。

rocmetrics は、FixedMetric (しきい値、FPR、TPR、または AdditionalMetrics で指定されたメトリクス) を FixedMetricValues で固定し、FixedMetricValues の値に対応する点の AUC や他のメトリクスに対する信頼区間を計算します。

  • しきい値平均 (TA) (FixedMetric"Thresholds" (既定) の場合) — rocmetrics は、固定のしきい値でパフォーマンス メトリクスに対する信頼区間を推定します。関数は固定のしきい値で標本を抽出し、対応するメトリクスの値の平均を計算します。

  • 縦方向平均 (VA) (FixedMetric がパフォーマンス メトリクスの場合) — rocmetrics は、固定のメトリクスの値でしきい値と他のパフォーマンス メトリクスに対する信頼区間を推定します。関数は固定のメトリクスの値で標本を抽出し、対応するしきい値とメトリクスの値の平均を計算します。

AUC の値に対する信頼区間については、関数は FixedMetric"Thresholds""FalsePositiveRate"、または "TruePositiveRate" の場合にのみ推定します。

参照

[1] Fawcett, T. “ROC Graphs: Notes and Practical Considerations for Researchers”, Machine Learning 31, no. 1 (2004): 1–38.

[2] Zweig, M., and G. Campbell. “Receiver-Operating Characteristic (ROC) Plots: A Fundamental Evaluation Tool in Clinical Medicine.” Clinical Chemistry 39, no. 4 (1993): 561–577.

[3] Davis, J., and M. Goadrich. “The Relationship Between Precision-Recall and ROC Curves.” Proceedings of ICML ’06, 2006, pp. 233–240.

[4] Moskowitz, C. S., and M. S. Pepe. “Quantifying and Comparing the Predictive Accuracy of Continuous Prognostic Factors for Binary Outcomes.” Biostatistics 5, no. 1 (2004): 113–27.

[5] Huang, Y., M. S. Pepe, and Z. Feng. “Evaluating the Predictiveness of a Continuous Marker.” U. Washington Biostatistics Paper Series, 2006, 250–61.

[6] Briggs, W. M., and R. Zaretzki. “The Skill Plot: A Graphical Technique for Evaluating Continuous Diagnostic Tests.” Biometrics 64, no. 1 (2008): 250–256.

[7] Bettinger, R. “Cost-Sensitive Classifier Selection Using the ROC Convex Hull Method.” SAS Institute, 2003.

参考

| | | |