Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

loss

マルチクラス誤り訂正出力符号 (ECOC) モデルの分類損失

説明

L = loss(Mdl,tbl,ResponseVarName) は、分類損失 (L) を返します。これは、tbl.ResponseVarName 内の真のクラス ラベルと比較して、学習済みのマルチクラス誤り訂正出力符号 (ECOC) モデル Mdltbl 内の予測子データをどの程度の精度で分類するかを表すスカラーです。既定では、loss分類誤差を使用して L を計算します。

L = loss(Mdl,tbl,Y) は、table tbl 内の予測子データと Y 内の真のクラス ラベルに対する分類損失を返します。

L = loss(Mdl,X,Y) は、行列 X 内の予測子データと Y 内の真のクラス ラベルに対する分類損失を返します。

L = loss(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、復号化方式、分類損失関数、詳細レベルなどを指定できます。

すべて折りたたむ

フィッシャーのアヤメのデータセットを読み込みます。予測子データ X、応答データ Y、および Y 内のクラスの順序を指定します。

load fisheriris
X = meas;
Y = categorical(species);
classOrder = unique(Y); % Class order
rng(1); % For reproducibility

SVM バイナリ分類器を使用して ECOC モデルを学習させます。15% のホールドアウト標本を指定し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',true);
PMdl = fitcecoc(X,Y,'Holdout',0.15,'Learners',t,'ClassNames',classOrder);
Mdl = PMdl.Trained{1};           % Extract trained, compact classifier

PMdlClassificationPartitionedECOC モデルです。これには Trained プロパティが含まれています。これは、学習セットを使用して学習をさせた CompactClassificationECOC モデルが格納されている、1 行 1 列の cell 配列です。

検定標本の分類誤差を推定します。これは既定の分類損失です。

testInds = test(PMdl.Partition);  % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);
L = loss(Mdl,XTest,YTest)
L = 0

ECOC モデルは、検定標本のアヤメをすべて正しく分類します。

各観測値の最小バイナリ損失を考慮するカスタム損失関数を使用して、ECOC モデルの品質を判別します。

フィッシャーのアヤメのデータセットを読み込みます。予測子データ X、応答データ Y、および Y 内のクラスの順序を指定します。

load fisheriris
X = meas;
Y = categorical(species);
classOrder = unique(Y);  % Class order
rng(1) % For reproducibility

SVM バイナリ分類器を使用して ECOC モデルを学習させます。15% のホールドアウト標本を指定し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を定義します。

t = templateSVM('Standardize',true);
PMdl = fitcecoc(X,Y,'Holdout',0.15,'Learners',t,'ClassNames',classOrder);
Mdl = PMdl.Trained{1};           % Extract trained, compact classifier

PMdlClassificationPartitionedECOC モデルです。これには Trained プロパティが含まれています。これは、学習セットを使用して学習をさせた CompactClassificationECOC モデルが格納されている、1 行 1 列の cell 配列です。

各観測値の最小損失を受け入れ、すべての観測値の最小損失の平均を求める、関数を作成します。S は、predict の出力 NegLoss に対応します。

lossfun = @(~,S,~,~)mean(min(-S,[],2));

検定標本のカスタム損失を計算します。

testInds = test(PMdl.Partition);  % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);
loss(Mdl,XTest,YTest,'LossFun',lossfun)
ans = 0.0033

検定標本観測値の平均最小バイナリ損失は 0.0033 です。

入力引数

すべて折りたたむ

完全またはコンパクトなマルチクラス ECOC モデル。ClassificationECOC または CompactClassificationECOC モデル オブジェクトを指定します。

完全またはコンパクトな ECOC モデルを作成する方法については、ClassificationECOC または CompactClassificationECOC を参照してください。

標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を tbl に含めることができます。tbl には、Mdl を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

table に格納されている標本データを使用して Mdl に学習をさせた場合、loss の入力データも table に含まれていなければなりません。

Mdl に学習をさせるときに、fitcecoc の名前と値のペアの引数 'Learners' で指定したテンプレート オブジェクトについて 'Standardize',true を設定したとします。この場合、対応するバイナリ学習器 j について、対応する Mdl.BinaryLearner{j}.Mu 内の平均および Mdl.BinaryLearner{j}.Sigma 内の標準偏差を使用して、新しい予測子データの列が標準化されます。

データ型: table

応答変数の名前。tbl 内の変数の名前で指定します。Mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が tbl.y として格納されている場合、ResponseVarName として 'y' を指定します。それ以外の場合、tbl の列は tbl.y を含めてすべて予測子として扱われます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

予測子データ。数値行列として指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。X の列内の変数は、分類器 Mdl に学習させた変数と同じでなければなりません。

X の行数は Y の行数と等しくなければなりません。

Mdl に学習をさせるときに、fitcecoc の名前と値のペアの引数 'Learners' で指定したテンプレート オブジェクトについて 'Standardize',true を設定したとします。この場合、対応するバイナリ学習器 j について、対応する Mdl.BinaryLearner{j}.Mu 内の平均および Mdl.BinaryLearner{j}.Sigma 内の標準偏差を使用して、新しい予測子データの列が標準化されます。

データ型: double | single

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y のデータ型は Mdl.ClassNames と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

Y の行数は tbl または X の行数と等しくなければなりません。

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

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: loss(Mdl,X,Y,'BinaryLoss','hinge','LossFun',@lossfun) は、バイナリ学習器の損失関数として 'hinge' を、全体的な損失関数としてカスタム関数ハンドル @lossfun を指定します。

バイナリ学習器の損失関数。'BinaryLoss' と組み込みの損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表で、組み込み関数について説明します。ここで、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 になるように正規化されます。また、各クラスについて平均のバイナリ損失が計算されます。

  • カスタム バイナリ損失関数の場合は関数ハンドルを指定します。たとえば、customFunction の場合は 'BinaryLoss',@customFunction を指定します。

    customFunction の形式は次のとおりです。

    bLoss = customFunction(M,s)
    ここで、

    • MMdl.CodingMatrix に格納された K 行 L 列のコーディング行列です。

    • s は、1 行 L 列の分類スコアの行ベクトルです。

    • bLoss は分類損失です。このスカラーは、特定のクラスのすべての学習器についてバイナリ損失を集計します。たとえば、平均バイナリ損失を使用して、各クラスの学習器の損失を集計できます。

    • K は、クラスの数です。

    • L は、バイナリ学習器の数です。

    カスタムなバイナリ損失関数を渡す例については、カスタム バイナリ損失関数の使用による ECOC モデルの検定標本ラベルの予測を参照してください。

BinaryLoss の既定値は、バイナリ学習器が返すスコアの範囲によって異なります。次の表で、特定の仮定に基づく BinaryLoss の既定値について説明します。

仮定既定値
すべてのバイナリ学習器が SVM であるか、SVM 学習器の線形またはカーネル分類モデルである。'hinge'
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。'exponential'
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。'binodeviance'
すべてのバイナリ学習器が、ロジスティック回帰学習器の線形またはカーネル分類モデルである。または、fitcecoc'FitPosterior',true を設定して、クラスの事後確率を予測するよう指定した。'quadratic'

既定値を確認するには、コマンド ラインでドット表記を使用して学習済みモデルの BinaryLoss プロパティを表示します。

例: 'BinaryLoss','binodeviance'

データ型: char | string | function_handle

バイナリ損失を集計する復号化方式。'Decoding''lossweighted' または 'lossbased' から構成されるコンマ区切りのペアとして指定します。詳細は、バイナリ損失を参照してください。

例: 'Decoding','lossbased'

損失関数。'LossFun''classiferror' または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 組み込み関数 'classiferror' を指定します。この場合、損失関数は分類誤差であり、誤分類された観測値の比率です。

  • または、関数ハンドル表記を使用して独自の関数を指定します。

    n = size(X,1) が標本サイズ、K がクラス数であると仮定します。関数には署名 lossvalue = lossfun(C,S,W,Cost) がなければなりません。ここで、次のようになります。

    • 出力引数 lossvalue はスカラーです。

    • 関数名 (lossfun) を指定します。

    • CnK 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序は Mdl.ClassNames のクラスの順序に対応します。

      C を作成するには、各行について観測値 p がクラス q に含まれている場合に C(p,q) = 1 を設定します。行 p の他のすべての要素を 0 に設定します。

    • S は、符号を反転したクラスの損失値が含まれている nK 列の数値行列です。各列は観測と対応しています。列の順序は Mdl.ClassNames のクラスの順序に対応します。入力 S は、predict の出力引数 NegLoss に似ています。

    • W は、観測値の重みの n 行 1 列の数値ベクトルです。W を渡す場合、その要素は正規化され、合計が 1 になります。

    • Cost は、誤分類コストの、KK 列の数値行列です。たとえば、Cost = ones(K) – eye(K) は、正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。

    'LossFun',@lossfun を使用して独自の関数を指定します。

データ型: char | string | function_handle

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。Mdl.BinaryLearners には ClassificationLinear モデルが格納されていなければなりません。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、実行時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns' を指定することはできません。

推定オプション。statset により返される 'Options' と構造体配列から構成されるコンマ区切りのペアとして指定します。

並列計算を起動するには、以下を行います。

  • Parallel Computing Toolbox™ ライセンスが必要です。

  • 'Options',statset('UseParallel',true) を指定します。

詳細レベル。'Verbose'0 または 1 から構成されるコンマ区切りのペアとして指定します。Verbose は、コマンド ウィンドウに表示される診断メッセージの量を制御します。

Verbose0 の場合、診断メッセージは表示されません。それ以外の場合は、診断メッセージが表示されます。

例: 'Verbose',1

データ型: single | double

観測値の重み。'Weights' と数値ベクトル、または tbl に含まれる変数の名前から構成されるコンマ区切りのペアとして指定します。重みを指定した場合、loss は重み付きの損失を計算します。

数値ベクトルで Weights を指定する場合、Weights のサイズは X または tbl の行数と等しくなければなりません。

tbl 内の変数名を Weights として指定する場合、文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みが tbl.w として格納されている場合、Weights として 'w' を指定します。それ以外の場合、tbl の列は tbl.w を含めてすべて予測子として扱われます。

独自の損失関数を (LossFun を使用して) 指定しない場合、Weights が正規化され、合計が各クラスの事前確率の値になります。

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

出力引数

すべて折りたたむ

分類損失。数値スカラーまたは行ベクトルとして返されます。L は汎化または再代入の品質の尺度です。解釈は損失関数と加重スキームによって異なりますが、一般に、優れた分類器の方が分類損失値が小さくなります。

Mdl.BinaryLearnersClassificationLinear モデルが含まれている場合、L は 1 行 ℓ 列のベクトルになります。ℓ は、線形分類モデル内の正則化強度の個数 (numel(Mdl.BinaryLearners{1}.Lambda)) です。値 L(j) は、正則化強度 Mdl.BinaryLearners{1}.Lambda(j) を使用して学習をさせたモデルの損失です。

それ以外の場合、L はスカラー値です。

詳細

すべて折りたたむ

分類誤差

"分類誤差" はバイナリ分類誤差の尺度で、次のような形式になります。

L=j=1nwjejj=1nwj,

ここで

  • wj は観測値 j の重みです。重みは再度正規化され、合計は 1 になります。

  • 観測 j の予測クラスが真のクラスと異なる場合、ej = 1 になり、それ以外の場合は 0 になります。

つまり、分類誤差は、分類器が誤分類した観測値の比率です。

バイナリ損失

"バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを判断する、クラスと分類スコアの関数です。

以下のように仮定します。

  • mkj は符号化設計行列 M の要素 (k,j)、つまりバイナリ学習器 j のクラス k に対応するコード。

  • sj は観測値に対するバイナリ学習器 j のスコア。

  • g はバイナリ損失関数。

  • k^ は観測値の予測クラス。

"損失に基づく復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の和が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。

k^=argminkj=1L|mkj|g(mkj,sj).

"損失に重みを付けた復号化" [Escalera 他] では、バイナリ学習器全体のバイナリ損失の平均が最小になるクラスにより、観測値の予測クラスが決まります。つまり、次のようになります。

k^=argminkj=1L|mkj|g(mkj,sj)j=1L|mkj|.

Allwein 他によると、すべてのクラスで損失値が同じ動的範囲に収まるので、損失に重みを付けた復号化では分類精度が向上します。

次の表は、サポートされる損失関数をまとめています。ここで、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 になるように正規化され、バイナリ学習器の平均を使用して集計されます [Allwein 他]

ECOC 分類器の全体的な性能の尺度である全体の分類損失 (オブジェクト関数 loss および predict の名前と値のペアの引数 'LossFun' により指定) とバイナリ損失を混同しないでください。

参照

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

[3] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recogn. Vol. 30, Issue 3, 2009, pp. 285–297.

拡張機能

R2014b で導入