Main Content

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 に格納された K 行 B 列の符号化行列です。

      • 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)

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

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

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

    • S は、予測分類スコアの n 行 K 列の数値行列です。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 はモデルの品質を示す尺度です。解釈は損失関数と加重スキームによって異なります。

    詳細

    すべて折りたたむ

    分類誤差

    "分類誤差" は次のような形式になります。

    L=j=1nwjej,

    ここで

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

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

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

    バイナリ損失

    "バイナリ損失" は、バイナリ学習器がどの程度の精度で観測値をクラスに分類するかを決定する、クラスと分類スコアの関数です。ソフトウェアでバイナリ損失をどのように集計して各観測値の予測クラスを判定するかは、ECOC モデルの "復号化方式" で指定します。

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

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

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

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

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

    ソフトウェアでは 2 つの復号化方式をサポートしています。

    • "損失に基づく復号化" [2] (Decoding'lossbased') — 観測値の予測クラスは、すべてのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

      k^=argmink1Bj=1B|mkj|g(mkj,sj).

    • "損失に重みを付けた復号化" [3] (Decoding'lossweighted') — 観測値の予測クラスは、対応するクラスのバイナリ学習器におけるバイナリ損失の平均が最小になるクラスに対応します。

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

      分母はクラス k のバイナリ学習器の数に対応します。[1]によると、すべてのクラスの損失値が同じダイナミック レンジに収まるので、損失に重みを付けた復号化では分類精度が向上します。

    関数 predictresubPredict、および 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 により指定) とバイナリ損失を混同しないでください。

    アルゴリズム

    すべて折りたたむ

    観測値の重み

    事前クラス確率分布が既知の場合 (つまり、事前分布が経験的分布でない場合)、loss は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれの事前クラス確率であることを前提としています。

    クラスの事前確率分布が経験的分布の場合、ソフトウェアは、loss が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。

    参照

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