メインコンテンツ

loss

データのバッチでのカーネル インクリメンタル学習モデルの損失

R2022a 以降

説明

loss は、カーネル回帰 (incrementalRegressionKernel オブジェクト) またはバイナリ カーネル分類 (incrementalClassificationKernel オブジェクト) 用に構成されたインクリメンタル学習モデルの回帰損失または分類損失を返します。

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

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

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

すべて折りたたむ

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

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

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

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

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

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

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

応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

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

p = size(X,2);
Mdl = incrementalClassificationKernel(MetricsWindowSize=1000);
initobs = 10;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

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

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

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

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

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

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

% Preallocation
numObsPerChunk = 50;
nchunk = floor((n - initobs)/numObsPerChunk);
ce = array2table(zeros(nchunk,3),VariableNames=["Cumulative","Window","Loss"]);

% 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));
    ce{j,["Cumulative","Window"]} = Mdl.Metrics{"ClassificationError",:};
    ce{j,"Loss"} = loss(Mdl,X(idx,:),Y(idx));
    Mdl = fit(Mdl,X(idx,:),Y(idx));
end

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

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

plot(ce.Variables)
xlim([0 nchunk])
ylabel("Classification Error")
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"--")
legend(ce.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, Loss.

黄色の線は、入力データの各チャンクの分類誤差を表します。メトリクスのウォームアップ期間後、Mdl は累積およびウィンドウ メトリクスを追跡します。累積およびバッチ損失は、関数 fit が入力データにインクリメンタル モデルを当てはめるにつれて収束します。

ストリーミング データに回帰用のインクリメンタル学習モデルを当てはめ、入力データのバッチの平均絶対偏差 (MAD) を計算します。

ロボット アームのデータ セットを読み込みます。標本サイズ n と予測子変数の数 p を取得します。

load robotarm
n = numel(ytrain);
p = size(Xtrain,2);

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

回帰用のインクリメンタル カーネル モデルを作成します。次のようにモデルを構成します。

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

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

  • 平均絶対偏差 (MAD) を追跡して、モデルの性能を測定します。新しい各観測値の絶対誤差を測定する無名関数を作成します。名前 MeanAbsoluteError とそれに対応する関数を含む構造体配列を作成します。

  • モデルを最初の 10 個の観測値に当てはめて応答予測用に構成します。

maefcn = @(z,zfit,w)(abs(z - zfit));
maemetric = struct(MeanAbsoluteError=maefcn);

Mdl = incrementalRegressionKernel(MetricsWarmupPeriod=1000,MetricsWindowSize=500, ...
    Metrics=maemetric);
initobs = 10;
Mdl = fit(Mdl,Xtrain(1:initobs,:),ytrain(1:initobs));

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

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

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

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

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

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

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

% Preallocation
numObsPerChunk = 50;
nchunk = floor((n - initobs)/numObsPerChunk);
mae = 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,Xtrain(idx,:),ytrain(idx));
    mae{j,1:2} = Mdl.Metrics{"MeanAbsoluteError",:};
    mae{j,3} = loss(Mdl,Xtrain(idx,:),ytrain(idx),LossFun=@(x,y,w)mean(maefcn(x,y,w)));
    Mdl = fit(Mdl,Xtrain(idx,:),ytrain(idx));
end

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

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

plot(mae.Variables)
ylabel("Mean Absolute Deviation")
xlabel("Iteration")
xlim([0 nchunk])
xline(Mdl.EstimationPeriod/numObsPerChunk,"-.")
xline((Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod)/numObsPerChunk,"--")
legend(mae.Properties.VariableNames)

Figure contains an axes object. The axes object with xlabel Iteration, ylabel Mean Absolute Deviation contains 5 objects of type line, constantline. These objects represent Cumulative, Window, Chunk.

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

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

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

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

  • Mdl が観測値の予測のためにインクリメンタル学習の初めから構成されたため、loss はデータの入力チャンクごとに MAD を計算できます。

入力引数

すべて折りたたむ

インクリメンタル学習モデル。incrementalClassificationKernel または incrementalRegressionKernel というモデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。

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

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

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

予測子データのバッチ。n 個の観測値と Mdl.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。

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

メモ

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

データ型: single | double

応答 (ラベル) のバッチ。分類問題については、categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。回帰問題については、浮動小数点ベクトルとして指定します。

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

分類問題では次のようになります。

  • loss はバイナリ分類のみをサポートします。

  • YMdl.ClassNames のメンバーではないラベルを含む場合、loss はエラーを生成します。

  • YMdl.ClassNames のデータ型は同じでなければなりません。

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

名前と値の引数

すべて折りたたむ

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

例: LossFun="epsiloninsensitive",Weights=W は、イプシロン不感応損失を返し、観測値の重みをベクトル W として指定します。

損失関数。組み込みの損失関数名または関数ハンドルとして指定します。

  • 分類問題: 次の表は、MdlincrementalClassificationKernel モデルであるときに使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。

    名前説明
    "binodeviance"二項分布からの逸脱度
    "classiferror" (既定の設定)10 進数の誤分類率
    "exponential"指数損失
    "hinge"ヒンジ損失
    "logit"ロジスティック損失
    "quadratic"二次損失

    詳細については、分類損失を参照してください。

    ロジスティック回帰学習器は事後確率を分類スコアとして返しますが、SVM 学習器はそうではありません (predict を参照)。

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

    lossval = lossfcn(C,S,W)

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

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

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

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

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

  • 回帰問題: 次の表は、MdlincrementalRegressionKernel モデルであるときに使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。

    名前説明メトリクスをサポートする学習器
    "epsiloninsensitive"イプシロン不感応損失'svm'
    "mse" (既定の設定)重み付けされた平均二乗誤差'svm' および 'leastsquares'

    詳細については、回帰損失を参照してください。

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

    lossval = lossfcn(Y,YFit,W)

    • 出力引数 lossval は浮動小数点スカラーです。

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

    • Y は、観測応答の長さ n の数値ベクトルです。

    • YFit は、対応する予測応答の長さ n の数値ベクトルです。

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

例: LossFun="mse"

例: LossFun=@lossfcn

データ型: char | string | function_handle

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

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

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

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

データ型: double | single

出力引数

すべて折りたたむ

分類損失または回帰損失。数値スカラーとして返されます。L の解釈は WeightsLossFun によって異なります。

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

拡張機能

すべて展開する

バージョン履歴

R2022a で導入

すべて展開する