メインコンテンツ

loss

データのバッチでの ECOC インクリメンタル学習分類モデルの損失

R2022a 以降

説明

loss は、構成されたインクリメンタル学習用のマルチクラス誤り訂正出力符号 (ECOC) 分類モデル (incrementalClassificationECOC オブジェクト) の分類損失を返します。

データ ストリームでのモデルの性能を測定し、結果を出力モデルに保存するには、updateMetrics または updateMetricsAndFit を呼び出します。

L = loss(Mdl,X,Y) は、予測子データ X および対応する応答 Y のバッチを使用して、インクリメンタル学習用の ECOC 分類モデル Mdl の分類誤差を返します。

L = loss(Mdl,X,Y,Name=Value) は、1 つ以上の名前と値の引数によって指定された追加オプションを使用します。たとえば、復号化方式や分類損失関数を指定できます。

すべて折りたたむ

ストリーミング データでのインクリメンタル モデルの性能を 3 通りの方法で測定します。

  • 累積メトリクスで、インクリメンタル学習の開始以降の性能を測定します。

  • ウィンドウ メトリクスで、指定した観測値ウィンドウでの性能を測定します。指定したウィンドウをモデルが処理するたびにメトリクスが更新されます。

  • 関数 loss で、指定したデータのバッチについてのみ性能を測定します。

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

load humanactivity
n = numel(actid);
rng(1) % For reproducibility
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

データ セットの詳細については、コマンド ラインで Description を入力してください。

インクリメンタル学習用の ECOC 分類モデルを作成します。クラス名を指定し、メトリクス ウィンドウ サイズを観測値 1000 個に指定します。モデルを最初の 10 個の観測値に当てはめて loss 用に構成します。

Mdl = incrementalClassificationECOC(ClassNames=unique(Y),MetricsWindowSize=1000);
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

MdlincrementalClassificationECOC モデルです。そのプロパティはすべて読み取り専用です。

データ ストリームをシミュレートし、100 個の観測値の入力チャンクごとに次のアクションを実行します。

  1. updateMetrics を呼び出して、累積性能および観測値ウィンドウ内での性能を測定します。前のインクリメンタル モデルを新しいモデルで上書きして、パフォーマンス メトリクスを追跡します。

  2. loss を呼び出して、入力チャンクでのモデルの性能を測定します。

  3. fit を呼び出して、モデルを入力チャンクに当てはめます。前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。

  4. すべてのパフォーマンス メトリクスを保存して、インクリメンタル学習中にそれらがどのように進化するかを確認します。

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
mc = array2table(zeros(nchunk,3),VariableNames=["Cumulative","Window","Chunk"]);

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    mc{j,["Cumulative","Window"]} = Mdl.Metrics{"ClassificationError",:};
    mc{j,"Chunk"} = loss(Mdl,X(idx,:),Y(idx));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetrics は入力観測値でのモデルの性能をチェックし、関数 fit はモデルをそれらの観測値に当てはめます。loss はメトリクスのウォームアップ期間に依存しないため、すべてのチャンクについて分類誤差を測定します。

パフォーマンス メトリクスが学習中にどのように進化するかを確認するには、それらをプロットします。

plot(mc.Variables)
xlim([0 nchunk])
ylabel("Classification Error")
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"--")
grid on
legend(mc.Properties.VariableNames)
xlabel("Iteration")

Figure contains an axes object. The axes object with xlabel Iteration, ylabel Classification Error contains 4 objects of type line, constantline. These objects represent Cumulative, Window, Chunk.

黄色の線は、入力データの各チャンクの分類誤差を表します。メトリクスのウォームアップ期間後、Mdl は累積およびウィンドウ メトリクスを追跡します。

インクリメンタル学習用の ECOC 分類モデルをストリーミング データに当てはめ、データの入力チャンクで最小の平均バイナリ損失を計算します。

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

load humanactivity
n = numel(actid);
rng(1) % For reproducibility
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

データ セットの詳細については、コマンド ラインで Description を入力してください。

インクリメンタル学習用の ECOC 分類モデルを作成します。次のようにモデルを構成します。

  • クラス名を指定します。

  • メトリクスのウォームアップ期間を観測値 1000 個に指定します。

  • メトリクス ウィンドウ サイズを観測値 2000 個に指定します。

  • 最小の平均バイナリ損失を追跡してモデルの性能を測定します。新しい各観測値の最小の平均バイナリ損失を測定する無名関数を作成します。名前 MinimalLoss とそれに対応する関数ハンドルを含む構造体配列を作成します。

  • モデルを最初の 10 個の観測値に当てはめて分類損失を計算します。

tolerance = 1e-10;
minimalBinaryLoss = @(~,S,~)min(-S,[],2);
ce = struct("MinimalLoss",minimalBinaryLoss);

Mdl = incrementalClassificationECOC(ClassNames=unique(Y), ...
    MetricsWarmupPeriod=1000,MetricsWindowSize=2000, ...
    Metrics=ce);
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

Mdl はインクリメンタル学習用に構成された incrementalClassificationECOC モデル オブジェクトです。

インクリメンタル学習を実行します。各反復で次を行います。

  • 100 個の観測値のチャンクを処理して、データ ストリームをシミュレートします。

  • updateMetrics を呼び出して、データの入力チャンクの累積メトリクスとウィンドウ メトリクスを計算します。前のインクリメンタル モデルを、前のメトリクスを上書きするように当てはめた新しいモデルで上書きします。

  • loss を呼び出して、データの入力チャンクの最小の平均バイナリ損失を計算します。累積メトリクスおよびウィンドウ メトリクスでは、カスタム損失が各観測値の損失を返す必要がありますが、loss ではチャンク全体での損失が必要です。チャンク内の損失の平均を計算します。

  • fit を呼び出して、データの入力チャンクにインクリメンタル モデルを当てはめます。

  • 累積、ウィンドウ、およびチャンクのメトリクスを保存して、インクリメンタル学習中にそれらがどのように進化するかを確認します。

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
tanloss = array2table(zeros(nchunk,3), ...
    VariableNames=["Cumulative","Window","Chunk"]);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
    iend   = min(n,numObsPerChunk*j + initobs);
    idx = ibegin:iend;    
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    tanloss{j,1:2} = Mdl.Metrics{"MinimalLoss",:};
    tanloss{j,3} = loss(Mdl,X(idx,:),Y(idx), ...
        LossFun=@(z,zfit,w)mean(minimalBinaryLoss(z,zfit,w)));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetrics は入力観測値でのモデルの性能をチェックし、関数 fit はモデルをその観測値に当てはめます。

パフォーマンス メトリクスをプロットして、インクリメンタル学習中にそれらがどのように進化するかを確認します。

semilogy(tanloss.Variables)
xlim([0 nchunk])
ylabel("Minimal Average Binary Loss")
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"-.")
xlabel("Iteration")
legend(tanloss.Properties.VariableNames)

Figure contains an axes object. The axes object with xlabel Iteration, ylabel Minimal Average Binary Loss contains 4 objects of type line, constantline. These objects represent Cumulative, Window, Chunk.

プロットは次のことを示しています。

  • updateMetrics は、パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算します。

  • updateMetrics は、累積メトリクスを各反復中に計算します。

  • updateMetrics は、ウィンドウ メトリクスを 2000 個の観測値 (20 回の反復) の処理後に計算します。

  • Mdl がインクリメンタル学習の初めから観測値を予測するように構成されているため、loss はデータの入力チャンクごとに最小の平均バイナリ損失を計算できます。

入力引数

すべて折りたたむ

インクリメンタル学習用の ECOC 分類モデル。incrementalClassificationECOC モデル オブジェクトとして指定します。Mdl は、incrementalClassificationECOC を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner で変換して作成することもできます。

観測値のバッチでラベルを予測するように Mdl を構成しなければなりません。

  • Mdl が従来式の学習済みモデルから変換されたモデルの場合、いかなる修正も行うことなくラベルを予測できます。

  • それ以外の場合、fit または updateMetricsAndFit を使用して Mdl をデータに当てはめる必要があります。

予測子データのバッチ。n 個の観測値と Mdl.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。名前と値の引数 ObservationsIn の値は、変数と観測値の方向を決定します。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。

観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) のラベルです。

メモ

loss は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。

データ型: single | double

ラベルのバッチ。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。

観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) のラベルです。

YMdl.ClassNames のメンバーではないラベルを含む場合、関数 loss はエラーを生成します。YMdl.ClassNames のデータ型は同じでなければなりません。

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

名前と値の引数

すべて折りたたむ

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

例: BinaryLoss="quadratic",Decoding="lossbased" は、バイナリ学習器の損失関数として 2 次関数を使用し、損失に基づく復号化方式をバイナリ損失の集計に使用するよう指定します。

バイナリ学習器損失関数。組み込みの損失関数の名前または関数ハンドルとして指定します。

  • 次の表で、組み込み関数について説明します。ここで、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)

    • MMdl.CodingMatrix に格納された KB 列の符号化行列です。

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

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

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

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

    カスタム バイナリ損失関数の例については、カスタム バイナリ損失関数の使用による ECOC モデルのテスト標本ラベルの予測を参照してください。この例は従来式の学習済みモデルの例です。この例で示しているように、インクリメンタル学習用のカスタム損失関数を定義できます。

詳細については、バイナリ損失を参照してください。

データ型: char | string | function_handle

復号化方式。"lossweighted" または "lossbased" として指定します。

ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの復号化方式で指定します。ソフトウェアでは 2 つの復号化方式をサポートしています。

  • "lossweighted" — 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の合計が最小になるクラスに対応します。

  • "lossbased" — 観測値の予測クラスは、バイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

詳細については、バイナリ損失を参照してください。

例: Decoding="lossbased"

データ型: char | string

損失関数。"classiferror" (分類誤差) またはカスタム損失関数の関数ハンドルとして指定します。

カスタム損失関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。

lossval = lossfcn(C,S,W)

  • 出力引数 lossvaln 行 1 列の浮動小数点ベクトルです。nX 内の観測値の個数です。lossval(j) の値は観測値 j の分類損失です。

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

  • CnK 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。K は異なるクラスの個数 (numel(Mdl.ClassNames)) で、列の順序は ClassNames プロパティのクラスの順序に対応します。C を作成するには、指定されたデータの各観測値について観測値 p がクラス q に属する場合に C(p,q) = 1 を設定します。行 p の他の要素を 0 に設定します。

  • S は、予測分類スコアの nK 列の数値行列です。Spredict の出力 NegLoss に似ています。ここで、行はデータの観測値に対応し、列の順序は ClassNames プロパティのクラスの順序に対応しています。S(p,q) は、クラス q に分類されている観測値 p の分類スコアです。

  • W は、観測値の重みの n 行 1 列の数値ベクトルです。

例: LossFun=@lossfcn

データ型: char | string | function_handle

予測子データにおける観測値の次元。"rows" または "columns" として指定します。

例: ObservationsIn="columns"

データ型: char | string

観測値の重みのバッチ。正の値の浮動小数点ベクトルとして指定します。loss は、Weights 内の対応する値を使用して入力データ内の観測値に重みを付けます。Weights のサイズは入力データ内の観測値の数 n と同じでなければなりません。

既定では Weightsones(n,1) です。

詳細については、観測値の重みを参照してください。

例: Weights=W は、観測値の重みをベクトル W として指定します。

データ型: double | single

出力引数

すべて折りたたむ

分類損失。数値スカラーとして返されます。L はモデルの品質を示す尺度です。解釈は損失関数と加重スキームによって異なります。

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

参照

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

拡張機能

すべて展開する

バージョン履歴

R2022a で導入