このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
rocmetrics
説明
分類モデルの性能を受信者動作特性 (ROC) 曲線またはその他のパフォーマンス メトリクスを使用して評価するには、rocmetrics
オブジェクトを作成します。rocmetrics
は、バイナリ問題とマルチクラス問題の両方をサポートします。
rocmetrics
は、各クラスについて、1 対他の ROC 曲線のパフォーマンス メトリクスを計算します。平均 ROC 曲線のメトリクスは、関数 average
を使用して計算できます。ROC 曲線のメトリクスを計算した後、関数 plot
を使用してそれらをプロットできます。
rocmetrics
は、ROC 曲線を取得するために、既定では偽陽性率 (FPR) と真陽性率 (TPR) を計算します。追加のメトリクスを計算する場合は、オブジェクトの作成時に名前と値の引数 AdditionalMetrics
を指定するか、オブジェクトの作成後に関数 addMetrics
を呼び出して指定できます。計算されたメトリクスは、rocmetrics
オブジェクトの Metrics
プロパティに格納されます。
R2024b において: auc
関数を使用して ROC 曲線の下の領域 (AUC) を求めることができます。
rocmetrics
は、NumBootstraps
の値を正の整数に設定するか、真のクラス ラベル (Labels
)、分類スコア (Scores
)、および観測値の重み (Weights
) の交差検証データを指定すると、パフォーマンス メトリクスの点単位の信頼区間を計算します。詳細については、点単位の信頼区間を参照してください。
作成
構文
説明
は、rocObj
= rocmetrics(Labels
,Scores
,ClassNames
)Labels
の真のクラス ラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Labels
は長さ n のベクトルとして指定し、Scores
は n
行 K
列のサイズの行列として指定します。ここで、n
は観測値の数、K
はクラスの数です。ClassNames
は、Scores
における列の順序を指定します。
Metrics
プロパティに、Scores
と ClassNames
を指定した各クラスについてのパフォーマンス メトリクスが格納されます。
Labels
と Scores
で交差検証データを cell 配列として指定すると、rocmetrics
はパフォーマンス メトリクスの信頼区間を計算します。
は、rocObj
= rocmetrics(Mdl
,Tbl
,ResponseVarName
)Tbl
内の予測子データと Tbl
内に 1 つの列として格納された応答変数名 ResponseVarName
を使用して、分類モデル オブジェクト Mdl
から rocmetrics
オブジェクトを作成します。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、rocObj
= rocmetrics(___,Name=Value
)NumBootstraps=100
は、100 個のブートストラップ標本を抽出してパフォーマンス メトリクスの信頼区間を計算します。
入力引数
真のクラス ラベル。数値ベクトル、logical ベクトル、categorical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。これらのいずれかの型の cell 配列として、Labels
で交差検証データを指定することもできます。
Labels
または Labels{i}
の各行は、1 つの観測値の真のラベルを表します。
この引数は Labels
プロパティを設定します。
データ型: single
| double
| logical
| char
| string
| cell
分類スコア。数値行列または数値行列の cell 配列として指定します。
Scores
の行列の各行には、ClassNames
で指定されたすべてのクラスに対する 1 つの観測値の分類スコアが格納されます。Scores
の列の順序は ClassNames
のクラスの順序と一致しなければなりません。
行列入力の場合、
Score(j,k)
はクラスClassNames(k)
に対する観測値j
の分類スコアです。バイナリ分類とマルチクラス分類のどちらでも、分類モデル オブジェクトの関数predict
の 2 番目の出力引数を使用してScores
を指定できます。たとえば、ClassificationTree
のpredict
は n 行 K 列の行列として分類スコアを返します。ここで、n は観測値の数、K はクラスの数です。この出力をrocmetrics
に渡します。Scores
の行数とLabels
の長さは等しくなければなりません。rocmetrics
は、各クラスのスコアを残りのクラスのスコアとの関係で調整します。詳細については、マルチクラス分類問題の調整スコアを参照してください。ベクトル入力の場合、
Score(j)
はClassNames
で指定されたクラスに対する観測値j
の分類スコアです。関数
plot
を使用して ROC 曲線をプロットするときにモデル操作点を表示する場合は、Score(j)
の値を事後確率にする必要があります。この制限はベクトル入力にのみ適用されます。交差検証データの場合、
Labels
、Scores
、およびWeights
を同じ要素数の cell 配列として指定する必要があります。rocmetrics
は、cell 配列の要素を 1 つの交差検証分割のデータとして扱い、パフォーマンス メトリクスの点単位の信頼区間を計算します。Score{i}(j,k)
は、クラスClassNames(k)
に対する要素i
の観測値j
の分類スコアです。Scores{i}
の行数とLabels{i}
の長さは等しくなければなりません。
詳細については、rocmetrics に対する分類スコアの入力を参照してください。
この引数は Scores
プロパティを設定します。
データ型: single
| double
| cell
クラス名。数値ベクトル、logical ベクトル、categorical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。ClassNames
のデータ型は Labels
の真のラベルと同じでなければなりません。ClassNames
の値は Labels
に含まれていなければなりません。
この引数は ClassNames
プロパティを設定します。
データ型: single
| double
| logical
| cell
| categorical
R2024b 以降
分類モデル。次のタイプのいずれかに基づく完全またはコンパクトなモデル オブジェクトとして指定します。
たとえば、次のコードでは、fitctree
関数を使用してモデル オブジェクトを作成してから、そのモデル オブジェクトを rocmetrics
関数に入力として渡しています。
Mdl = fitctree(X,Y); rocObj = rocmetrics(Mdl,X,Y);
メモ
分類モデルから rocmetrics
オブジェクトを作成するには、Mdl
に加えて学習データと応答データを渡す必要があります。交差検証済みモデルの場合は、学習データと応答データは渡しません。
R2024b 以降
予測に使用される標本データ。table として指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。Tbl
には、応答変数用の追加の 1 列を含めることができます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
Tbl
に応答変数が含まれている場合に他の変数をすべて予測子として使用するには、ResponseVarName
を使用して応答変数を指定します。Tbl
に応答変数が含まれていない場合は、Y
を使用して応答データを指定します。応答変数の長さとTbl
の行数は等しくなければなりません。
データ型: table
R2024b 以降
応答変数の名前。Tbl
内の変数の名前で指定します。Mdl
を学習させるために使用した応答変数が Tbl
に含まれている場合、ResponseVarName
を指定する必要はありません。
ResponseVarName
には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数 Y
が Tbl.Y
として格納されている場合、"Y"
として指定します。それ以外の場合、Tbl
の列は Y
を含めてすべて予測子として扱われます。
応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
データ型: char
| string
R2024b 以降
クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y
のデータ型は、Mdl
の学習に使用した応答データと同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。
Y
の長さは、Tbl
または X
の行数と等しくなければなりません。
データ型: categorical
| char
| string
| logical
| single
| double
| cell
R2024b 以降
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値を、各列は 1 つの変数を表します。
データ型: single
| double
R2024b 以降
交差検証分類モデル。次のタイプのいずれかに基づくモデル オブジェクトとして指定します。
たとえば、次のコードでは、fitctree
関数を使用して交差検証済みモデルを作成してから、そのモデル オブジェクトを rocmetrics
関数に入力として渡しています。
CVMdl = fitctree(X,Y,Crossval="on");
rocObj = rocmetrics(CVMdl);
メモ
分類モデルから rocmetrics
オブジェクトを作成するには、Mdl
に加えて学習データと応答データを渡す必要があります。交差検証済みモデルの場合は、学習データと応答データは渡しません。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: rocObj = rocmetrics(Labels,Scores,ClassNames,FixedMetric="FalsePositiveRate",FixedMetricValues=0:0.01:1)
は、FPR の値を 0:0.01:1
で固定します。
パフォーマンス メトリクス
追加で計算するモデルのパフォーマンス メトリクス。組み込みメトリクスの名前の文字ベクトルまたは string スカラー、名前の string 配列、関数ハンドル (@metricName
)、または関数ハンドルの cell 配列として指定します。偽陽性率 (FPR) と真陽性率 (TPR) については、ROC 曲線を取得するために rocmetrics
オブジェクトで常に計算されます。そのため、FPR と TPR を計算するように指定する必要はありません。
組み込みメトリクス — 文字ベクトルまたは string スカラーを使用して次の組み込みメトリクスの名前を指定します。string 配列を使用して複数指定できます。
名前 説明 "TruePositives"
または"tp"
真陽性の数 (TP) "FalseNegatives"
または"fn"
偽陰性の数 (FN) "FalsePositives"
または"fp"
偽陽性の数 (FP) "TrueNegatives"
または"tn"
真陰性の数 (TN) "SumOfTrueAndFalsePositives"
または"tp+fp"
TP と FP の和 "RateOfPositivePredictions"
または"rpp"
陽性予測率 (RPP)、 (TP+FP)/(TP+FN+FP+TN)
"RateOfNegativePredictions"
または"rnp"
陰性予測率 (RNP)、 (TN+FN)/(TP+FN+FP+TN)
"Accuracy"
または"accu"
精度、 (TP+TN)/(TP+FN+FP+TN)
"FalseNegativeRate"
、"fnr"
、または"miss"
偽陰性率 (FNR)、失敗率、 FN/(TP+FN)
"TrueNegativeRate"
、"tnr"
、または"spec"
真陰性率 (TNR)、特異度、 TN/(TN+FP)
"PositivePredictiveValue"
、"ppv"
、"prec"
、または"precision"
陽性予測値 (PPV)、適合率、 TP/(TP+FP)
"NegativePredictiveValue"
または"npv"
陰性予測値 (NPV)、 TN/(TN+FN)
"ExpectedCost"
または"ecost"
予測コスト、
(TP*cost(P|P)+FN*cost(N|P)+FP*cost(P|N)+TN*cost(N|N))/(TP+FN+FP+TN)
。ここで、cost
は[0,cost(N|P);cost(P|N),0]
を含む 2 行 2 列の誤分類コスト行列です。cost(N|P)
は陽性クラス (P
) を陰性クラス (N
) として誤分類するコストで、cost(P|N)
は陰性クラスを陽性クラスとして誤分類するコストです。1 対他の各バイナリ問題について、
rocmetrics
の名前と値の引数Cost
で指定されたK
行K
列の行列が 2 行 2 列の行列に変換されます。詳細については、誤分類コスト行列を参照してください。"f1score"
F1 スコア、 2*TP/(2*TP+FP+FN)
"all"
を指定すると上記のすべてのメトリクスを取得できます。"all"
を他のいずれかのメトリクスと組み合わせて指定することはできません。事前クラス確率 (
Prior
) とLabels
のクラス数を使用してスケール ベクトルが計算され、このスケール ベクトルに従ってパフォーマンス メトリクスがスケーリングされます。詳細については、パフォーマンス メトリクスを参照してください。カスタム メトリクス — 関数ハンドルを使用してカスタム メトリクスを指定します。パフォーマンス メトリクスを返すカスタム関数は次の形式でなければなりません。
metric = customMetric(C,scale,cost)
出力引数
metric
はスカラー値です。カスタム メトリクスは混同行列 (
C
)、スケール ベクトル (scale
)、およびコスト行列 (cost
) の関数です。1 対他の各バイナリ分類について、それらの入力値が特定されます。詳細については、パフォーマンス メトリクスを参照してください。C
は[TP,FN;FP,TN]
で構成される2
行2
列の混同行列です。scale
は2
行1
列のスケール ベクトルです。cost
は2
行2
列の誤分類コスト行列です。
カスタム メトリクスに対する交差検証はサポートされていません。代わりに、
rocmetrics
オブジェクトの作成時にブートストラップを使用するように指定できます。
すべて棄却しきい値 (TP
= FP
= 0
) では陽性予測値 (PPV) が NaN
になり、すべて確定しきい値 (TN
= FN
= 0
) では陰性予測値 (NPV) が NaN
になることに注意してください。詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
例: AdditionalMetrics=["Accuracy","PositivePredictiveValue"]
例: AdditionalMetrics={"Accuracy",@m1,@m2}
は、精度のメトリクスとカスタム メトリクス m1
および m2
を追加のメトリクスとして指定します。rocmetrics
は、カスタム メトリクスの値を CustomMetric1
および CustomMetric2
という名前の変数として Metrics
プロパティに格納します。
データ型: char
| string
| cell
| function_handle
固定のメトリクス。"Thresholds"
、"FalsePositiveRate"
(または "fpr"
)、"TruePositiveRate"
(または "tpr"
)、あるいは名前と値の引数 AdditionalMetrics
で指定されたメトリクスとして指定します。カスタム メトリクスを固定にするには、FixedMetric
を "CustomMetricN"
として指定します。ここで、N
はカスタム メトリクスを参照する番号です。たとえば、AdditionalMetrics
で指定された 1 番目のカスタム メトリクスを固定のメトリクスとして使用するには "CustomMetric1"
と指定します。
rocmetrics
は、固定のメトリクス (FixedMetric
) の固定の値 (FixedMetricValues
) に対応する ROC 曲線と他のメトリクスの値を求め、それらの値を Metrics
プロパティに table として格納します。詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
rocmetrics
で信頼区間を計算する場合、FixedMetric
の値に応じて 2 つの方法のいずれかが計算に使用されます。
FixedMetric
が"Thresholds"
(既定) の場合、rocmetrics
はしきい値平均化を使用します。FixedMetric
が既定以外の値の場合、rocmetrics
は縦方向平均化を使用します。
詳細については、点単位の信頼区間を参照してください。
例: FixedMetric="TruePositiveRate"
データ型: char
| string
固定のメトリクス (FixedMetric
) の値。"all"
または数値ベクトルとして指定します。
rocmetrics
は、固定のメトリクス (FixedMetric
) の固定の値 (FixedMetricValues
) に対応する ROC 曲線と他のメトリクスの値を求め、それらの値を Metrics
プロパティに table として格納します。
FixedMetric
の既定値は "Thresholds"
で、FixedMetricValues
の既定値は "all"
です。rocmetrics
は、各クラスについて、すべての異なる調整スコアの値をしきい値として使用し、そのしきい値を使用してパフォーマンス メトリクスを計算します。UseNearestNeighbor
の設定に応じて、rocmetrics
は固定の値に対応する厳密なしきい値か最も近いしきい値を使用します。詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
rocmetrics
で信頼区間を計算する場合、FixedMetric
が FixedMetricValues
で固定されます。
FixedMetric
の値が"Thresholds"
でFixedMetricValues
が"all"
—rocmetrics
は、すべての個別のしきい値に対応する値で信頼区間を計算します。FixedMetric
の値がパフォーマンス メトリクスでFixedMetricValues
が"all"
—rocmetrics
は、すべての個別のしきい値に対応するメトリクスの値を求め、そのメトリクスの値に対応する値で信頼区間を計算します。
詳細については、点単位の信頼区間を参照してください。
例: FixedMetricValues=0:0.01:1
データ型: single
| double
データ型: char
| string
最も近いメトリクスの値を使用するためのインジケーター。数値または logical の 0
(false
) または 1
(true
) として指定します。
logical
0
(false
) —rocmetrics
は、FixedMetric
のFixedMetricValues
で指定された固定のメトリクスの値に対応する厳密なしきい値を使用します。logical
1
(true
) —rocmetrics
は、調整された入力スコアから、指定された固定のメトリクスの各値に対応するしきい値に最も近い値を特定します。
詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
rocmetrics
で信頼区間を計算する場合、UseNearestNeighbor
の値は false
でなければなりません。それ以外の場合、既定値は true
です。
例: UseNearestNeighbor=false
データ型: single
| double
| logical
分類のオプション
R2024a 以降
該当するモデルのスコアに誤分類コストを適用するためのフラグ。数値または logical の 0
(false
) または 1
(true
) として指定します。ApplyCostToScores
は、k 最近傍 (KNN)、判別分析、または単純ベイズ モデルのスコアを既定以外の誤分類コストと共に指定する場合のみ true
に設定します。これらのモデルでは、ラベルの予測にスコアではなく予測分類コストが使用されます。
ApplyCostToScores
を true
として指定すると、スコアが S*(-C)
に変更されます。ここで、S
は引数 Scores
で指定されるスコア、C
は名前と値の引数 Cost
で指定される誤分類コスト行列です。変換されたスコアが rocmetrics
オブジェクトの Scores
プロパティに格納されます。
ApplyCostToScores
を false
として指定すると、未変換のスコアが rocmetrics
オブジェクトの Scores
プロパティに格納されます。
ApplyCostToScores
は、モデル オブジェクトを入力として使用する構文にはいずれにも適用されません。
例: ApplyCostToScores=true
データ型: single
| double
| logical
誤分類コスト。K 行 K 列の正方行列 C として指定します。ここで、K は Labels
に含まれている一意のクラスの数です。C(i,j)
は、真のクラスが i
である場合に点をクラス j
に分類するコストです (行は真のクラス、列は予測したクラスに対応します)。ClassNames
でクラスの順序を指定します。
rocmetrics
は、1 対他の各バイナリ問題について、K
行 K
列の行列を 2 行 2 列の行列に変換します。詳細については、誤分類コスト行列を参照してください。
Scores
の 1 つのクラスのみに対する分類スコアを指定する場合、Cost
の値は [0,cost(N|P);cost(P|N),0]
を含む 2
行 2
列の行列でなければなりません。ここで、P
は陽性クラス (分類スコアを指定するクラス)、N
は陰性クラスです。cost(N|P)
は陽性クラスを陰性クラスとして誤分類するコスト、cost(P|N)
は陰性クラスを陽性クラスとして誤分類するコストです。
既定値は、i~=j
である場合は C(i,j)=1
、i=j
である場合は C(i,j)=0
です。コスト行列の対角要素はゼロでなければなりません。
Cost
は、モデル オブジェクトを入力として使用する構文にはいずれにも適用されません。
この引数は Cost
プロパティを設定します。
メモ
KNN、判別分析、または単純ベイズ モデルのスコアを使用するときに誤分類コスト行列を指定する場合は、ApplyCostToScores
を true
に設定します。これらのモデルでは、ラベルの予測にスコアではなく予測分類コストが使用されます。 (R2024a 以降)
例: Cost=[0 2;1 0]
データ型: single
| double
事前クラス確率。次のいずれかとして指定します。
"empirical"
は真のクラス ラベルLabels
におけるクラスの頻度からクラス確率を決定します。観測値の重み (Weights
) を渡す場合、rocmetrics
はこの重みも使用してクラス確率を計算します。"uniform"
はすべてのクラス確率を均等に設定します。クラスごとに 1 つのスカラー値を含むスカラー値のベクトル。
ClassNames
でクラスの順序を指定します。Scores
の 1 つのクラスのみに対する分類スコアを指定する場合、Prior
の値は指定されたクラスの事前確率を表すPrior(1)
をもつ 2 要素のベクトルでなければなりません。
Prior
は、モデル オブジェクトを入力として使用する構文にはいずれにも適用されません。
この引数は Prior
プロパティを設定します。
例: Prior="uniform"
データ型: single
| double
| char
| string
観測値の重み。正の値の数値ベクトルまたは正の値の数値ベクトルを含む cell 配列として指定します。
rocmetrics
は、Labels
および Scores
に含まれている観測値に Weights
の対応する値で重みを付けます。NumBootstraps
の値を正の整数に設定した場合、rocmetrics
は重みを多項分布抽出確率として使用して復元抽出します。
既定では、Weights
は 1 のベクトルまたは 1 のベクトルを含む cell 配列です。
Weights
は、モデル オブジェクトを入力として使用する構文も含め、いずれの構文にも指定できます。
この引数は Weights
プロパティを設定します。
データ型: single
| double
| cell
信頼区間のオプション
点単位の信頼区間の有意水準。範囲 (0,1)
のスカラーとして指定します。
Alpha
を α と指定した場合、rocmetrics
はパフォーマンス メトリクスについての 100×(1 – α)% の点単位の信頼区間を計算します。
この引数は信頼区間の計算に関連します。そのため、Labels
、Scores
、および Weights
の交差検証データを指定した場合、または NumBootstraps
の値を正の整数に設定した場合のみ有効です。
例: Alpha=0.01
は 99% の信頼区間を指定します。
データ型: single
| double
並列計算のブートストラップ オプション。構造体として指定します。
ブートストラップ反復の並列計算、およびブートストラップ サンプリング時の乱数設定のオプションを指定できます。statset
を使用して BootstrapOptions
構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。
フィールド名 | フィールドの値 | 既定の設定 |
---|---|---|
UseParallel | ブートストラップ反復を並列計算する場合は、この値を | false |
UseSubstreams | 再生可能な方法で並列計算する場合は、この値を 再現性のある計算を行うには、 | false |
Streams |
|
|
この引数は、NumBootstraps
を正の整数として指定し、ブートストラッピングを使用して信頼区間を計算する場合のみ有効です。
並列計算には Parallel Computing Toolbox™ が必要です。
例: BootstrapOptions=statset(UseParallel=true)
データ型: struct
ブートストラップ信頼区間のタイプ。次の表のいずれかの値として指定します。
値 | 説明 |
---|---|
"bca" | BCa 法 (bias corrected and accelerated percentile method) [11][12]。この方法には、元の標本値未満のブートストラップ値の比率を使用して計算される z0 係数が含まれます。標本が塊状の場合に合理的な結果を得るために、z0 は元の標本値と同じブートストラップ値の半分を含めることで計算されます。 |
"corrected percentile" または "cper" | バイアス補正百分位数法[13] |
"normal" または "norm" | バイアスと標準誤差をブートストラップした正規近似区間[14] |
"percentile" または "per" | 基本の等百分位数法 |
"student" または "stud" | スチューデント化された信頼区間[11] |
この引数は、NumBootstraps
を正の整数として指定し、ブートストラッピングを使用して信頼区間を計算する場合のみ有効です。
例: BootstrapType="student"
データ型: char
| string
点単位の信頼区間の計算用に抽出するブートストラップ標本の数。非負の整数スカラーとして指定します。
NumBootstraps
を正の整数として指定すると、rocmetrics
は NumBootstraps
個のブートストラップ標本を使用します。各ブートストラップ標本を作成するために、関数は n
行の入力データから n
行を復元抽出で無作為に選択します。既定値の 0
は、rocmetrics
でブートストラッピングを使用しないことを意味します。
rocmetrics
は、交差検証データまたはブートストラップ標本のいずれかを使用して信頼区間を計算します。したがって、Labels
、Scores
、および Weights
の交差検証データを指定する場合、NumBootstraps
は 0
でなければなりません。
詳細については、点単位の信頼区間を参照してください。
例: NumBootstraps=500
データ型: single
| double
スチューデント化された標準誤差推定用に抽出するブートストラップ標本の数。正の整数スカラーとして指定します。
この引数は、NumBootstraps
を正の整数、BootstrapType
を "student"
として指定し、スチューデント化されたブートストラップ信頼区間を計算する場合のみ有効です。rocmetrics
は、スチューデント化された標準誤差推定を NumBootstrapsStudentizedSE
個のブートストラップ データ標本を使用して推定します。
例: NumBootstrapsStudentizedSE=500
データ型: single
| double
ECOC モデルのオプション
R2024b 以降
バイナリ学習器損失関数。組み込みの損失関数の名前または関数ハンドルとして指定します。
次の表で、組み込み関数について説明します。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失の式です。
値 説明 スコア領域 g(yj,sj) "binodeviance"
二項分布からの逸脱度 (–∞,∞) log[1 + exp(–2yjsj)]/[2log(2)] "exponential"
指数 (–∞,∞) exp(–yjsj)/2 "hamming"
ハミング [0,1] または (–∞,∞) [1 – sign(yjsj)]/2 "hinge"
ヒンジ (–∞,∞) max(0,1 – yjsj)/2 "linear"
線形 (–∞,∞) (1 – yjsj)/2 "logit"
ロジスティック (–∞,∞) log[1 + exp(–yjsj)]/[2log(2)] "quadratic"
2 次 [0,1] [1 – yj(2sj – 1)]2/2 バイナリ損失は、yj = 0 の場合に損失が 0.5 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます[1]。
カスタム バイナリ損失関数の場合は関数ハンドルを指定します。たとえば、
customFunction
の場合はBinaryLoss=@customFunction
を指定します。customFunction
の形式は次のとおりです。bLoss = customFunction(M,s)
M
はMdl.CodingMatrix
に格納された K 行 B 列の符号化行列です。s
は 1 行 B 列の分類スコアの行ベクトルです。bLoss
は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。K は、クラスの数です。
B はバイナリ学習器の数です。
カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。
次の表に BinaryLoss
の既定値を示します。既定値は、バイナリ学習器が返すスコアの範囲によって異なります。
仮定 | 既定値 |
---|---|
すべてのバイナリ学習器が次のいずれかである。
| "quadratic" |
すべてのバイナリ学習器が SVM であるか、SVM 学習器の線形またはカーネル分類モデルである。 | "hinge" |
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。 | "exponential" |
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。 | "binodeviance" |
fitcecoc で FitPosterior=true を設定して、クラスの事後確率を予測するように指定している。 | "quadratic" |
バイナリ学習器が異種混合で、さまざまな損失関数を使用している。 | "hamming" |
既定値を確認するには、コマンド ラインでドット表記を使用して学習済みモデルの BinaryLoss
プロパティを表示します。
例: BinaryLoss="binodeviance"
データ型: char
| string
| function_handle
バイナリ損失を集計する復号化方式。"lossweighted"
または "lossbased"
として指定します。詳細については、バイナリ損失を参照してください。
例: Decoding="lossbased"
データ型: char
| string
推定オプション。statset
によって返される構造体配列として指定します。
並列計算を起動するには、Parallel Computing Toolbox ライセンスが必要です。
例: Options=statset(UseParallel=true)
データ型: struct
詳細レベル。0
または 1
として指定します。Verbose
は、コマンド ウィンドウに表示される診断メッセージの量を制御します。
Verbose
が 0
の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。
例: Verbose=1
データ型: single
| double
GAM モデルのオプション
R2024b 以降
モデルの交互作用項を含むというフラグ。true
または false
として指定します。
モデルに交互作用項が含まれる場合、IncludeInteractions
の既定値は true
です。モデルに交互作用項が含まれない場合、値は false
でなければなりません。
例: IncludeInteractions=false
データ型: logical
アンサンブルのオプション
R2024b 以降
rocmetrics
で使用するアンサンブル内の弱学習器のインデックス。範囲 [1:ens.NumTrained
] の正の整数のベクトルとして指定します。既定では、この関数はすべての学習器を使用します。
例: Learners=[1 2 4]
データ型: single
| double
学習器の観測値を使用するオプション。N
行 T
列のサイズの logical 行列として指定します。
N
はX
の行の数です。T
は、ens
に存在する弱学習器の数です。
UseObsForLearner(i,j)
が true
(既定) の場合、学習器 j
が X
の行 i
のクラスの予測に使用されます。
例: UseObsForLearner=logical([1 1; 0 1; 1 0])
データ型: logical matrix
並列実行のフラグ。数値または logical の 1
(true
) または 0
(false
) として指定します。UseParallel=true
を指定した場合、関数 rocmetrics
は parfor
を使用して for
ループの反復を実行します。Parallel Computing Toolbox がある場合、ループが並列に実行されます。
例: UseParallel=true
データ型: logical
分類木のオプション
R2024b 以降
枝刈りレベル。昇順の非負の整数のベクトルまたは "all"
として指定します。
ベクトルを指定する場合、すべての要素が 0
から max(tree.PruneList)
の範囲になければなりません。0
は枝刈りしない完全な木を、max(tree.PruneList)
は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。
"all"
を指定した場合、rocmetrics
はすべての部分木 (つまり、枝刈り順序全体) に作用します。これは、0:max(tree.PruneList)
を指定することと同じです。
rocmetrics
では、Subtrees
で指定された各レベルまで tree
の枝刈りを行ってから、対応する出力引数を推定します。Subtrees
のサイズにより、一部の出力引数のサイズが決まります。
関数で Subtrees
を呼び出すために、tree
の PruneList
プロパティと PruneAlpha
プロパティは空以外でなければなりません。言い換えると、fitctree
を使用するときに Prune="on"
を設定して tree
を成長させるか、prune
を使用して tree
を枝刈りすることで成長させます。
例: Subtrees="all"
データ型: single
| double
| char
| string
ニューラル ネットワーク ECOC 分類モデルのオプション
R2024b 以降
予測子データにおける観測値の次元。"rows"
または "columns"
として指定します。
メモ
観測値が列に対応するように予測子行列を配置して ObservationsIn="columns"
を指定すると、計算時間が大幅に短縮される可能性があります。table の予測子データに対して ObservationsIn="columns"
を指定することはできません。
例: ObservationsIn="columns"
データ型: char
| string
交差検証済みモデルのオプション
R2024b 以降
信頼区間のタイプ。次のいずれかとして指定します。
"crossval"
— 交差検証分割を使用して信頼区間を作成します。"bootstrap"
— ブートストラッピングを使用して信頼区間を作成します。この場合、NumBootstraps
の既定値は100
です。"none"
— 信頼区間を作成しません。
例: ConfidenceIntervalType="bootstrap"
データ型: char
| string
予測に交互作用を含めるための指示。false
または true
として指定します。既定値は、モデルに交互作用がある場合は true
、それ以外の場合は false
です。この引数は、ClassificationPartitionedGAM
モデルまたは交差検証済み ClassificationGAM
モデルにのみ適用されます。
例: IncludeInteractions=false
データ型: logical
プロパティ
パフォーマンス メトリクス
この プロパティ は読み取り専用です。
パフォーマンス メトリクス。table として指定します。
table には、すべてのクラスについてのパフォーマンス メトリクスの値が、ClassNames
のクラスの順序に従って垂直方向に連結して格納されます。table には各クラスの一意のしきい値ごとに 1 つの行が格納されます。rocmetrics
は、使用するしきい値を FixedMetric
、FixedMetricValues
、および UseNearestNeighbor
の値に基づいて決定します。詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
table 内の各クラスに対する行数は一意のしきい値の数になります。
table の各行には、ClassName
、Threshold
、FalsePositiveRate
、および TruePositiveRate
の各変数と AdditionalMetrics
で指定された追加の各メトリクスの変数が含まれます。カスタム メトリクスを指定する場合、rocmetrics
はメトリクスに "CustomMetricN"
として名前を付けます。ここで、N
はカスタム メトリクスを参照する番号です。たとえば、"CustomMetric1"
は、AdditionalMetrics
で指定された 1 番目のカスタム メトリクスに対応します。
Metrics
の table の各変数には、ベクトルまたは 3 列の行列が格納されます。
rocmetrics
で信頼区間を計算しない場合、各変数にベクトルが格納されます。rocmetrics
で信頼区間を計算する場合、ClassName
とFixedMetric
の変数 (Threshold
、FalsePositiveRate
、TruePositiveRate
、または追加のメトリクス) の両方にベクトルが格納され、その他の変数に 3 列の行列が格納されます。行列の 1 列目がメトリクスの値に対応し、2 列目と 3 列目が下限と上限にそれぞれ対応します。
データ型: table
分類モデルのプロパティ
rocmetrics
オブジェクトを作成するときに、以下のプロパティを指定できます。
この プロパティ は読み取り専用です。
クラス名。数値ベクトル、logical ベクトル、categorical ベクトル、または文字ベクトルの cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 ClassNames
を参照してください。(文字配列または string 配列は文字ベクトルの cell 配列として扱われます。)
データ型: single
| double
| logical
| cell
| categorical
この プロパティ は読み取り専用です。
誤分類コスト。正方行列として指定します。
詳細については、このプロパティを設定する名前と値の引数 Cost
を参照してください。
データ型: single
| double
この プロパティ は読み取り専用です。
真のクラス ラベル。数値ベクトル、logical ベクトル、categorical ベクトル、または文字ベクトルの cell 配列として指定します。交差検証データの場合は、これらのいずれかの型の cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 Labels
を参照してください。(文字配列または string 配列は文字ベクトルの cell 配列として扱われます。)
データ型: single
| double
| logical
| cell
| categorical
この プロパティ は読み取り専用です。
事前クラス確率。数値ベクトルとして指定します。
詳細については、このプロパティを設定する名前と値の引数 Prior
を参照してください。この引数を文字ベクトルまたは string スカラー ("empirical"
または "uniform"
) として指定すると、rocmetrics
は事前確率を計算し、Prior
プロパティを数値ベクトルとして格納します。
データ型: single
| double
この プロパティ は読み取り専用です。
分類スコア。数値行列または数値行列の cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 Scores
を参照してください。
メモ
名前と値の引数 ApplyCostToScores
を true
として指定すると、変換されたスコア S*(-C)
が格納されます。ここで、S
は引数 Scores
で指定されるスコア、C
は名前と値の引数 Cost
で指定される誤分類コスト行列です。 (R2024a 以降)
データ型: single
| double
| cell
この プロパティ は読み取り専用です。
観測値の重み。正の値の数値ベクトルまたは正の値の数値ベクトルを含む cell 配列として指定します。
詳細については、このプロパティを設定する名前と値の引数 Weights
を参照してください。
データ型: single
| double
| cell
オブジェクト関数
addMetrics | 分類の追加のパフォーマンス メトリクスの計算 |
auc | ROC 曲線または適合率-再現率曲線の下の領域 |
average | マルチクラス問題における平均受信者動作特性 (ROC) 曲線のパフォーマンス メトリクスの計算 |
modelOperatingPoint | Operating point of rocmetrics object |
plot | 受信者動作特性 (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
は、70
行 2
列のサイズの行列です。Scores
の列の順序は Mdl
のクラスの順序に従います。Mdl.ClassNames
に格納されているクラスの順序を表示します。
Mdl.ClassNames
ans = 2×1 cell
{'b'}
{'g'}
YTest
の真のラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Mdl.ClassNames
を使用して Scores
の列の順序を指定します。
rocObj = rocmetrics(YTest,Scores,Mdl.ClassNames);
rocObj
は、各クラスのパフォーマンス メトリクスが Metrics
プロパティに格納された rocmetrics
オブジェクトです。auc
関数を使用して AUC 値を計算します。
a = auc(rocObj)
a = 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)
関数 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))
rocmetrics
オブジェクトを作成してマルチクラス分類問題のパフォーマンス メトリクス (FPR と TPR) を計算し、関数 plot
を使用して各クラスの ROC 曲線をプロットします。plot
の名前と値の引数 AverageCurveType
を指定して、マルチクラス問題の平均 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
は、150
行 3
列のサイズの行列です。Scores
の列の順序は Mdl
のクラスの順序に従います。Mdl.ClassNames
に格納されているクラスの順序を表示します。
Mdl.ClassNames
ans = 3×1 cell
{'setosa' }
{'versicolor'}
{'virginica' }
species
の真のラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Mdl.ClassNames
を使用して Scores
の列の順序を指定します。
rocObj = rocmetrics(species,Scores,Mdl.ClassNames);
rocObj
は、各クラスのパフォーマンス メトリクスが Metrics
プロパティに格納された rocmetrics
オブジェクトです。auc
関数を使用して AUC
値を計算します。
a = auc(rocObj)
a = 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 曲線をプロットします。AverageCurveType="micro"
を指定し、マイクロ平均法を使用して平均 ROC 曲線のパフォーマンス メトリクスを計算します。
plot(rocObj,AverageCurveType="micro")
ionosphere
データをワークスペースに読み込みます。
load ionosphere
who
Your variables are: Description X Y
変数 X
にデータがあり、変数 Y
に応答があります。データの分類木モデルを作成します。
Mdl = fitctree(X,Y);
モデルと行列データからの rocmetrics
オブジェクトの作成
X
と Y
を予測子データと応答データとして使用して、分類木モデルから rocmetrics
オブジェクトを作成します。
rocMdl = rocmetrics(Mdl,X,Y);
rocmetrics
オブジェクトの ROC 曲線をプロットします。
plot(rocMdl)
モデルと table データからの rocmetrics
オブジェクトの作成
X
のデータの table を作成します。
save("datafile.txt","X","-ascii"); Tbl = readtable("datafile.txt");
Tbl
を予測子データ、Y
を応答データとして使用して、分類木モデルから rocmetrics
オブジェクトを作成します。
Mdl2 = fitctree(Tbl,Y); rocMdl2 = rocmetrics(Mdl2,Tbl,Y);
rocMdl2
の ROC 曲線をプロットします。前のプロットと同じになります。
plot(rocMdl2)
モデルと応答を含む table からの rocmetrics
オブジェクトの作成
応答データ Y
を Tbl
内に Resp
という変数名で含めます。
Tbl.Resp = Y;
Resp
を応答変数名として指定して、Tbl
から rocmetrics
オブジェクトを作成します。
Mdl3 = fitctree(Tbl,"Resp"); rocMdl3 = rocmetrics(Mdl3,Tbl,"Resp");
rocMdl3
の ROC 曲線をプロットします。前のプロットと同じになります。
plot(rocMdl3)
交差検証済みモデルからの rocmetrics
オブジェクトの作成
交差検証分類木モデルを作成します。
rng default % For reproducibility CVMdl = fitctree(X,Y,KFold=5);
交差検証済みモデルから rocmetrics
オブジェクトを作成します。
rocMdl4 = rocmetrics(CVMdl);
rocMdl4
の ROC 曲線をプロットします。
plot(rocMdl4)
この ROC 曲線は前のプロットと見た目が異なります。交差検証済みモデルの ROC 曲線は、より現実に近いものになります。
"k" 最近傍 (KNN)、判別分析、および単純ベイズ分類器では、ラベルの予測にスコアではなく予測分類コストが使用されます。これらのモデルの ROC 曲線を既定以外の誤分類コストを使用して作成する場合は、関数 rocmetrics
の名前と値の引数 ApplyCostToScores
を true
に設定します。
標本ファイル CreditRating_Historical.dat
を table に読み取ります。予測子データは、法人顧客リストの財務比率と業種の情報で構成されます。応答変数は、格付機関が割り当てた格付けから構成されます。
creditrating = readtable("CreditRating_Historical.dat");
変数 ID
の各値は一意の顧客 ID であるため (つまり、length(unique(creditrating.ID))
は creditrating
に含まれる観測値の数に等しい)、変数 ID
は予測子としては適切ではありません。変数 ID
を table から削除します。
creditrating = removevars(creditrating,"ID");
すべての A
格付けを 1 つの格付けに統合します。B
と C
の格付けに対して同様に実行し、応答変数に 3 つの異なる格付けが含まれるようにします。3 つの格付けのうち、A
が最良で C
が最悪と見なされます。
Rating = categorical(creditrating.Rating); Rating = mergecats(Rating,["AAA","AA","A"],"A"); Rating = mergecats(Rating,["BBB","BB","B"],"B"); Rating = mergecats(Rating,["CCC","CC","C"],"C"); creditrating.Rating = Rating;
顧客の信用格付けの誤分類に特定のコストが関連付けられていると仮定します。誤分類コストを含む行列変数を作成します。クラス名と行列変数におけるそれらの順序を指定する別の変数を作成します。
classificationCosts = [0 100 200; 500 0 100; 1000 500 0]; classNames = categorical(["A","B","C"]);
このコストは、信用が高い顧客を信用が低い顧客として分類するより、信用が低い顧客を信用が高い顧客として分類するほうが、コストが高いことを示しています。たとえば、C
の格付け顧客を A
の格付け顧客として誤分類するコストは $1000 です。
データを学習セットとテスト セットに分割します。観測値の 75% を判別分析分類器の学習に使用し、観測値の 25% を学習済みモデルの新しいデータでの性能のテストに使用します。
rng("default") % For reproducibility c = cvpartition(creditrating.Rating,"Holdout",0.25); trainRatings = creditrating(training(c),:); testRatings = creditrating(test(c),:);
判別分析分類器を学習させます。誤分類コストを指定します。
mdl = fitcdiscr(trainRatings,"Rating",Cost=classificationCosts, ... ClassNames=classNames);
テスト セットの観測値について、クラス ラベル、スコア、予測分類コストを予測します。
[labels,scores,expectedCosts] = predict(mdl,testRatings);
各観測値の予測クラス ラベルは、すべてのクラスの中でスコア (事後確率) が最大のクラスではなく、予測分類コストが最小のクラスに対応します。
たとえば、テスト セットの最初の観測値についての予測を表示します。
firstLabel = labels(1)
firstLabel = categorical
B
firstScores = array2table(scores(1,:),VariableNames=["A","B","C"])
firstScores=1×3 table
A B C
_______ _______ __________
0.70807 0.29193 4.7141e-13
firstExpectedCosts = array2table(expectedCosts(1,:), ... VariableNames=["A","B","C"])
firstExpectedCosts=1×3 table
A B C
______ ______ ______
145.96 70.807 170.81
事後確率はクラス A
が最大であるにもかかわらず、予測ラベルは予測分類コストが最も低いクラス B
に対応しています。
testRatings
の真のラベルと scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。scores
の列の順序を指定します。既定以外の誤分類コストと判別分析モデルから返されるスコアを使用するために、名前と値の引数 Cost
と ApplyCostToScores
を指定します。
roc = rocmetrics(testRatings.Rating,scores,classNames, ...
Cost=classificationCosts,ApplyCostToScores=true);
rocmetrics
に格納されているスコアは負の予測分類コストであることに注意してください。
isequal(roc.Scores,-expectedCosts)
ans = logical
1
関数 plot
を使用して、各クラスの ROC 曲線をプロットします。
plot(roc,ClassNames=classNames)
各クラスについて、プロット関数で曲線がプロットされます。塗りつぶされた円のマーカーはモデル操作点を示します。
creditrating
データ セット全体を使用して、交差検証判別分析分類器に学習させます。
cvmdl = fitcdiscr(creditrating,"Rating",Cost=classificationCosts, ... ClassNames=classNames,CrossVal="on")
cvmdl = ClassificationPartitionedModel CrossValidatedModel: 'Discriminant' PredictorNames: {'WC_TA' 'RE_TA' 'EBIT_TA' 'MVE_BVTD' 'S_TA' 'Industry'} ResponseName: 'Rating' NumObservations: 3932 KFold: 10 Partition: [1×1 cvpartition] ClassNames: [A B C] ScoreTransform: 'none' Properties, Methods
関数 fitcdiscr
で、タイプ Discriminant
(CrossValidatedModel
プロパティの値) の ClassificationPartitionedModel
オブジェクトが作成されます。交差検証済みモデルを作成するために、関数では次の手順が実行されます。
データを 10 個のセットに無作為に分割する。
各セットについて、そのセットを検証データとして予約し、他の 9 個のセットを使用してモデルに学習させる。
10 個のコンパクトな学習済みモデルを交差検証済みモデル オブジェクトの
Trained
プロパティに 10 行 1 列の cell ベクトルとして格納する。
cvmdl.Trained
ans=10×1 cell array
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
{1×1 classreg.learning.classif.CompactClassificationDiscriminant}
各観測値について、クラス ラベル、スコア、予測分類コストを予測します。
[cvlabels,cvscores,cvexpectedCosts] = kfoldPredict(cvmdl);
各クラスの ROC 曲線をプロットします。
cvroc = rocmetrics(creditrating.Rating,cvscores,classNames, ...
Cost=classificationCosts,ApplyCostToScores=true);
plot(cvroc,ClassNames=classNames)
交差検証の結果は前のテスト セットと似た結果になります。
外れ値を含む生成された標本データについて、関数iforest
を使用して孤立森モデルに学習させて異常スコアを計算します。iforest
はスコアをベクトルとして返します。スコアを使用して rocmetrics
オブジェクトを作成します。異常スコアを使用して適合率-再現率曲線をプロットし、孤立森モデルのモデル操作点を特定します。
ガウス型コピュラを使用して、二変量分布からランダムなデータ点を生成します。
rng("default") rho = [1,0.05;0.05,1]; n = 1000; u = copularnd("Gaussian",rho,n);
無作為に選択された 5% の観測値にノイズを追加して、それらの観測値を外れ値にします。
noise = randperm(n,0.05*n); true_tf = false(n,1); true_tf(noise) = true; u(true_tf,1) = u(true_tf,1)*5;
関数 iforest
を使用して孤立森モデルに学習させます。学習観測値に含まれている異常の比率を 0.05 と指定します。
[f,tf,scores] = iforest(u,ContaminationFraction=0.05);
f
はIsolationForest
オブジェクトです。iforest
は、学習データの異常インジケーター (tf
) および異常スコア (scores
) も返します。iforest
は、指定した比率の学習観測値が異常として検出されるようにしきい値 (f.ScoreThreshold
) を決定します。
曲線の下の領域 (AUC) の値を計算する適合率-再現率曲線をプロットして、IsolationForest
オブジェクトの性能をチェックします。真の異常インジケーター (true_tf
) と異常スコア (scores
) を使用して rocmetrics
オブジェクトを作成します。1 に近いスコア値は異常を示し、true_tf
の値が true
になります。したがって、scores
のクラス名を true
として指定します。名前と値の引数 AdditionalMetrics
を指定して、適合率の値 (つまり陽性の予測値) を計算します。
rocObj = rocmetrics(true_tf,scores,true,AdditionalMetrics="PositivePredictiveValue");
rocmetrics
の関数 plot
を使用して曲線をプロットします。"y" 軸のメトリクスを適合率 (つまり陽性の予測値)、"x" 軸のメトリクスを再現率 (つまり真陽性率) として指定します。f.ScoreThreshold
に対応するモデル操作点に塗りつぶされた円を表示します。
r = plot(rocObj,YAxisMetric="PositivePredictiveValue",XAxisMetric="TruePositiveRate",... ShowModelOperatingPoint=true);
ブートストラップ標本を使用して FPR と TPR の固定のしきい値に対する信頼区間を計算し、関数 plot
を使用して ROC 曲線に TPR の信頼区間をプロットします。
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);
YTest
の真のラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Mdl.ClassNames
を使用して Scores
の列の順序を指定します。NumBootstraps
を 100 と指定し、100 個のブートストラップ標本を使用して信頼区間を計算します。
rocObj = rocmetrics(YTest,Scores,Mdl.ClassNames, ...
NumBootstraps=100);
Metrics
プロパティの table から 2 番目のクラスの行を特定し、最初の 8 行を表示します。
idx = strcmp(rocObj.Metrics.ClassName,Mdl.ClassNames(2)); head(rocObj.Metrics(idx,:))
ClassName Threshold FalsePositiveRate TruePositiveRate _________ _________ __________________________ ________________________________ {'g'} 7.196 0 0 0 0 0 0 {'g'} 7.196 0 0 0 0.022222 0 0.093023 {'g'} 6.2583 0 0 0 0.044444 0 0.11969 {'g'} 5.5719 0 0 0 0.066667 0.020988 0.16024 {'g'} 5.5643 0 0 0 0.088889 0.022635 0.18805 {'g'} 5.4618 0.04 0 0.22222 0.088889 0.022635 0.18805 {'g'} 5.3667 0.08 0 0.28 0.088889 0.022635 0.18805 {'g'} 5.1525 0.08 0 0.28 0.11111 0.045035 0.19532
table の各行に、FPR と TPR の固定のしきい値に対するメトリクスの値とその信頼区間が格納されます。変数 Threshold
は列ベクトルで、変数 FalsePositiveRate
と TruePositiveRate
は 3 列の行列です。行列の 1 列目がメトリクスの値に対応し、2 列目と 3 列目が下限と上限にそれぞれ対応します。
TPR の ROC 曲線と信頼区間をプロットします。信頼区間を表示するために ShowConfidenceIntervals=true
を指定し、プロットする 1 つのクラスを名前と値の引数 ClassNames
を使用して指定します。
plot(rocObj,ShowConfidenceIntervals=true,ClassNames=Mdl.ClassNames(2))
ROC 曲線の周囲に影付きの領域で信頼区間が示されます。信頼区間は、学習済みモデルのテスト セットでの分散による曲線の不確かさを表しています。
交差検証データを使用して FPR と TPR の固定のしきい値に対する信頼区間を計算し、関数 plot
を使用して ROC 曲線に TPR の信頼区間をプロットします。
fisheriris
データ セットを読み込みます。行列 meas
には、150 種類の花についての測定値が格納されています。ベクトル species
には、それぞれの花の種類がリストされています。species
には、3 種類の花の名前が格納されています。
load fisheriris
観測値を 3 つのラベルのいずれかに分類する単純ベイズ モデルに学習させます。10 分割の交差検証をモデルに対して実行します。
rng("default") % For reproducibility Mdl = fitcnb(meas,species,Crossval="on");
検証分割観測値の分類スコアを計算します。
[~,Scores] = kfoldPredict(Mdl);
cell 配列の各要素が 1 つの検証分割に対応するように、交差検証済みスコアとそれに対応する真のラベルを cell 配列に格納します。
cv = Mdl.Partition; numTestSets = cv.NumTestSets; cvLabels = cell(numTestSets,1); cvScores = cell(numTestSets,1); for i = 1:numTestSets testIdx = test(cv,i); cvLabels{i} = species(testIdx); cvScores{i} = Scores(testIdx,:); end
cell 配列を使用して rocmetrics
オブジェクトを作成します。cell 配列を使用して真のラベルとスコアを指定すると、rocmetrics
で信頼区間が計算されます。
rocObj = rocmetrics(cvLabels,cvScores,Mdl.ClassNames);
TPR の ROC 曲線と信頼区間をプロットします。信頼区間を表示するために ShowConfidenceIntervals=true
を指定します。
plot(rocObj,ShowConfidenceIntervals=true)
各曲線の周囲に影付きの領域で信頼区間が示されます。setosa
の信頼区間は非ゼロの偽陽性率の幅が 0 であるため、プロットに setosa
に対する影付きの領域はありません。信頼区間は、学習セットとテスト セットでの分散によるモデルの不確かさを反映しています。
決定木モデル、一般化加法モデル、および単純ベイズ モデルの 3 種類の分類モデルに学習させます。ROC 曲線と AUC の値を使用して、テスト データ セットで 3 つのモデルの性能を比較します。
census1994
.mat
に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。
load census1994
census1994
には学習データ セット adultdata
およびテスト データ セット adulttest
が含まれています。応答変数 salary
の一意の値を表示します。
classNames = unique(adultdata.salary)
classNames = 2×1 categorical
<=50K
>50K
学習データ adultdata
を渡し、応答変数名 "salary"
を指定して、3 つのモデルに学習させます。名前と値の引数 ClassNames
を使用してクラスの順序を指定します。
MdlTree = fitctree(adultdata,"salary",ClassNames=classNames); MdlGAM = fitcgam(adultdata,"salary",ClassNames=classNames); MdlNB = fitcnb(adultdata,"salary",ClassNames=classNames);
学習済みモデルを使用して、テスト データ セット adulttest
の分類スコアを計算します。
[~,ScoresTree] = predict(MdlTree,adulttest); [~,ScoresGAM] = predict(MdlGAM,adulttest); [~,ScoresNB] = predict(MdlNB,adulttest);
各モデルの rocmetrics
オブジェクトを作成します。
rocTree = rocmetrics(adulttest.salary,ScoresTree,classNames); rocGAM = rocmetrics(adulttest.salary,ScoresGAM,classNames); rocNB = rocmetrics(adulttest.salary,ScoresNB,classNames);
各モデルの ROC 曲線をプロットします。関数 plot
は、既定ではクラス名と AUC の値を凡例に表示します。凡例にクラス名の代わりにモデル名を含めるには、関数 plot
から返される ROCCurve
オブジェクトの DisplayName
プロパティを変更します。
figure c = cell(3,1); g = cell(3,1); [c{1},g{1}] = plot(rocTree,ClassNames=classNames(1)); hold on [c{2},g{2}] = plot(rocGAM,ClassNames=classNames(1)); [c{3},g{3}] = plot(rocNB,ClassNames=classNames(1)); modelNames = ["Decision Tree Model", ... "Generalized Additive Model","Naive Bayes Model"]; for i = 1 : 3 c{i}.DisplayName = replace(c{i}.DisplayName, ... string(classNames(1)),modelNames(i)); g{i}(1).DisplayName = join([modelNames(i),"Operating Point"]); end hold off
AUC の値は、一般化加法モデル (MdlGAM
) が最も高く、決定木モデル (MdlTree
) が最も低くなっています。この結果は、MdlTree
と MdlNB
よりも MdlGAM
の方がテスト データ セットに対する平均的な性能が優れていることを示しています。
バイナリ分類モデルのモデル操作点と最適な操作点を特定します。最適な操作点に対応する新しいしきい値を使用して、テスト データ セットの観測値を分類します。
ionosphere
データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子 (X
) と、不良 (b
) または良好 (g
) という 351 個の二項反応 (Y
) が含まれています。
load ionosphere
データを学習セットとテスト セットに分割します。観測値の約 75% をサポート ベクター マシン (SVM) モデルの学習に使用し、観測値の約 25% を学習済みモデルの新しいデータでの性能の検定に使用します。データの分割には cvpartition
を使用します。
rng("default") % For reproducibility of the partition c = cvpartition(Y,Holdout=0.25); 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);
Mdl.ClassNames
に格納されているクラスの順序を表示します。
Mdl.ClassNames
ans = 2×1 cell
{'b'}
{'g'}
テスト セットの分類スコアを計算します。
[Y1,Scores] = predict(Mdl,XTest);
YTest
の真のラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Mdl.ClassNames
を使用して Scores
の列の順序を指定します。
rocObj = rocmetrics(YTest,Scores,Mdl.ClassNames);
modelOperatingPoint
関数を使用してモデル操作点を特定します。
modelpt = modelOperatingPoint(rocObj)
modelpt=2×4 table
ClassName Threshold FalsePositiveRate TruePositiveRate
_________ _________ _________________ ________________
{'b'} 1.2654 0.017857 0.58065
{'g'} 0.21911 0.41935 0.98214
この関数はどのように機能するでしょうか。関数 predict
は、スコアが高い方のクラスに観測値を分類します。これは、調整スコアが非負になるクラスに対応します。つまり、関数 predict
で使用される標準のしきい値は 0 です。rocObj
の Metrics
プロパティのクラス b
に対する行から、最も小さい非負のしきい値をもつ点を見つけます。曲線上の点は、しきい値 0 の性能と同じ性能を示します。
idx_b = strcmp(rocObj.Metrics.ClassName,"b"); X = rocObj.Metrics(idx_b,:).FalsePositiveRate; Y = rocObj.Metrics(idx_b,:).TruePositiveRate; T = rocObj.Metrics(idx_b,:).Threshold; idx_model = find(T>=0,1,"last"); modelptb = [T(idx_model) X(idx_model) Y(idx_model)]
modelptb = 1×3
1.2654 0.0179 0.5806
バイナリ分類の場合、平均誤分類コストが最小になる最適な操作点は、ROC 曲線が傾き の直線と交差する点になります。ここで、 は次のように定義されます。
.
は陽性クラスの観測値の総数、 は陰性クラスの観測値の総数です。cost
の値はコスト行列 の成分です。
cost(N|P)
は陽性クラスを陰性クラスとして誤分類するコスト、cost(P|N)
は陰性クラスを陽性クラスとして誤分類するコストです。Mdl.ClassNames
のクラスの順序に従い、陽性クラス P
はクラス b
に対応します。
傾き の線と交差する ROC 曲線上の点から、完璧な ROC 曲線が通る完璧な分類器の点 (FPR = 0
、TPR = 1
) に最も近い点を選択します。
陽性クラス b
の最適な操作点を特定します。
p = sum(strcmp(YTest,"b")); n = sum(~strcmp(YTest,"b")); cost = Mdl.Cost; m = (cost(2,1)-cost(2,2))/(cost(1,2)-cost(1,1))*n/p; [~,idx_opt] = min(X - Y/m); optpt = [T(idx_opt) X(idx_opt) Y(idx_opt)]
optpt = 1×3
-1.1978 0.1071 0.7742
plot
関数を使用して、クラス b
の ROC 曲線をプロットします。これにより、既定でモデル操作点も表示されます。
figure
r = plot(rocObj,ClassNames="b");
モデル操作点と最適な操作点を表示します。
modelpt(3,:) = table({"b optimal"},optpt(1),optpt(2),optpt(3))
modelpt=3×4 table
ClassName Threshold FalsePositiveRate TruePositiveRate
_______________ _________ _________________ ________________
{'b' } 1.2654 0.017857 0.58065
{'g' } 0.21911 0.41935 0.98214
{["b optimal"]} -1.1978 0.10714 0.77419
最適な操作点を使用して XTest
を分類します。調整スコアが最適なしきい値以上である観測値を陽性クラス b
に割り当てます。
s = Scores(:,1) - Scores(:,2); idx_b_opt = (s >= optpt(1)); Y2 = cell(size(YTest)); Y2(idx_b_opt) = {'b'}; Y2(~idx_b_opt) = {'g'};
Y1
のラベル (関数 predict
からのラベル) と Y2
のラベル (最適なしきい値 optpt(1)
からのラベル) が異なる観測値の調整スコアを表示します。
s(~strcmp(Y1,Y2))
ans = 11×1
-1.1703
-0.8445
-0.8235
-0.4546
-1.0719
-0.4612
-0.2191
-1.1978
-1.0114
-1.1552
-0.4525
⋮
調整スコアが 0
未満で最適なしきい値以上である観測値が 11 個あります。
マルチクラス分類問題用のモデルに学習させた後、目的のクラスのみに対応する rocmetrics
オブジェクトを作成します。指定したしきい値についてのパフォーマンス メトリクスを rocmetrics
で計算するように FixedMetricValues
を指定します。
標本ファイル CreditRating_Historical.dat
を table に読み取ります。予測子データは、法人顧客リストの財務比率と業種の情報で構成されます。応答変数は、格付機関が割り当てた格付けから構成されます。データ セットの最初の数行をプレビューします。
creditrating = readtable("CreditRating_Historical.dat");
head(creditrating)
ID WC_TA RE_TA EBIT_TA MVE_BVTD S_TA Industry Rating _____ ______ ______ _______ ________ _____ ________ _______ 62394 0.013 0.104 0.036 0.447 0.142 3 {'BB' } 48608 0.232 0.335 0.062 1.969 0.281 8 {'A' } 42444 0.311 0.367 0.074 1.935 0.366 1 {'A' } 48631 0.194 0.263 0.062 1.017 0.228 4 {'BBB'} 43768 0.121 0.413 0.057 3.647 0.466 12 {'AAA'} 39255 -0.117 -0.799 0.01 0.179 0.082 4 {'CCC'} 62236 0.087 0.158 0.049 0.816 0.324 2 {'BBB'} 39354 0.005 0.181 0.034 2.597 0.388 7 {'AA' }
変数 ID
の各値は一意の顧客 ID であるため (つまり、length(unique(creditrating.ID))
は creditrating
に含まれる観測値の数に等しい)、変数 ID
は予測子としては適切ではありません。変数 ID
を table から削除し、変数 Industry
を categorical
変数に変換します。
creditrating = removevars(creditrating,"ID");
creditrating.Industry = categorical(creditrating.Industry);
データを学習セットとテスト セットに分割します。観測値の約 80% をニューラル ネットワーク モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能のテストに使用します。データの分割には cvpartition
を使用します。
rng("default") % For reproducibility of the partition c = cvpartition(creditrating.Rating,"Holdout",0.20); trainingIndices = training(c); % Indices for the training set testIndices = test(c); % Indices for the test set creditTrain = creditrating(trainingIndices,:); creditTest = creditrating(testIndices,:);
学習データ creditTrain
を関数 fitcnet
に渡して、ニューラル ネットワーク分類器に学習させます。
Mdl = fitcnet(creditTrain,"Rating");
テスト セットの観測値について、分類スコアを計算し、格付けを予測します。
[labels,Scores] = predict(Mdl,creditTest);
ニューラル ネットワーク分類器の分類スコアは事後確率に対応します。
モデルの B
、BB
、および BBB
の格付けのみを評価し、残りの格付けは無視するとします。
ClassNames
プロパティに格納されているモデルの格付けの順序を表示し、評価するクラスを特定します。
Mdl.ClassNames
ans = 7×1 cell
{'A' }
{'AA' }
{'AAA'}
{'B' }
{'BB' }
{'BBB'}
{'CCC'}
idx_Class = [4 5 6]; classesToEvaluate = Mdl.ClassNames(idx_Class);
3 つのクラス (B
、BB
、BBB
) の観測値のインデックスを特定します。
idx = ismember(creditTest.Rating,classesToEvaluate);
3 つのクラスの真のラベルとスコアを使用して rocmetrics
オブジェクトを作成します。指定したしきい値についてのパフォーマンス メトリクスを rocmetrics
で計算するように FixedMetricValues=1:-0.25:-1
を指定します。
thresholds = 1:-0.25:-1;
rocObj = rocmetrics(creditTest.Rating(idx),Scores(idx,idx_Class), ...
classesToEvaluate,FixedMetricValues=thresholds);
Metrics
プロパティに格納されている計算されたメトリクスを表示します。
rocObj.Metrics
ans=27×4 table
ClassName Threshold FalsePositiveRate TruePositiveRate
_________ _________ _________________ ________________
{'B' } 0.90259 0 0
{'B' } 0.75236 0 0.125
{'B' } 0.50135 0.010309 0.32812
{'B' } 0.27975 0.020619 0.40625
{'B' } 0.0026854 0.051546 0.57812
{'B' } -0.24615 0.10567 0.6875
{'B' } -0.4889 0.16753 0.76562
{'B' } -0.74968 0.51289 0.84375
{'B' } -0.9755 1 1
{'BB'} 0.96203 0 0
{'BB'} 0.75326 0.052434 0.18919
{'BB'} 0.50002 0.10487 0.47027
{'BB'} 0.25349 0.14981 0.61622
{'BB'} 0.0016854 0.22846 0.74595
{'BB'} -0.24906 0.34082 0.85946
{'BB'} -0.4971 0.46442 0.94054
⋮
Metrics
プロパティには、3 つの格付け B
、BB
、および BBB
の指定したしきい値についてのパフォーマンス メトリクスのみが格納されます。rocmetrics
で信頼区間を計算しない場合、UseNearestNeighbor
の既定値は true
です。したがって、指定した各しきい値について、rocmetrics
は指定された値に最も近い調整スコアの値を選択し、その最も近い値をしきい値として使用します。各クラスの指定したしきい値と実際に使用されるしきい値を表示します。
idx_B = strcmp(rocObj.Metrics.ClassName,"B"); idx_BB = strcmp(rocObj.Metrics.ClassName,"BB"); idx_BBB = strcmp(rocObj.Metrics.ClassName,"BBB"); table(thresholds',rocObj.Metrics.Threshold(idx_B), ... rocObj.Metrics.Threshold(idx_BB), ... rocObj.Metrics.Threshold(idx_BBB), ... VariableNames=["Fixed Threshold";string(classesToEvaluate)])
ans=9×4 table
Fixed Threshold B BB BBB
_______________ _________ _________ _________
1 0.90259 0.96203 0.93785
0.75 0.75236 0.75326 0.75037
0.5 0.50135 0.50002 0.50124
0.25 0.27975 0.25349 0.25269
0 0.0026854 0.0016854 0.0082706
-0.25 -0.24615 -0.24906 -0.22453
-0.5 -0.4889 -0.4971 -0.49678
-0.75 -0.74968 -0.74705 -0.74867
-1 -0.9755 -0.93785 -0.9734
詳細
ROC 曲線は、分類スコアのさまざまなしきい値についての真陽性率と偽陽性率の関係を示します。
真陽性率と偽陽性率は次のように定義されます。
真陽性率 (TPR) (再現率または感度とも呼ばれる) —
TP/(TP+FN)
。ここで、TP は真陽性の数、FN は偽陰性の数です。偽陽性率 (FPR) (フォールアウトまたは 1 - 特異度とも呼ばれる) —
FP/(TN+FP)
。ここで、FP は偽陽性の数、TN は真陰性の数です。
ROC 曲線の各点は、特定のしきい値についての TPR と FPR の値のペアに対応します。しきい値を変化させてさまざまな TPR と FPR の値のペアを求め、それらのペアを使用して ROC 曲線を作成できます。rocmetrics
は、各クラスについて、すべての異なる調整スコアの値をしきい値として使用して ROC 曲線を作成します。
マルチクラス分類問題の場合、rocmetrics
は、バイナリ問題がクラスごとに 1 つになるように一連の 1 対他のバイナリ分類問題を定式化し、対応するバイナリ問題を使用して各クラスの ROC 曲線を求めます。それぞれのバイナリ問題において、1 つのクラスが陽性で残りが陰性であると仮定されます。
バイナリ分類問題で分類スコアを行列として指定した場合、rocmetrics
は 1 対他のバイナリ分類問題を 2 つ定式化します。rocmetrics
は、それらの問題のそれぞれで 1 つのクラスを陽性クラス、他のクラスを陰性クラスとして扱い、2 つの ROC 曲線を求めます。その曲線のいずれかを使用してバイナリ分類問題を評価します。
詳細については、ROC 曲線とパフォーマンス メトリクスを参照してください。
ROC 曲線の下の領域 (AUC) は、ROC 曲線の FPR
= 0
から FPR
= 1
までの FPR に対する積分 (TPR の値) に対応します。
AUC は、可能なすべてのしきい値についての集約した性能測定を提供します。AUC の値は 0
から 1
までの範囲で表され、AUC の値が大きいほど分類器の性能が高いことを示します。
1 対他 (OVA) 符号化設計は、マルチクラス分類問題を一連のバイナリ分類問題に縮小します。この符号化設計では、各バイナリ分類で 1 つのクラスを陽性として扱い、残りのクラスを陰性として扱います。rocmetrics
は、マルチクラス分類に OVA 符号化設計を使用し、各クラスについての性能をそのクラスが陽性であるバイナリ分類を使用して評価します。
たとえば、3 つのクラスに対する OVA 符号化設計では 3 つのバイナリ分類を定式化します。
各行はクラスに対応し、各列はバイナリ分類問題に対応します。1 番目のバイナリ分類では、クラス 1 が陽性クラスで残りのクラスは陰性であると仮定しています。rocmetrics
は、1 番目のクラスについての性能を 1 番目のバイナリ分類問題を使用して評価します。
モデル操作点は、標準のしきい値に対応する FPR と TPR を表します。
標準のしきい値は、rocmetrics
オブジェクトの作成時に指定された引数 Scores
(分類スコア) の入力形式に応じて次のように決まります。
Scores
を行列として指定した場合、rocmetrics
はScores
の値がマルチクラス分類問題のスコアであると仮定し、調整スコアの値を使用します。マルチクラス分類モデルでは、スコアが最も高いクラスに観測値を分類します。これは、調整スコアの非負のスコアに対応します。したがって、しきい値は0
になります。Scores
を列ベクトルとして指定した場合、rocmetrics
はScores
の値がClassNames
で指定されたクラスの事後確率であると仮定します。バイナリ分類モデルでは、事後確率が高い方のクラス、つまり事後確率が0.5
よりも高いクラスに観測値を分類します。したがって、しきい値は0.5
になります。
バイナリ分類問題の場合、Scores
を 2 列の行列または列ベクトルとして指定できます。ただし、分類スコアが事後確率でない場合は、Scores
を行列として指定する必要があります。バイナリ分類器では、スコアが高い方のクラスに観測値を分類します。これは、調整スコアが非負になるクラスと等価です。そのため、バイナリ分類器に対して Scores
を行列として指定すると、マルチクラス分類器に適用される方式と同じ方式を使用して、rocmetrics
で正しいモデル操作点を特定できます。事後確率でない分類スコアをベクトルとして指定した場合は、モデル操作点のしきい値として常に 0.5
が使用されるため、rocmetrics
で正しいモデル操作点を識別できません。
関数 plot
は、各 ROC 曲線のモデル操作点に塗りつぶされた円のマーカーを表示します (ShowModelOperatingPoint
を参照)。関数では標準のしきい値に対応する点が選択されます。曲線に標準のしきい値に対するデータ点がない場合、関数は標準のしきい値より大きい最小のしきい値をもつ点を特定します。曲線上の点は、標準のしきい値の性能と同じ性能を示します。
"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。
以下のように仮定します。
mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応する符号。M は K 行 B 列の行列であり、K はクラスの数、B はバイナリ学習器の数です。
sj は観測値に対するバイナリ学習器 j のスコア。
g はバイナリ損失関数。
は観測値の予測クラス。
ソフトウェアでは 2 つの復号化方式をサポートしています。
関数 predict
、resubPredict
、および kfoldPredict
は、それぞれの観測値とクラスについて、argmin
の目的関数の符号反転値を 2 番目の出力引数 (NegLoss
) として返します。
次の表は、サポートされる損失関数をまとめたものです。ここで、yj は特定のバイナリ学習器のクラス ラベル (集合 {–1,1,0} 内)、sj は観測値 j のスコア、g(yj,sj) はバイナリ損失関数です。
値 | 説明 | スコア領域 | g(yj,sj) |
---|---|---|---|
"binodeviance" | 二項分布からの逸脱度 | (–∞,∞) | log[1 + exp(–2yjsj)]/[2log(2)] |
"exponential" | 指数 | (–∞,∞) | exp(–yjsj)/2 |
"hamming" | ハミング | [0,1] または (–∞,∞) | [1 – sign(yjsj)]/2 |
"hinge" | ヒンジ | (–∞,∞) | max(0,1 – yjsj)/2 |
"linear" | 線形 | (–∞,∞) | (1 – yjsj)/2 |
"logit" | ロジスティック | (–∞,∞) | log[1 + exp(–yjsj)]/[2log(2)] |
"quadratic" | 2 次 | [0,1] | [1 – yj(2sj – 1)]2/2 |
yj = 0 のときに損失が 0.5 になるようにバイナリ損失が正規化され、バイナリ学習器の平均が集計に使用されます[1]。
ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss
および predict
の名前と値の引数 LossFun
により指定) とバイナリ損失を混同しないでください。
アルゴリズム
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
から返されるメトリクスの値と等しくなります。
参照
[1] Allwein, E., R. Schapire, and Y. Singer. “Reducing multiclass to binary: A unifying approach for margin classifiers.” Journal of Machine Learning Research. Vol. 1, 2000, pp. 113–141.
[2] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recog. Lett. Vol. 30, Issue 3, 2009, pp. 285–297.
[3] Escalera, S., O. Pujol, and P. Radeva. “On the decoding process in ternary error-correcting output codes.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 32, Issue 7, 2010, pp. 120–134.
[4] Fawcett, T. “ROC Graphs: Notes and Practical Considerations for Researchers”, Machine Learning 31, no. 1 (2004): 1–38.
[5] 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.
[6] Davis, J., and M. Goadrich. “The Relationship Between Precision-Recall and ROC Curves.” Proceedings of ICML ’06, 2006, pp. 233–240.
[7] 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.
[8] Huang, Y., M. S. Pepe, and Z. Feng. “Evaluating the Predictiveness of a Continuous Marker.” U. Washington Biostatistics Paper Series, 2006, 250–61.
[9] Briggs, W. M., and R. Zaretzki. “The Skill Plot: A Graphical Technique for Evaluating Continuous Diagnostic Tests.” Biometrics 64, no. 1 (2008): 250–256.
[10] Bettinger, R. “Cost-Sensitive Classifier Selection Using the ROC Convex Hull Method.” SAS Institute, 2003.
[11] DiCiccio, Thomas J., and Bradley Efron. “Bootstrap Confidence Intervals.” Statistical Science 11, no. 3 (1996): 189–228.
[12] Efron, Bradley, and Robert J. Tibshirani. An Introduction to the Bootstrap. New York: Chapman & Hall, 1993.
[13] Efron, Bradley. The Jackknife, the Bootstrap and Other Resampling Plans. Philadelphia: The Society for Industrial and Applied Mathematics, 1982.
[14] Davison, A. C., and D. V. Hinkley. Bootstrap Methods and Their Applications. Cambridge University Press, 1997.
拡張機能
ブートストラップ反復を並列実行するには、rocmetrics
オブジェクトを作成するときに名前と値の引数 BootstrapOptions
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
たとえば、次のようにします。NumBootstraps=1000,BootstrapOptions=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2022a で導入rocmetrics
は、Labels
、Scores
、および ClassNames
の代わりに、予測子データとクラス ラベルを含む学習済み分類モデルを入力として受け入れます。モデルは学習済み交差検証分類モデルにすることもでき、その場合は予測子データとラベルは必要ありません。
rocmetrics
に変更と拡張がいくつかあります。
新しい
auc
関数は、いくつかの名前付き曲線の AUC を計算します。rocmetrics
オブジェクトのAUC
プロパティはなくなりました。新しい
modelOperatingPoint
関数は、各クラスのモデルの性能を返します。plot
関数の名前と値の引数AverageROCType
はAverageCurveType
に名前が変わり、ROC 曲線だけでなく非 ROC 曲線にも適用されます。plot
関数の名前と値の引数ShowModelOperatingPoint
を使用してモデル操作点をプロットできます。平均化されていない曲線だけでなく、平均化された曲線についても操作点が表示されます。average
関数が拡張され、任意の 2 つのメトリクスの平均を計算できるようになっています。rocmetrics
の名前と値の引数AdditionalMetrics
に新しい値が追加されています。'f1score'
は F1 スコアを計算します。'precision'
は'ppv'
および'prec'
と同じです。'all'
はサポートされているすべてのメトリクスを計算します。addMetrics
関数の入力引数metrics
は、rocmetrics
の名前と値の引数AdditionalMetrics
と同じ新しい値を取ります。
名前と値の引数 Cost
を指定して既定以外の誤分類コストを使用する場合で、KNN、判別分析、または単純ベイズ モデルのスコアを使用する場合は、名前と値の引数 ApplyCostToScores
を true
に設定します。これらのモデルではラベルの予測にスコアではなく予測分類コストが使用されるため、この設定によってスコアが関数で適切に変換されるようになります。
例については、誤分類コストによる判別分析分類器の ROC 曲線のプロットを参照してください。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)