Main Content

perfcurve

分類器の出力用の受信者動作特性 (ROC) 曲線または他の性能曲線

説明

[X,Y] = perfcurve(labels,scores,posclass) は、与えられた真のクラスのラベル labels と陽性クラスのラベル posclass を使用して、分類器による予測のベクトル scores について ROC 曲線の XY の座標を返します。性能曲線は plot(X,Y) を使用して可視化できます。

[X,Y,T] = perfcurve(labels,scores,posclass) は、XY の計算値について、分類器のスコアに対するしきい値の配列を返します。

[X,Y,T,AUC] = perfcurve(labels,scores,posclass) は、XY の計算値について、曲線の下の面積を返します。

[X,Y,T,AUC,OPTROCPT] = perfcurve(labels,scores,posclass) は、ROC 曲線の最適な動作点を返します。

[X,Y,T,AUC,OPTROCPT,SUBY] = perfcurve(labels,scores,posclass) は、陰性のサブクラスについて Y の値を返します。

[X,Y,T,AUC,OPTROCPT,SUBY,SUBYNAMES] = perfcurve(labels,scores,posclass) は、陰性クラスの名前を返します。

[___] = perfcurve(labels,scores,posclass,Name,Value) は、1 つ以上の Name,Value ペア引数で指定された追加オプションを使用して、ROC 曲線の座標と前の構文による他の出力引数を返します。

たとえば、陰性クラスのリストの表示、X または Y の基準の変更、交差検証またはブートストラップによる点単位の信頼限界の計算、誤分類コストの指定、信頼限界の並列計算を行うことができます。

すべて折りたたむ

標本データを読み込みます。

load fisheriris

最初の 2 つの特徴のみを予測子変数として使用します。versicolor および virginica という種に対応する測定値のみを使用して、バイナリ分類問題を定義します。

pred = meas(51:end,1:2);

二項応答変数を定義します。

resp = (1:100)'>50;  % Versicolor = 0, virginica = 1

ロジスティック回帰モデルを当てはめます。

mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');

ROC 曲線を計算します。ロジスティック回帰モデルの推定確率をスコアとして使用します。

scores = mdl.Fitted.Probability;
[X,Y,T,AUC] = perfcurve(species(51:end,:),scores,'virginica');

perfcurve はしきい値を配列 T に格納します。

曲線の下の領域を表示します。

AUC
AUC = 0.7918

曲線の下の領域は 0.7918 です。最大の AUC は 1 で、これは完璧な分類器に対応します。AUC の値が大きい場合、分類器の性能が高いことを示します。

ROC 曲線をプロットします。

plot(X,Y)
xlabel('False positive rate') 
ylabel('True positive rate')
title('ROC for Classification by Logistic Regression')

Figure contains an axes object. The axes object with title ROC for Classification by Logistic Regression, xlabel False positive rate, ylabel True positive rate contains an object of type line.

あるいは、rocmetricsオブジェクトを作成してオブジェクト関数plotを使用することで、ROC 曲線を計算してプロットできます。

rocObj = rocmetrics(species(51:end,:),scores,'virginica');
plot(rocObj)

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 virginica (AUC = 0.7918), virginica Model Operating Point.

関数 plot はモデルの動作点に塗りつぶされた円を表示し、凡例には曲線のクラス名と AUC 値が表示されます。

標本データを読み込みます。

load ionosphere

X は、予測子が含まれている 351 行 34 列の実数値の配列です。Y はクラス ラベルの文字配列で、不良なレーダー反射は 'b'、良好なレーダー反射は 'g' というラベルを使用します。

ロジスティック回帰で近似するため、応答の形式を変更します。予測子変数 3 ~ 34 を使用します。

resp = strcmp(Y,'b'); % resp = 1, if Y = 'b', or 0 if Y = 'g' 
pred = X(:,3:34);

ロジスティック回帰モデルを当てはめ、レーダー反射が不良なものである事後確率を推定します。

mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');
score_log = mdl.Fitted.Probability; % Probability estimates

スコアの確率を使用して、標準的な ROC 曲線を計算します。

[Xlog,Ylog,Tlog,AUClog] = perfcurve(resp,score_log,'true');

同じ標本データで SVM 学習器を学習させます。データを標準化します。

mdlSVM = fitcsvm(pred,resp,'Standardize',true);

事後確率 (スコア) を計算します。

mdlSVM = fitPosterior(mdlSVM);
[~,score_svm] = resubPredict(mdlSVM);

score_svm の 2 列目には、不良なレーダー反射の事後確率が格納されています。

SVM モデルのスコアを使用して、標準的な ROC 曲線を計算します。

[Xsvm,Ysvm,Tsvm,AUCsvm] = perfcurve(resp,score_svm(:,mdlSVM.ClassNames),'true');

同じ標本データについて単純ベイズ分類器を当てはめます。

mdlNB = fitcnb(pred,resp);

事後確率 (スコア) を計算します。

[~,score_nb] = resubPredict(mdlNB);

単純ベイズ分類器のスコアを使用して、標準的な ROC 曲線を計算します。

[Xnb,Ynb,Tnb,AUCnb] = perfcurve(resp,score_nb(:,mdlNB.ClassNames),'true');

同じグラフに ROC 曲線をプロットします。

plot(Xlog,Ylog)
hold on
plot(Xsvm,Ysvm)
plot(Xnb,Ynb)
legend('Logistic Regression','Support Vector Machines','Naive Bayes','Location','Best')
xlabel('False positive rate'); ylabel('True positive rate');
title('ROC Curves for Logistic Regression, SVM, and Naive Bayes Classification')
hold off

Figure contains an axes object. The axes object with title ROC Curves for Logistic Regression, SVM, and Naive Bayes Classification, xlabel False positive rate, ylabel True positive rate contains 3 objects of type line. These objects represent Logistic Regression, Support Vector Machines, Naive Bayes.

しきい値が高いと SVM の ROC 値は高くなりますが、通常はレーダー反射が良好または不良であるかの区別については、ロジスティック回帰が優れています。単純ベイズの ROC 曲線は、全般的に他の 2 つの ROC 曲線より下になっています。これは、標本内性能が他の 2 つの分類方法より低下していることを示します。

3 つの分類器すべてについて、曲線の下の領域を比較します。

AUClog
AUClog = 0.9659
AUCsvm
AUCsvm = 0.9489
AUCnb
AUCnb = 0.9393

分類の AUC 尺度は、ロジスティック回帰が最高で単純ベイズが最低です。結果として、この標本データに関してロジスティック回帰の平均的な標本内性能が優れていることを示します。

この例では、ROC 曲線を使用して分類器のカスタム カーネル関数に適しているパラメーター値を決定する方法を示します。

単位円の内部に無作為な点集合を生成します。

rng(1);  % For reproducibility
n = 100; % Number of points per quadrant

r1 = sqrt(rand(2*n,1));                     % Random radii
t1 = [pi/2*rand(n,1); (pi/2*rand(n,1)+pi)]; % Random angles for Q1 and Q3
X1 = [r1.*cos(t1) r1.*sin(t1)];             % Polar-to-Cartesian conversion

r2 = sqrt(rand(2*n,1));
t2 = [pi/2*rand(n,1)+pi/2; (pi/2*rand(n,1)-pi/2)]; % Random angles for Q2 and Q4
X2 = [r2.*cos(t2) r2.*sin(t2)];

予測子変数を定義します。第 1 象限と第 3 象限の点を陽性のクラスとしてラベル付けし、第 2 象限と第 4 象限の点を陰性のクラスとしてラベル付けします。

pred = [X1; X2];
resp = ones(4*n,1);
resp(2*n + 1:end) = -1; % Labels

特徴空間の 2 つの行列を入力として使用し、シグモイド カーネルを使用してグラム行列に変換する関数 mysigmoid.m を作成します。

function G = mysigmoid(U,V)
% Sigmoid kernel function with slope gamma and intercept c
gamma = 1;
c = -1;
G = tanh(gamma*U*V' + c);
end

シグモイド カーネル関数を使用して SVM 分類器に学習させます。データの標準化をお勧めします。

SVMModel1 = fitcsvm(pred,resp,'KernelFunction','mysigmoid',...
				'Standardize',true);
SVMModel1 = fitPosterior(SVMModel1);
[~,scores1] = resubPredict(SVMModel1);

mysigmoid.m 内で gamma = 0.5 に設定し、mysigmoid2.m として保存します。そして、調整したシグモイド カーネルを使用して SVM 分類器に学習をさせます。

function G = mysigmoid2(U,V)
% Sigmoid kernel function with slope gamma and intercept c
gamma = 0.5;
c = -1;
G = tanh(gamma*U*V' + c);
end

SVMModel2 = fitcsvm(pred,resp,'KernelFunction','mysigmoid2',...
				'Standardize',true);
SVMModel2 = fitPosterior(SVMModel2);
[~,scores2] = resubPredict(SVMModel2);

両方のモデルについて ROC 曲線と曲線の下の領域 (AUC) を比較します。

[x1,y1,~,auc1] = perfcurve(resp,scores1(:,2),1);
[x2,y2,~,auc2] = perfcurve(resp,scores2(:,2),1);

ROC 曲線をプロットします。

plot(x1,y1)
hold on
plot(x2,y2)
hold off
legend('gamma = 1','gamma = 0.5','Location','SE');
xlabel('False positive rate'); ylabel('True positive rate');
title('ROC for classification by SVM');

標本内の結果は、ガンマ パラメーターを 0.5 に設定したカーネル関数が優れています。

AUC 尺度を比較します。

auc1
auc2
auc1 =

    0.9518


auc2 =

    0.9985

ガンマを 0.5 に設定した場合の曲線の下の領域は、ガンマを 1 に設定した場合より広くなっています。これも、ガンマ パラメーター値を 0.5 に設定する方が結果が優れていることを示しています。この 2 つのガンマ パラメーター値による分類性能の視覚的な比較については、カスタム カーネルを使用した SVM 分類器の学習を参照してください。

標本データを読み込みます。

load fisheriris

列ベクトル species は、3 種類のアヤメ (setosa、versicolor、virginica) で構成されています。double 行列 meas は、花に関する 4 種類の測定値 (がく片の長さ、がく片の幅、花弁の長さ、花弁の幅) から構成されています。すべての測定値は、センチメートル単位です。

萼弁の長さと幅を予測子変数として使用して、分類木を学習させます。クラス名を指定することをお勧めします。

Model = fitctree(meas(:,1:2),species, ...
    'ClassNames',{'setosa','versicolor','virginica'});

Model に基づいて種のクラス ラベルとスコアを予測します。

[~,score] = resubPredict(Model);

スコアは、あるクラスに観測値 (データ行列の行) が属する事後確率です。score の各列は、'ClassNames' で指定したクラスに対応します。つまり、1 列目は setosa に、2 列目は versicolor に、3 列目は virginica に対応します。

真のクラスのラベル species が与えられた場合について、ある観測値が versicolor に属するという予測の ROC 曲線を計算します。陰性サブクラスの最適な動作点と y の値も計算します。陰性クラスの名前を取得します。

これはマルチクラス問題なので、perfcurve への入力として単純に score(:,2) を指定することはできません。そのようにしても、2 つの陰性クラス (setosa と virginica) のスコアに関する十分な情報は perfcurve に与えられません。この問題は、1 つのクラスのスコアがわかるだけで他のクラスのスコアを決定できるバイナリ分類問題とは異なります。したがって、2 つの陰性クラスのスコアを因子として組み込んだ関数を perfcurve に与えなければなりません。このような関数の 1 つは、1 対他の符号化設計に対応する score(:,2)-max(score(:,1),score(:,3)) です。

diffscore1 = score(:,2) - max(score(:,1),score(:,3));

diffscore の値は、2 番目のクラスを陽性クラス、残りを陰性クラスとして扱うバイナリ問題の分類スコアです。

[X,Y,T,~,OPTROCPT,suby,subnames] = perfcurve(species,diffscore1,'versicolor');

既定の設定では、X は偽陽性率 (フォールアウトまたは 1 - 特異度)、Y は真陽性率 (再現率または感度) です。陽性クラスのラベルは versicolor です。陰性クラスを定義していないので、perfcurve では陽性クラスに属していない観測値が 1 つのクラスに属していると見なされます。この関数では、これらを陰性クラスとして扱います。

OPTROCPT
OPTROCPT = 1×2

    0.1000    0.8000

suby
suby = 12×2

         0         0
    0.1800    0.1800
    0.4800    0.4800
    0.5800    0.5800
    0.6200    0.6200
    0.8000    0.8000
    0.8800    0.8800
    0.9200    0.9200
    0.9600    0.9600
    0.9800    0.9800
      ⋮

subnames
subnames = 1x2 cell
    {'setosa'}    {'virginica'}

ROC 曲線をプロットし、最適な動作点を ROC 曲線に表示します。

plot(X,Y)
hold on
plot(OPTROCPT(1),OPTROCPT(2),'ro')
xlabel('False positive rate') 
ylabel('True positive rate')
title('ROC Curve for Classification by Classification Trees')
hold off

Figure contains an axes object. The axes object with title ROC Curve for Classification by Classification Trees, xlabel False positive rate, ylabel True positive rate contains 2 objects of type line. One or more of the lines displays its values using only markers

最適な動作点に対応するしきい値を求めます。

T((X==OPTROCPT(1))&(Y==OPTROCPT(2)))
ans = 0.2857

virginica を陰性クラスとして指定し、versicolor の ROC 曲線を計算してプロットします。

ここでも、陰性クラスのスコアを因子として組み込んだ関数を perfcurve に与えなければなりません。使用する関数の例は score(:,2)-score(:,3) です。

diffscore2 = score(:,2) - score(:,3);
[X,Y,~,~,OPTROCPT] = perfcurve(species,diffscore2,'versicolor', ...
    'negClass','virginica');
OPTROCPT
OPTROCPT = 1×2

    0.1800    0.8200

figure, plot(X,Y)
hold on
plot(OPTROCPT(1),OPTROCPT(2),'ro')
xlabel('False positive rate') 
ylabel('True positive rate')
title('ROC Curve for Classification by Classification Trees')
hold off

Figure contains an axes object. The axes object with title ROC Curve for Classification by Classification Trees, xlabel False positive rate, ylabel True positive rate contains 2 objects of type line. One or more of the lines displays its values using only markers

あるいは、rocmetricsオブジェクトを使用して ROC 曲線を作成できます。rocmetrics は、マルチクラス問題を一連のバイナリ問題に縮小する 1 対他の符号化設計を使用して、マルチクラスの分類問題をサポートします。各クラスの 1 対他の ROC 曲線をプロットして、各クラスのマルチクラス問題の性能を調べることができます。

rocmetrics オブジェクトを作成してパフォーマンス メトリクスを計算します。真のラベル、分類スコア、およびクラス名を指定します。

rocObj = rocmetrics(species,score,Model.ClassNames);

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

figure
plot(rocObj)

Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 7 objects of type roccurve, scatter, line. These objects represent setosa (AUC = 0.993), setosa Model Operating Point, versicolor (AUC = 0.9358), versicolor Model Operating Point, virginica (AUC = 0.951), virginica Model Operating Point.

関数 plot は各クラスのモデルの動作点に塗りつぶされた円を表示し、凡例には各曲線のクラス名と AUC 値が表示されます。rocmetrics オブジェクト rocObj に格納されたプロパティを使用して、最適動作点を求めることができます。例については、モデル操作点と最適な操作点の特定を参照してください。

標本データを読み込みます。

load fisheriris

列ベクトル species は、3 種類のアヤメ (setosa、versicolor、virginica) で構成されています。double 行列 meas は、花に関する 4 種類の測定値 (がく片の長さ、がく片の幅、花弁の長さ、花弁の幅) から構成されています。すべての測定値は、センチメートル単位です。

最初の 2 つの特徴のみを予測子変数として使用します。versicolor および virginica という種に対応する測定値のみを使用して、バイナリ問題を定義します。

pred = meas(51:end,1:2);

二項応答変数を定義します。

resp = (1:100)'>50;  % Versicolor = 0, virginica = 1

ロジスティック回帰モデルを当てはめます。

mdl = fitglm(pred,resp,'Distribution','binomial','Link','logit');

ブートストラップを使用するサンプリングと縦方向平均化 (VA) によって、真陽性率 (TPR) について点単位の信頼区間を計算します。

[X,Y,T] = perfcurve(species(51:end,:),mdl.Fitted.Probability,...
       'virginica','NBoot',1000,'XVals',[0:0.05:1]);

'NBoot',1000 は、ブートストラップ複製の数を 1000 に設定します。'XVals','All' は、すべてのスコアについて XY および T の値を返し、縦方向平均化を使用してすべての X の値 (偽陽性率) で Y の値 (真陽性率) の平均を計算するよう perfcurve に指定します。XVals を指定しない場合、既定では perfcurve はしきい値平均化を使用して信頼限界を計算します。

点単位の信頼区間をプロットします。

errorbar(X,Y(:,1),Y(:,1)-Y(:,2),Y(:,3)-Y(:,1));
xlim([-0.02,1.02]); ylim([-0.02,1.02]);
xlabel('False positive rate') 
ylabel('True positive rate')
title('ROC Curve with Pointwise Confidence Bounds')
legend('PCBwVA','Location','Best')

Figure contains an axes object. The axes object with title ROC Curve with Pointwise Confidence Bounds, xlabel False positive rate, ylabel True positive rate contains an object of type errorbar. This object represents PCBwVA.

常に偽陽性率 (FPR、この例では X の値) を制御できるとは限りません。このため、しきい値平均化により真陽性率 (TPR) について点単位の信頼区間を計算することが必要な場合があります。

[X1,Y1,T1] = perfcurve(species(51:end,:),mdl.Fitted.Probability,...
    'virginica','NBoot',1000);

'TVals''All' に設定した場合、または 'TVals' または 'Xvals' を設定しなかった場合、perfcurve はすべてのスコアについて XY および T の値を返し、しきい値平均化を使用して XY について点単位の信頼限界を計算します。

信頼限界をプロットします。

figure()
errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));
xlim([-0.02,1.02]); ylim([-0.02,1.02]);
xlabel('False positive rate')
ylabel('True positive rate')
title('ROC Curve with Pointwise Confidence Bounds')
legend('PCBwTA','Location','Best')

Figure contains an axes object. The axes object with title ROC Curve with Pointwise Confidence Bounds, xlabel False positive rate, ylabel True positive rate contains an object of type errorbar. This object represents PCBwTA.

しきい値を固定するように指定し、ROC 曲線を計算します。次に、曲線をプロットします。

[X1,Y1,T1] = perfcurve(species(51:end,:),mdl.Fitted.Probability,...
    'virginica','NBoot',1000,'TVals',0:0.05:1);
figure()
errorbar(X1(:,1),Y1(:,1),Y1(:,1)-Y1(:,2),Y1(:,3)-Y1(:,1));
xlim([-0.02,1.02]); ylim([-0.02,1.02]);
xlabel('False positive rate')
ylabel('True positive rate')
title('ROC Curve with Pointwise Confidence Bounds')
legend('PCBwTA','Location','Best')

Figure contains an axes object. The axes object with title ROC Curve with Pointwise Confidence Bounds, xlabel False positive rate, ylabel True positive rate contains an object of type errorbar. This object represents PCBwTA.

入力引数

すべて折りたたむ

真のクラスのラベル。数値ベクトル、logical ベクトル、文字行列、string 配列、文字ベクトルの cell 配列、または categorical 配列を指定します。詳細は、グループ化変数を参照してください。

例: {'hi','mid','hi','low',...,'mid'}

例: ['H','M','H','L',...,'M']

データ型: single | double | logical | char | string | cell | categorical

何らかの標本データについて分類器が返したスコア。浮動小数点数のベクトルを指定します。scores の要素数は labels の要素数と同じでなければなりません。

データ型: single | double

陽性クラスのラベル。数値スカラー、logical スカラー、文字ベクトル、string スカラー、文字ベクトルが格納されているセル、または categorical スカラーを指定します。陽性クラスは、入力したラベルのメンバーでなければなりません。指定できる posclass の値は、labels の値によって異なります。

labelsposclass
数値ベクトル数値スカラー
logical ベクトルlogical スカラー
文字行列文字ベクトル
string 配列string スカラー
文字ベクトルの cell 配列文字ベクトル、または文字ベクトルが含まれているセル
categorical ベクトル categorical スカラー

たとえば、癌診断問題で悪性腫瘍が陽性クラスの場合、posclass として 'malignant' を指定します。

データ型: single | double | logical | char | string | cell | categorical

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: 'NegClass','versicolor','XCrit','fn','NBoot',1000,'BootType','per' は、versicolor 種を陰性クラス、X 座標の基準として偽陰性、ブートストラップ標本の数として 1000 を指定します。また、百分位数法を使用して点単位の信頼限界を計算することも指定します。

陰性クラスのリスト。'NegClass' と数値配列、categorical 配列、string 配列、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。既定の設定では、perfcurveNegClass'all' に設定し、入力されたラベルの配列に含まれている陽性でないクラスをすべて陰性と見なします。

NegClass が、入力されたラベルの配列に含まれているクラスのサブセットである場合、perfcurve は陽性のクラスにも陰性のクラスにも属していないラベルをもつインスタンスを破棄します。

例: 'NegClass',{'versicolor','setosa'}

データ型: single | double | categorical | char | string | cell

X を計算する基準。'XCrit' と次のいずれかをコンマ区切りのペアとして指定します。

規範説明
tp真陽性インスタンスの数。
fn偽陰性インスタンスの数
fp偽陽性インスタンスの数
tn真陰性インスタンスの数
tp+fp真陽性インスタンスと偽陽性インスタンスの合計
rpp陽性予測の比率
rpp = (tp+fp)/(tp+fn+fp+tn)
rnp陰性予測率
rnp = (tn+fn)/(tp+fn+fp+tn)
accu精度
accu = (tp+tn)/(tp+fn+fp+tn)
tprsens または reca真陽性率、または感度、または再現率
tpr= sens = reca = tp/(tp+fn)
fnr または miss 偽陰性率、または失敗
fnr = miss = fn/(tp+fn)
fpr または fall偽陽性率、またはフォールアウト、または 1 - 特異度
fpr = fall = fp/(tn+fp)
tnr または spec真陰性率、または特異度
tnr = spec = tn/(tn+fp)
ppv または prec陽性の予測値、または精度
ppv = prec = tp/(tp+fp)
npv陰性の予測値
npv = tn/(tn+fn)
ecost期待コスト
ecost = (tp*Cost(P|P)+fn*Cost(N|P)+fp* Cost(P|N)+tn*Cost(N|N))/(tp+fn+fp+tn)
カスタム基準入力引数 (C,scale,cost) があるカスタム定義関数。C は 2 行 2 列の混同行列、scale は 2 行 1 列のクラス スケール配列、cost は 2 行 2 列の誤分類コスト行列です。

注意

2 つの特殊なしきい値 'reject all' および 'accept all' のいずれかにおいて、これらの基準から NaN 値が返される場合があります。

例: 'XCrit','ecost'

Y を計算する基準。'YCrit' と、X と同じ基準オプションのいずれかをコンマ区切りのペアとして指定します。この基準は陽性クラスのスコアの単調関数でなくてもかまいません。

例: 'YCrit','ecost'

X の基準の値。'XVals' と数値配列をコンマで区切りのペアとして指定します。

  • XVals を指定した場合、perfcurveXY を計算し、指定された XVals のみについて Y点単位の信頼限界 (該当する場合) を計算します。

  • XVals を指定しない場合、perfcurveXY およびすべてのスコアの値を既定によって計算します。

メモ

XVals および TVals を同時に設定することはできません。

例: 'XVals',[0:0.05:1]

データ型: single | double | char | string

陽性クラスのスコアのしきい値。'TVals''all' または数値配列をコンマ区切りのペアとして指定します。

  • TVals'all' を設定した場合、またはこの引数を指定せず XVals も指定しなかった場合、perfcurve はすべてのスコアについて XY および T の値を返し、しきい値平均化を使用して XY点単位の信頼限界を計算します。

  • TVals に数値配列を設定した場合、perfcurve は指定されたしきい値に対して XY および T の値を返し、しきい値平均化を使用してこれらのしきい値における XY の点単位の信頼限界を計算します。

メモ

XVals および TVals を同時に設定することはできません。

例: 'TVals',[0:0.05:1]

データ型: single | double | char | string

XVals または TVals で指定された数値ではなく、データ内の最も近い値を使用するためのインジケーター。'UseNearest''on' または 'off' をコンマ区切りのペアとして指定します。

  • 数値の XVals を指定し、UseNearest'on' に設定した場合、perfcurve はデータ内で見つかった最も近い一意な X の値と、対応する Y および T の値を返します。

  • 数値の XVals を指定し、UseNearest'off' に設定した場合、perfcurve は並べ替えた XVals を返します。

  • 交差検証またはブートストラップによって信頼限界を計算する場合、このパラメーターは常に 'off' です。

例: 'UseNearest','off'

perfcurveNaN スコアを処理する方法。'ProcessNaN''ignore' または 'addtofalse' をコンマ区切りのペアとして指定します。

  • ProcessNaN'ignore' の場合、perfcurveNaN スコアが含まれている観測値をデータから削除します。

  • ProcessNaN'addtofalse' の場合、perfcurveNaN スコアが含まれているインスタンスを各クラスの偽分類カウントに追加します。つまり、perfcurve は常に陽性クラスのインスタンスを偽陰性 (FN) として、陰性クラスのインスタンスを偽陽性 (FP) としてカウントします。

例: 'ProcessNaN','addtofalse'

陽性クラスと陰性クラスの事前確率。'Prior''empirical''uniform' または 2 要素の配列をコンマ区切りのペアとして指定します。

Prior'empirical' の場合、perfcurve は事前確率をクラスの頻度から導き出します。

Prior'uniform' の場合、perfcurve はすべての事前確率を同じ値に設定します。

例: 'Prior',[0.3,0.7]

データ型: single | double | char | string

誤分類コスト。'Cost'[Cost(P|P),Cost(N|P);Cost(P|N),Cost(N|N)] を含む 2 行 2 列の行列をコンマ区切りのペアとして指定します。

Cost(N|P) は、陽性クラスを陰性クラスとして誤分類するコストです。Cost(P|N) は、陰性クラスを陽性クラスとして誤分類するコストです。通常は Cost(P|P) = 0 および Cost(N|N) = 0 ですが、perfcurve では正しい分類に対しても非ゼロのコストを指定できます。

例: 'Cost',[0 0.7;0.3 0]

データ型: single | double

信頼限界の有意水準。'Alpha' と 0 ~ 1 のスカラー値から構成されるコンマ区切りのペアとして指定します。perfcurve は、信頼水準 1 - α における 100*(1 - α)% の点単位の信頼限界XYT および AUC について計算します。

例: 'Alpha',0.01 は 99% の信頼限界を指定します。

データ型: single | double

観測値の重み。'Weights' と非負のスカラー値のベクトルをコンマで区切って指定します。このベクトルの要素数は、scores または labels の要素数と同じでなければなりません。

scoreslabels が cell 配列に含まれていて Weights の指定が必要な場合は、重みも cell 配列に格納しなければなりません。この場合、Weights のすべての要素は、対応する scores の要素と同じ数の要素が含まれている数値ベクトルでなければなりません。たとえば、numel(weights{1}) == numel(scores{1}) です。

perfcurve で交差検証を使用して XY および T または信頼限界を計算する場合、観測値の数ではなくこれらの重みが使用されます。

perfcurve でブートストラップを使用して信頼限界を計算する場合、これらの重みは多項分布抽出確率として使用され、N 個の観測値のうち N 個が復元抽出されます。

既定は、1 のベクトル、または各要素が 1 のベクトルである cell 配列です。

データ型: single | double | cell

信頼限界を計算するためのブートストラップ複製の数。'NBoot' と正の整数をコンマ区切りのペアとして指定します。既定値の 0 は、信頼限界を計算しないことを意味します。

perfcurve は信頼限界の計算に交差検証とブートストラップのいずれかを使用できるため、labelsscores が cell 配列の場合、このパラメーターは 0 にしなければなりません。

例: 'NBoot',500

データ型: single | double

bootci で信頼区間を計算するために使用する信頼区間のタイプ。'BootType' と次のいずれかをコンマ区切りのペアとして指定します。

  • 'bca' ― BCa 法 (bias corrected and accelerated percentile method)

  • 'norm または 'normal' ― バイアスと標準誤差をブートストラップした正規近似区間

  • 'per' または 'percentile' ― 百分位数法

  • 'cper' または 'corrected percentile' ― バイアス補正百分位数法

  • 'stud' または 'student' ― スチューデント化された信頼区間

例: 'BootType','cper'

信頼限界を計算するための bootci のオプション入力引数。'BootArg'{'Nbootstd',nbootstd} から構成されるコンマ区切りのペアとして指定します。

スチューデント化されたブートストラップ信頼区間を計算する ('BootType''student') 場合、'BootArg' を使用して bootci の名前と値のペアの引数 'Nbootstd' をさらに指定できます。たとえば、'BootArg',{'Nbootstd',nbootstd} は、nbootstd 個のデータ標本によるブートストラップを使用してブートストラップ統計量の標準誤差を推定します。nbootstd は正の整数であり、既定値は 100 です。

例: 'BootArg',{'Nbootstd',nbootstd}

データ型: cell

信頼区間の計算を制御するオプション。'Options' と、statset が返す構造体配列をコンマ区切りのペアとして指定します。これらのオプションには Parallel Computing Toolbox™ が必要です。perfcurve では、この引数を点単位の信頼限界の計算にのみ使用します。これらの限界を計算するには、labels および scores について cell 配列を渡すか、NBoot に正の整数を設定しなければなりません。

次の表は、使用できるオプションの一覧です。

オプション説明
'UseParallel'
  • false ― 逐次計算 (既定)

  • true ― 並列計算。このオプションを機能させるには、Parallel Computing Toolbox が必要です。

'UseSubstreams'
  • false ― 各反復について別々のサブストリームは使用しません (既定)。

  • true ― 各反復について別々のサブストリームを使用し、再生成可能な方法で計算を実行します。再現性のある計算を行うには、Streams をサブストリームを許可する型、'mlfg6331_64' または 'mrg32k3a' に設定します。

'Streams'

RandStream オブジェクト、またはこのオブジェクトの cell 配列。Streams を指定するときは、次の場合を除いて単一のオブジェクトを使用します。

  • UseParalleltrue

  • UseSubstreamsfalse

これらが真の場合は、並列プールと同じサイズの cell 配列を使用します。並列プールが開いていない場合、Streams は単一の乱数ストリームを提供しなければなりません。

'UseParallel'true'UseSubstreams'false の場合、'Streams' の長さは perfcurve で使用するワーカーの数と等しくなければなりません。並列プールが既に開いている場合、'Streams' の長さは並列プールのサイズになります。並列プールがまだ開いていない場合、インストール状況と基本設定によっては MATLAB® がプールを開く可能性があります。予測結果をより確実にするために、parpool (Parallel Computing Toolbox) を使用し、並列プールを明示的に作成してから perfcurve を呼び出し 'Options',statset('UseParallel',true) を設定します。

例: 'Options',statset('UseParallel',true)

データ型: struct

出力引数

すべて折りたたむ

性能曲線の x 座標。m 行 3 列の行列として返されます。既定の設定では、X の値は偽陽性率 FPR (フォールアウトまたは 1 - 特異度) です。X を変更するには、名前と値のペアの引数 XCrit を使用します。

  • perfcurve点単位の信頼限界を計算しない場合、または縦方向平均化を使用して計算する場合、X はベクトルになります。

  • perfcurve でしきい値平均化を使用して信頼限界を計算する場合、X は m 行 3 列の行列になります。m は固定されたしきい値の数です。X の 1 列目には平均値が格納されます。2 列目には点単位の信頼限界の下限が、3 列目には上限が格納されます。

性能曲線の y 座標。m 行 3 列の行列として返されます。既定の設定では、Y の値は真陽性率 TPR (再現率または感度) です。Y を変更するには、名前と値のペアの引数 YCrit を使用します。

  • perfcurve点単位の信頼限界を計算しない場合、Y はベクトルになります。

  • perfcurve で信頼限界を計算する場合、Y は m 行 3 列の行列になります。m は固定された X の値またはしきい値 (T の値) の数です。Y の 1 列目には平均値が格納されます。2 列目には点単位の信頼限界の下限が、3 列目には上限が格納されます。

XY の計算値に対する分類器のスコアのしきい値。ベクトルまたは m 行 3 列の行列として返されます。

  • perfcurve点単位の信頼限界を計算しない場合、またはしきい値平均化を使用して計算する場合、T はベクトルになります。

  • perfcurve で縦方向平均化を使用して信頼限界を計算する場合、T は m 行 3 列の行列になります。m は固定された X の値の数です。T の 1 列目には平均値が格納されます。2 列目には点単位の信頼限界の下限が、3 列目には上限が格納されます。

各しきい値に対し、TP はこのしきい値以上のスコアをもつ真陽性観測値の数であり、FP はこのしきい値以上のスコアをもつ偽陽性観測値の数です。perfcurve では陰性数の TN および FN も同様に定義されます。しきい値は降順で並べ替えられます。これは陽性カウントの昇順に対応します。

m 個の異なるしきい値がスコアの配列に含まれるようにするため、perfcurve は m + 1 行の配列として XY および T を返します。perfcurve は、要素 T(2:m+1) に個別のしきい値を設定し、T(1) には T(2) を複製します。慣例により、T(1) は最大の 'reject all' しきい値を表します。perfcurve は、対応する XY の値を TP = 0 および FP = 0 について計算します。T(end) の値は、TN = 0 および FN = 0 になる最小の 'accept all' しきい値です。

XY の計算値に対する曲線の下の領域 (AUC)。スカラー値または 3 行 1 列のベクトルとして返されます。

  • perfcurve点単位の信頼限界を計算しない場合、AUC はスカラー値になります。

  • perfcurve で縦方向平均化を使用して信頼限界を計算する場合、AUC は 3 行 1 列のベクトルになります。AUC の 1 列目には平均値が格納されます。2 列目には信頼限界の下限が、3 列目には上限が格納されます。

完璧な分類器では AUC = 1 になります。観測値を無作為にクラスに割り当てる分類器では、AUC = 0.5 になります。

XVals'all' (既定) を設定した場合、perfcurve は返される XY の値を使用して AUC を計算します。

XVals が数値配列の場合、perfcurveXVals の最小要素と最大要素で指定される区間に含まれているすべての個別のスコアによる XY の値を使用して、AUC を計算します。より正確には、perfcurveXVals'all' に設定した場合と同じようにすべての個別のしきい値に対して X を求めてから、min(XVals)max(XVals) の間でこれらのサブセットを (対応する Y の値と共に) 使用して AUC を計算します。

perfcurve では、台形近似を使用して面積を推定します。X または Y の最初または最後の値が NaN の場合、perfcurve ではこれらを削除して AUC を計算できるようにします。これにより、特殊なしきい値 'reject all' または 'accept all' の場合に陽性の予測値 (PPV) や陰性の予測値 (NPV) などに対して NaN を生成する基準に対応できるようになります。

ROC 曲線の最適な動作点。最適な ROC 動作点の偽陽性率 (FPR) と真陽性率 (TPR) の値が含まれている 1 行 2 列の配列として返されます。

perfcurve では、標準的な ROC 曲線の場合のみ OPTROCPT を計算します。それ以外の場合は NaN が設定されます。ROC 曲線の最適な動作点を取得するため、perfcurve でははじめに次の式を使用して勾配 S を求めます。

S=Cost(P|N)Cost(N|N)Cost(N|P)Cost(P|P)*NP

  • Cost(N|P) は、陽性のクラスを陰性のクラスとして誤分類するコストです。Cost(P|N) は、陰性のクラスを陽性のクラスとして誤分類するコストです。

  • P = TP + FN および N = TN + FPこれらは、それぞれ陽性のクラスと陰性のクラスにおける合計インスタンス数です。

次に、perfcurve は勾配が S の直線を ROC 曲線と交わるまで ROC プロットの左上隅 (FPR = 0TPR = 1) から下および右に移動して、最適な動作点を求めます。

陰性サブクラスの値。配列として返されます。

  • 陰性のクラスを 1 つだけ指定した場合、SUBYY と同じになります。

  • k 個の陰性クラスを指定した場合、SUBY は m 行 k 列の行列になります。m は XY について返される値の数、k は陰性クラスの数です。perfcurve は、すべての陰性クラスのカウントを合計して Y の値を計算します。

SUBY は、各陰性クラスに対する Y の基準の値を個別に与えます。perfcurve は、各陰性クラスについて新しい列を SUBY に追加し、このクラスのみについてカウントされた真陰性 (TN) と偽陽性 (FP) に対する Y の値を設定します。

陰性クラスの名前。cell 配列として返されます。

  • 陰性クラス名の入力配列 NegClass を指定した場合、perfcurve ではその名前が SUBYNAMES にコピーされます。

  • NegClass を指定しなかった場合、perfcurve では入力したラベルから SUBYNAMES が抽出されます。SUBYNAMES の順序は、SUBY の列の順序と同じです。つまり、SUBY(:,1) は陰性クラス SUBYNAMES{1} に、SUBY(:,2) は陰性クラス SUBYNAMES{2} に対応し、他も同様になります。

アルゴリズム

すべて折りたたむ

点単位の信頼限界

labelsscores について cell 配列を指定した場合、または NBoot に正の整数を設定した場合、perfcurveXYT および AUC について点単位の信頼限界を返します。labelsscores の cell 配列を指定して、同時に NBoot を正の整数に設定することはできません。

perfcurve はデータをリサンプリングし、交差検証またはブートストラップを使用して信頼限界を計算します。

  • 交差検証 — labelsscores について cell 配列を指定した場合、perfcurve は交差検証を使用し、cell 配列の要素を交差検証の分割として扱います。labels には、数値ベクトルの cell 配列、logical ベクトル、文字行列、文字ベクトルの cell 配列または categorical ベクトルを指定できます。labels のすべての要素は同じ型でなければなりません。scores には、数値ベクトルの cell 配列を指定できます。labelsscores の cell 配列は、要素数が同じでなければなりません。labels のセル j に含まれているラベル数は、1 から scores の要素数までの任意の j について、scores のセル j に含まれているスコアの数と等しくなければなりません。

  • ブートストラップ ― NBoot に正の整数 n を設定した場合、perfcurve は n 個のブートストラップ複製を生成して点単位の信頼限界を計算します。XCrit または YCrit を使用して X または Y の基準に無名関数を設定した場合、perfcurve はブートストラップを使用しないと信頼限界を計算できません。

perfcurve は、2 つの方法のいずれかで信頼限界を計算します。

  • 縦方向平均化 (VA) ― perfcurve は、X の固定値における YT の信頼限界を推定します。つまり、perfcurve は固定された X の値について ROC 曲線の標本を抽出し、対応する YT の値の平均を計算して、標準偏差を計算します。名前と値のペアの引数 XVals を使用すると、信頼限界を計算するために X の値を固定できます。XVals を指定しない場合、perfcurve はすべての X 値において信頼限界を計算します。

  • しきい値平均化 (TA) ― perfcurve は、陽性クラスのスコアについて固定した T のしきい値で ROC 曲線の標本を抽出し、対応する XY の値の平均を計算して、信頼限界を推定します。名前と値のペアの引数 TVals を使用すると、この方法を使用して信頼限界を計算できます。TVals'all' に設定した場合、または TVals または XVals を指定しなかった場合、perfcurve はすべてのスコアについて XY および T の値を返し、しきい値平均化を使用して YX について点単位の信頼限界を計算します。

信頼限界を計算する場合、Y はm 行 3 列の配列です。m は固定された X の値またはしきい値 (T の値) の数です。Y の 1 列目には平均値が格納されます。2 列目には点単位の信頼限界の下限が、3 列目には上限が格納されます。AUC は 3 要素の行ベクトルで、同じ規則に従います。perfcurve で VA を使用して信頼限界を計算する場合、T は m 行 3 列の行列、X は列ベクトルです。perfcurve で TA を使用する場合、X は m 行 3 列の行列、T は列ベクトルです。

perfcurve は点単位の信頼限界を返します。曲線全体の同時信頼限界は返されません。

代替機能

  • rocmetrics オブジェクトを作成して、ROC 曲線などの性能曲線のパフォーマンス メトリクスを計算できます。rocmetrics は、バイナリ問題とマルチクラスの分類問題の両方をサポートします。分類モデル オブジェクトの関数 predict (ClassificationTreepredict など) によって返された分類スコアを、マルチクラス モデル用に調整せずに rocmetrics に渡すことができます。

    rocmetrics には、ROC 曲線のプロット (plot)、マルチクラス問題の平均 ROC 曲線の特定 (average)、およびオブジェクト作成後の追加メトリクスの計算 (addMetrics) を行うためのオブジェクト関数が用意されています。詳細については、リファレンス ページとROC 曲線とパフォーマンス メトリクスを参照してください。

参照

[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.

拡張機能

バージョン履歴

R2009a で導入

すべて展開する