ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

kfoldLoss

交差検証済み ECOC モデルの分類損失

構文

loss = kfoldLoss(CVMdl)
loss = kfoldLoss(CVMdl,Name,Value)

説明

loss = kfoldLoss(CVMdl) は、交差検証済みの ECOC モデル (ClassificationPartitionedECOC) CVMdl で取得した分類損失を返します。kfoldLoss は、すべての分割について、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の分類損失を計算します。CVMdl.X には、両方の観測値のセットが含まれます。

loss = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の名前と値のペアの引数で指定された追加オプションを使用して、分類損失を返します。たとえば、分割の数、復号化スキームまたは詳細レベルを指定します。

すべて折りたたむ

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

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

サポート ベクター マシン (SVM) バイナリ分類器を使用して、ECOC モデルの学習と交差検証を行います。SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(X,Y,'CrossVal','on','Learners',t,'ClassNames',classOrder);

CVMdlClassificationPartitionedECOC モデルです。既定では、10 分割交差検証が実行されます。名前と値のペアの引数 'KFold' を使用して異なる分割数を指定できます。

平均分類誤差を推定します。

L = kfoldLoss(CVMdl)
L = 0.0400

分割の平均分類誤差は 4 %です。

あるいは、kfoldLoss 内の名前と値のペアの引数 'Mode','individual' を指定することで各分割の損失を取得できます。

分類損失は分類器の品質の測定です。十分には機能しない分割を判別するため、各分割の損失を表示します。

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

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

SVM バイナリ分類器を使用して ECOC モデルを学習させます。8 分割の交差検証を使用し、SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(X,Y,'KFold',8,'Learners',t,'ClassNames',classOrder);

すべての分割の平均分類損失と各分割の損失を推定します。

loss = kfoldLoss(CVMdl)
loss = 0.0333
losses = kfoldLoss(CVMdl,'Mode','individual')
losses = 8×1

    0.0556
    0.0526
    0.1579
         0
         0
         0
         0
         0

3 番目の分割は、他の分割よりはるかに高い割合で観測値を誤分類します。

名前と値のペアの引数 'Folds' を指定して、十分に機能する分割の平均分類損失を取得します。

newloss = kfoldLoss(CVMdl,'Folds',[1:2 4:8])
newloss = 0.0153

合計分類損失は、元のサイズの約半分になりました。

バイナリ分類器のパラメーターまたは符号化設計を調整することを検討し、すべての分割の性能が改善したか確認します。

モデルが通常は観測値を正しく分類するかどうかを調べるだけでなく、モデルがどの程度正しく観測値をその予測されたクラスに分類するかを調べることもできます。このタイプのモデルの品質を調べる方法の 1 つは、カスタム損失関数を kfoldLoss に渡すことです。

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

load fisheriris
X = meas;
Y = categorical(species);
classOrder = unique(Y)  % Class order
classOrder = 3x1 categorical array
     setosa 
     versicolor 
     virginica 

rng(1) % For reproducibility

SVM バイナリ分類器を使用して、ECOC モデルの学習と交差検証を行います。SVM テンプレートを使用して予測子を標準化し、クラスの順序を指定します。

t = templateSVM('Standardize',1);
CVMdl = fitcecoc(X,Y,'CrossVal','on','Learners',t,'ClassNames',classOrder);

CVMdlClassificationPartitionedECOC モデルです。既定では、10 分割交差検証が実行されます。名前と値のペアの引数 'KFold' を使用して異なる分割数を指定できます。

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

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

交差検証されたカスタム損失の計算

kfoldLoss(CVMdl,'LossFun',lossfun)
ans = 0.0101

検証分割観測値の平均最小バイナリ損失は 0.0101 です。

入力引数

すべて折りたたむ

交差検証 ECOC モデル。ClassificationPartitionedECOC モデルとして指定します。ClassificationPartitionedECOC モデルは 2 つの方法で作成できます。

  • 学習済みの ECOC モデル (ClassificationECOC) を crossval に渡します。

  • fitcecoc を使用して ECOC モデルに学習をさせ、交差検証の名前と値のペアの引数 'CrossVal''CVPartition''Holdout''KFold''Leaveout' のいずれかを指定します。

名前と値のペアの引数

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

例: kfoldLoss(CVMdl,'Folds',[1 3 5]) は、分類損失の計算に 1 番目、3 番目および 5 番目の分割のみを使用することを指定します。

バイナリ学習器の損失関数。'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 モデルの検定標本ラベルの予測を参照してください。

既定の設定では、すべてのバイナリ学習器が

  • SVM である場合、または SVM 学習器の線形分類モデルまたはカーネル分類モデルのいずれかである場合、BinaryLoss'hinge'

  • AdaboostM1 または GentleBoost によって学習させたアンサンブルの場合、BinaryLoss'exponential'

  • LogitBoost によって学習させたアンサンブルの場合、BinaryLoss'binodeviance'

  • ロジスティック回帰学習器の線形分類モデルまたはカーネル分類モデルである場合、またはクラス事後確率を予測するように指定した場合 (つまり fitcecoc'FitPosterior',1 を設定した場合)、BinaryLoss'quadratic'

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

例: 'BinaryLoss','binodeviance'

データ型: char | string | 関数ハンドル

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

例: 'Decoding','lossbased'

予測の分割インデックス。'Folds' および正の整数の数値ベクトルで構成されるコンマ区切りのペアとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

予測用の Folds で指定された分割のみが使用されます。

例: 'Folds',[1 4 10]

データ型: single | double

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

  • 組み込み関数 'classiferror' を指定します。この場合、損失関数は分類誤差です。

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

    n は学習データの観測値数 (CVMdl.NumObservations)、K はクラス数 (numel(CVMdl.ClassNames)) であると仮定します。使用する関数では lossvalue =lossfun(C,S,W,Cost) というシグネチャが必要です。ここで

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

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

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

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

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

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

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

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

データ型: char | string | 関数ハンドル

出力の集約レベル。'Mode''average' または 'individual' から構成されるコンマ区切りのペアとして指定します。

次の表は値を説明します。

説明
'average'出力は、すべての分割の平均を表すスカラー値です。
'individual'出力は、分割ごとに 1 つずつの値が含まれている長さ k のベクトルです。k は分割数です。

例: 'Mode','individual'

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

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

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

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

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

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

例: 'Verbose',1

データ型: single | double

出力引数

すべて折りたたむ

分類損失。数値スカラーまたは数値列ベクトルとして返されます。

Mode'average' である場合、loss はすべての分割の平均分類損失です。それ以外の場合、loss は各分割の分類損失が含まれている k 行 1 列の数値列ベクトルです。k は分割数です。

詳細

すべて折りたたむ

分類誤差

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

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 で導入