このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
rocmetrics
説明
分類モデルの性能を受信者動作特性 (ROC) 曲線またはその他のパフォーマンス メトリクスを使用して評価するには、rocmetrics
オブジェクトを作成します。rocmetrics
は、バイナリ問題とマルチクラス問題の両方をサポートします。
rocmetrics
は、各クラスについて、1 対他の ROC 曲線のパフォーマンス メトリクスを計算します。平均 ROC 曲線のメトリクスは、関数 average
を使用して計算できます。ROC 曲線のメトリクスを計算した後、関数 plot
を使用してそれらをプロットできます。
rocmetrics
は、ROC 曲線と ROC 曲線の下の領域 (AUC) を取得するために、既定では偽陽性率 (FPR) と真陽性率 (TPR) を計算します。追加のメトリクスを計算する場合は、オブジェクトの作成時に名前と値の引数 AdditionalMetrics
を指定するか、オブジェクトの作成後に関数 addMetrics
を呼び出して指定できます。計算されたメトリクスと AUC の値は、rocmetrics
オブジェクトの Metrics
プロパティと AUC
プロパティにそれぞれ格納されます。
rocmetrics
は、NumBootstraps
の値を正の整数に設定するか、真のクラス ラベル (Labels
)、分類スコア (Scores
)、および観測値の重み (Weights
) の交差検証データを指定すると、パフォーマンス メトリクスの点単位の信頼区間を計算します。詳細については、点単位の信頼区間を参照してください。
作成
構文
説明
は、rocObj
= rocmetrics(Labels
,Scores
,ClassNames
)Labels
の真のクラス ラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Labels
は長さ n のベクトルとして指定し、Scores
は n
行 K
列のサイズの行列として指定します。ここで、n
は観測値の数、K
はクラスの数です。ClassNames
は、Scores
における列の順序を指定します。
Metrics
プロパティと AUC
プロパティに、Scores
と ClassNames
を指定した各クラスについてのパフォーマンス メトリクスと AUC の値が格納されます。
Labels
と Scores
で交差検証データを cell 配列として指定すると、rocmetrics
はパフォーマンス メトリクスの信頼区間を計算します。
では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、rocObj
= rocmetrics(Labels
,Scores
,ClassNames
,Name=Value
)NumBootstraps=100
は、100 個のブートストラップ標本を抽出してパフォーマンス メトリクスの信頼区間を計算します。
入力引数
Labels
— 真のクラス ラベル
数値ベクトル | logical ベクトル | categorical ベクトル | 文字配列 | string 配列 | cell 配列
真のクラス ラベル。数値ベクトル、logical ベクトル、categorical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。これらのいずれかの型の cell 配列として、Labels
で交差検証データを指定することもできます。
Labels
または Labels{i}
の各行は、1 つの観測値の真のラベルを表します。
この引数は Labels
プロパティを設定します。
データ型: single
| double
| logical
| char
| string
| cell
Scores
— 分類スコア
数値行列 | 数値行列の 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
ClassNames
— クラス名
数値ベクトル | logical ベクトル | categorical ベクトル | 文字配列 | string 配列 | 文字ベクトルの cell 配列
クラス名。数値ベクトル、logical ベクトル、categorical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。ClassNames
のデータ型は Labels
の真のラベルと同じでなければなりません。ClassNames
の値は Labels
に含まれていなければなりません。
この引数は ClassNames
プロパティを設定します。
データ型: single
| double
| logical
| cell
| categorical
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: FixedMetric="FalsePositiveRate",FixedMetricValues=0:0.01:1
は、FPR の値を 0:0.01:1
で固定します。
AdditionalMetrics
— モデルの追加のパフォーマンス メトリクス
[]
(既定値) | 文字ベクトル | string 配列 | 関数ハンドル | cell 配列
追加で計算するモデルのパフォーマンス メトリクス。組み込みメトリクスの名前の文字ベクトルまたは 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"
陽性予測値 (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 列の行列に変換されます。詳細については、誤分類コスト行列を参照してください。事前クラス確率 (
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
FixedMetric
— 固定のメトリクス
"Thresholds"
(既定値) | "FalsePositiveRate"
| "TruePositiveRate"
| AdditionalMetrics
で指定されたメトリクス
固定のメトリクス。"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
FixedMetricValues
— 固定のメトリクスの値
"all"
(既定値) | 数値ベクトル
固定のメトリクス (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
NaNFlag
— NaN
の条件
"omitnan"
(既定値) | "includenan"
NaN 条件。"omitnan"
または "includenan"
として指定します。
詳細については、NaN スコア値を参照してください。
例: NaNFlag="includenan"
データ型: char
| string
UseNearestNeighbor
— 最も近いメトリクスの値を使用するためのインジケーター
false
または 0
| true
または 1
最も近いメトリクスの値を使用するためのインジケーター。logical 0
(false
) または 1
(true
) として指定します。
logical
0
(false
) —rocmetrics
は、FixedMetric
のFixedMetricValues
で指定された固定のメトリクスの値に対応する厳密なしきい値を使用します。logical
1
(true
) —rocmetrics
は、調整された入力スコアから、指定された固定のメトリクスの各値に対応するしきい値に最も近い値を特定します。
詳細については、しきい値、固定のメトリクス、固定のメトリクスの値を参照してください。
rocmetrics
で信頼区間を計算する場合、UseNearestNeighbor
の値は false
でなければなりません。それ以外の場合、既定値は true
です。
例: UseNearestNeighbor=false
データ型: logical
Cost
— 誤分類のコスト
正方行列
誤分類コスト。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=[0 2;1 0]
データ型: single
| double
Prior
— 事前クラス確率
"empirical"
(既定値) | "uniform"
| スカラー値のベクトル
事前クラス確率。次のいずれかとして指定します。
"empirical"
は真のクラス ラベルLabels
におけるクラスの頻度からクラス確率を決定します。観測値の重み (Weights
) を渡す場合、rocmetrics
はこの重みも使用してクラス確率を計算します。"uniform"
はすべてのクラス確率を均等に設定します。クラスごとに 1 つのスカラー値を含むスカラー値のベクトル。
ClassNames
でクラスの順序を指定します。Scores
の 1 つのクラスのみに対する分類スコアを指定する場合、Prior
の値は指定されたクラスの事前確率を表すPrior(1)
をもつ 2 要素のベクトルでなければなりません。
この引数は Prior
プロパティを設定します。
例: Prior="uniform"
データ型: single
| double
| char
| string
Weights
— 観測値の重み
正の値の数値ベクトル | 正の値の数値ベクトルを含む cell 配列
観測値の重み。正の値の数値ベクトルまたは正の値の数値ベクトルを含む cell 配列として指定します。
rocmetrics
は、Labels
および Scores
に含まれている観測値に Weights
の対応する値で重みを付けます。NumBootstraps
の値を正の整数に設定した場合、rocmetrics
は重みを多項分布抽出確率として使用して復元抽出します。
既定では、Weights
は 1 のベクトルまたは 1 のベクトルを含む cell 配列です。
この引数は Weights
プロパティを設定します。
データ型: single
| double
| cell
Alpha
— 有意水準
0.05 (既定値) | 範囲 (0,1)
のスカラー
点単位の信頼区間の有意水準。範囲 (0,1)
のスカラーとして指定します。
Alpha
を α と指定した場合、rocmetrics
はパフォーマンス メトリクスについての 100×(1 – α)% の点単位の信頼区間を計算します。
この引数は信頼区間の計算に関連します。そのため、Labels
、Scores
、および Weights
の交差検証データを指定した場合、または NumBootstraps
の値を正の整数に設定した場合のみ有効です。
例: Alpha=0.01
は 99% の信頼区間を指定します。
データ型: single
| double
BootstrapOptions
— 並列計算のブートストラップ オプション
statset("rocmetrics")
(既定値) | 構造体
並列計算のブートストラップ オプション。構造体として指定します。
ブートストラップ反復の並列計算、およびブートストラップ サンプリング時の乱数設定のオプションを指定できます。statset
を使用して BootstrapOptions
構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。
フィールド名 | フィールドの値 | 既定の設定 |
---|---|---|
UseParallel | ブートストラップ反復を並列計算する場合は、この値を | false |
UseSubstreams | 再生可能な方法で並列計算する場合は、この値を 再現性のある計算を行うには、 | false |
Streams |
|
|
この引数は、NumBootstraps
を正の整数として指定し、ブートストラッピングを使用して信頼区間を計算する場合のみ有効です。
このオプションには Parallel Computing Toolbox™ が必要です。
例: BootstrapOptions=statset(UseParallel=true)
データ型: struct
BootstrapType
— ブートストラップ信頼区間のタイプ
"bca"
(既定値) | "corrected percentile"
| "normal"
| "percentile"
| "student"
ブートストラップ信頼区間のタイプ。次の表のいずれかの値として指定します。
値 | 説明 |
---|---|
"bca" | BCa 法 (bias corrected and accelerated percentile method) [8][9]。この方法には、元の標本値未満のブートストラップ値の比率を使用して計算される z0 係数が含まれます。標本が塊状の場合に合理的な結果を得るために、z0 は元の標本値と同じブートストラップ値の半分を含めることで計算されます。 |
"corrected percentile" または "cper" | バイアス補正百分位数法[10] |
"normal" または "norm" | バイアスと標準誤差をブートストラップした正規近似区間[11] |
"percentile" または "per" | 基本の等百分位数法 |
"student" または "stud" | スチューデント化された信頼区間[8] |
この引数は、NumBootstraps
を正の整数として指定し、ブートストラッピングを使用して信頼区間を計算する場合のみ有効です。
例: BootstrapType="student"
データ型: char
| string
NumBootstraps
— 抽出するブートストラップ標本の数
0
(既定値) | 非負の整数スカラー
点単位の信頼区間の計算用に抽出するブートストラップ標本の数。非負の整数スカラーとして指定します。
NumBootstraps
を正の整数として指定すると、rocmetrics
は NumBootstraps
個のブートストラップ標本を使用します。各ブートストラップ標本を作成するために、関数は n
行の入力データから n
行を復元抽出で無作為に選択します。既定値の 0
は、rocmetrics
でブートストラッピングを使用しないことを意味します。
rocmetrics
は、交差検証データまたはブートストラップ標本のいずれかを使用して信頼区間を計算します。したがって、Labels
、Scores
、および Weights
の交差検証データを指定する場合、NumBootstraps
は 0
でなければなりません。
詳細については、点単位の信頼区間を参照してください。
例: NumBootstraps=500
データ型: single
| double
NumBootstrapsStudentizedSE
— スチューデント化された標準誤差推定用に抽出するブートストラップ標本の数
100
(既定値) | 正の整数スカラー
スチューデント化された標準誤差推定用に抽出するブートストラップ標本の数。正の整数スカラーとして指定します。
この引数は、NumBootstraps
を正の整数、BootstrapType
を "student"
として指定し、スチューデント化されたブートストラップ信頼区間を計算する場合のみ有効です。rocmetrics
は、スチューデント化された標準誤差推定を NumBootstrapsStudentizedSE
個のブートストラップ データ標本を使用して推定します。
例: NumBootstrapsStudentizedSE=500
データ型: single
| double
プロパティ
パフォーマンス メトリクス
AUC
— ROC 曲線の下の領域
数値ベクトル | 数値行列
この プロパティ は読み取り専用です。
ROC 曲線の下の領域 (AUC)。数値ベクトルまたは数値行列として指定します。
rocmetrics
は、1 対他の各 ROC 曲線 (つまり各クラス) について AUC を計算します。AUC
プロパティの値の列の順序は ClassNames
のクラスの順序と一致します。
バイナリ問題で Scores
を 2 列の行列として指定する場合、このプロパティは同一の AUC の値を含む 1
行 2
列のベクトルになります。バイナリ問題の場合、一方のクラスについての全体的なモデルの性能がもう一方のクラスについての性能と同じであるため、AUC の値が同一になります。
rocmetrics
で AUC の信頼区間を計算する場合、AUC
プロパティの値は、1 行目が AUC の値に対応し、2 行目と 3 行目が下限と上限にそれぞれ対応する行列になります。rocmetrics
は、パフォーマンス メトリクスの信頼区間も計算する場合で、FixedMetric
を "Thresholds"
(既定)、"FalsePositiveRate"
、または "TruePositiveRate"
に設定した場合に AUC の信頼区間を計算します。
データ型: single
| double
Metrics
— パフォーマンス メトリクス
テーブル
この プロパティ は読み取り専用です。
パフォーマンス メトリクス。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
オブジェクトを作成するときに、以下のプロパティを指定できます。
ClassNames
— クラス名
数値ベクトル | logical ベクトル | categorical ベクトル | 文字ベクトルの cell 配列
この プロパティ は読み取り専用です。
クラス名。数値ベクトル、logical ベクトル、categorical ベクトル、または文字ベクトルの cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 ClassNames
を参照してください。(文字配列または string 配列は文字ベクトルの cell 配列として扱われます。)
データ型: single
| double
| logical
| cell
| categorical
Cost
— 誤分類のコスト
正方行列
この プロパティ は読み取り専用です。
誤分類コスト。正方行列として指定します。
詳細については、このプロパティを設定する名前と値の引数 Cost
を参照してください。
データ型: single
| double
Labels
— 真のクラス ラベル
数値ベクトル | logical ベクトル | categorical ベクトル | cell 配列
この プロパティ は読み取り専用です。
真のクラス ラベル。数値ベクトル、logical ベクトル、categorical ベクトル、または文字ベクトルの cell 配列として指定します。交差検証データの場合は、これらのいずれかの型の cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 Labels
を参照してください。(文字配列または string 配列は文字ベクトルの cell 配列として扱われます。)
データ型: single
| double
| logical
| cell
| categorical
Prior
— 事前クラス確率
数値ベクトル
この プロパティ は読み取り専用です。
事前クラス確率。数値ベクトルとして指定します。
詳細については、このプロパティを設定する名前と値の引数 Prior
を参照してください。この引数を文字ベクトルまたは string スカラー ("empirical"
または "uniform"
) として指定すると、rocmetrics
は事前確率を計算し、Prior
プロパティを数値ベクトルとして格納します。
データ型: single
| double
Scores
— 分類スコア
数値行列 | 数値行列の cell 配列
この プロパティ は読み取り専用です。
分類スコア。数値行列または数値行列の cell 配列として指定します。
詳細については、このプロパティを設定する入力引数 Scores
を参照してください。
データ型: single
| double
| cell
Weights
— 観測値の重み
正の値の数値ベクトル | 正の値の数値ベクトルを含む cell 配列
この プロパティ は読み取り専用です。
観測値の重み。正の値の数値ベクトルまたは正の値の数値ベクトルを含む cell 配列として指定します。
詳細については、このプロパティを設定する名前と値の引数 Weights
を参照してください。
データ型: single
| double
| cell
オブジェクト関数
addMetrics | 分類の追加のパフォーマンス メトリクスの計算 |
average | マルチクラス問題における平均受信者動作特性 (ROC) 曲線のパフォーマンス メトリクスの計算 |
plot | 受信者動作特性 (ROC) 曲線やその他の性能曲線のプロット |
例
バイナリ分類器の 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 = 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)
関数 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))
マルチクラス分類器の 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
は、150
行 3
列のサイズの行列です。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")
塗りつぶされた円のマーカーはモデル操作点を示します。凡例に各曲線のクラスの名前と AUC の値が表示されます。
ベクトルとしてのスコアの指定
外れ値を含む生成された標本データについて、関数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
に対応するモデル操作点に塗りつぶされた円を表示します。関数 trapz
の台形法を使用して適合率-再現率曲線の下の領域を計算し、その値を凡例に表示します。
r = plot(rocObj,YAxisMetric="PositivePredictiveValue",XAxisMetric="TruePositiveRate"); hold on idx = find(rocObj.Metrics.Threshold>=f.ScoreThreshold,1,'last'); scatter(rocObj.Metrics.TruePositiveRate(idx), ... rocObj.Metrics.PositivePredictiveValue(idx), ... [],r.Color,"filled") xyData = rmmissing([r.XData r.YData]); auc = trapz(xyData(:,1),xyData(:,2)); legend(join([r.DisplayName " (AUC = " string(auc) ")"],""),"true Model Operating Point") xlabel("Recall") ylabel("Precision") title("Precision-Recall Curve") hold off
ブートストラッピングを使用した信頼区間の計算
ブートストラップ標本を使用して 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.1963 0 0 0 0 0 0 {'g'} 7.1963 0 0 0 0.022222 0 0.093023 {'g'} 6.2586 0 0 0 0.044444 0 0.11969 {'g'} 5.5722 0 0 0 0.066667 0.020988 0.16024 {'g'} 5.5639 0 0 0 0.088889 0.022635 0.18805 {'g'} 5.4615 0.04 0 0.22222 0.088889 0.022635 0.18805 {'g'} 5.3683 0.08 0 0.28 0.088889 0.022635 0.18805 {'g'} 5.1527 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 = 2x1 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 = 2x1 cell
{'b'}
{'g'}
検定セットの分類スコアを計算します。
[Y1,Scores] = predict(Mdl,XTest);
YTest
の真のラベルと Scores
の分類スコアを使用して rocmetrics
オブジェクトを作成します。Mdl.ClassNames
を使用して Scores
の列の順序を指定します。
rocObj = rocmetrics(YTest,Scores,Mdl.ClassNames);
rocObj
の Metrics
プロパティでクラス b
のモデル操作点を特定します。関数 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"); modelpt = [T(idx_model) X(idx_model) Y(idx_model)]
modelpt = 1×3
1.2637 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 曲線をプロットし、関数 scatter
を使用して最適な操作点を表示します。
figure r = plot(rocObj,ClassNames="b"); hold on scatter(optpt(2),optpt(3),"filled", ... DisplayName="b Optimal Operating Point");
モデル操作点と最適な操作点を表示します。
array2table([modelpt;optpt], ... RowNames=["Model Operating Point" "Optimal Operating Point"], ... VariableNames=["Threshold" "FalsePositiveRate" "TruePositiveRate"])
ans=2×3 table
Threshold FalsePositiveRate TruePositiveRate
_________ _________________ ________________
Model Operating Point 1.2637 0.017857 0.58065
Optimal Operating Point -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.1701
-0.8456
-0.8241
-0.4546
-1.0721
-0.4608
-0.2187
-1.1978
-1.0115
-1.1554
⋮
調整スコアが 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 = 7x1 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.89603 0 0
{'B' } 0.79673 0 0.09375
{'B' } 0.51297 0.007732 0.32812
{'B' } 0.25736 0.023196 0.46875
{'B' } 0.0072319 0.046392 0.57812
{'B' } -0.24796 0.10825 0.65625
{'B' } -0.49881 0.17784 0.76562
{'B' } -0.74969 0.50773 0.89062
{'B' } -0.9702 1 1
{'BB'} 0.96014 0 0
{'BB'} 0.75523 0.037453 0.18378
{'BB'} 0.50096 0.10487 0.45405
{'BB'} 0.25231 0.1573 0.60541
{'BB'} 0.0020216 0.23221 0.74595
{'BB'} -0.24909 0.33333 0.84324
{'BB'} -0.49987 0.46816 0.93514
⋮
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.89603 0.96014 0.92653
0.75 0.79673 0.75523 0.75067
0.5 0.51297 0.50096 0.50251
0.25 0.25736 0.25231 0.26095
0 0.0072319 0.0020216 0.017263
-0.25 -0.24796 -0.24909 -0.23961
-0.5 -0.49881 -0.49987 -0.4995
-0.75 -0.74969 -0.74988 -0.74884
-1 -0.9702 -0.92653 -0.97166
詳細
受信者動作特性 (ROC) 曲線
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 曲線の下の領域 (AUC) は、ROC 曲線の FPR
= 0
から FPR
= 1
までの FPR に対する積分 (TPR の値) に対応します。
AUC は、可能なすべてのしきい値についての集約した性能測定を提供します。AUC の値は 0
から 1
までの範囲で表され、AUC の値が大きいほど分類器の性能が高いことを示します。
1 対他 (OVA) 符号化設計
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
を参照)。関数では標準のしきい値に対応する点が選択されます。曲線に標準のしきい値に対するデータ点がない場合、関数は標準のしきい値より大きい最小のしきい値をもつ点を特定します。曲線上の点は、標準のしきい値の性能と同じ性能を示します。
アルゴリズム
マルチクラス分類問題の調整スコア
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] 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.
[8] DiCiccio, Thomas J., and Bradley Efron. “Bootstrap Confidence Intervals.” Statistical Science 11, no. 3 (1996): 189–228.
[9] Efron, Bradley, and Robert J. Tibshirani. An Introduction to the Bootstrap. New York: Chapman & Hall, 1993.
[10] Efron, Bradley. The Jackknife, the Bootstrap and Other Resampling Plans. Philadelphia: The Society for Industrial and Applied Mathematics, 1982.
[11] Davison, A. C., and D. V. Hinkley. Bootstrap Methods and Their Applications. Cambridge University Press, 1997.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
ブートストラップ反復を並列実行するには、rocmetrics
オブジェクトを作成するときに名前と値の引数 BootstrapOptions
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
たとえば、次のようにします。NumBootstraps=1000,BootstrapOptions=statset(UseParallel=true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2022a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)