Main Content

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)

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

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

      • C は n 行 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 によって異なります。

    詳細

    すべて折りたたむ

    分類損失

    "分類損失" 関数は分類モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。

    以下のシナリオを考えます。

    • L は加重平均分類損失です。

    • n は標本サイズです。

    • yj は観測されたクラス ラベルです。陰性クラスを示す -1 または陽性クラスを示す 1 (あるいは、ClassNames プロパティの最初のクラスを示す -1 または 2 番目のクラスを示す 1) を使用して符号化されます。

    • f(Xj) は予測子データ X の観測値 (行) j に対する陽性クラスの分類スコアです。

    • mj = yjf(Xj) は、yj に対応するクラスに観測値 j を分類する分類スコアです。正の値の mj は正しい分類を示しており、平均損失に対する寄与は大きくありません。負の値の mj は正しくない分類を示しており、平均損失に大きく寄与します。

    • 観測値 j の重みは wj です。

    この状況では、名前と値の引数 LossFun を使用して指定できる、サポートされる損失関数は次の表のようになります。

    損失関数LossFun の値
    二項分布からの逸脱度"binodeviance"L=j=1nwjlog{1+exp[2mj]}.
    指数損失"exponential"L=j=1nwjexp(mj).
    10 進数の誤分類率"classiferror"

    L=j=1nwjI{y^jyj},

    ここで、y^j はスコアが最大であるクラスに対応するクラス ラベル、I{·} はインジケーター関数です。

    ヒンジ損失"hinge"L=j=1nwjmax{0,1mj}.
    ロジット損失"logit"L=j=1nwjlog(1+exp(mj)).
    二次損失"quadratic"L=j=1nwj(1mj)2.

    関数 loss で加重平均損失を計算する際、スコアが NaN の観測値は省略されません。そのため、予測子データ X に欠損値があり、名前と値の引数 LossFun"classiferror" として指定されていない場合に、lossNaN が返されることがあります。ほとんどの場合、データ セットに予測子の欠損がなければ、関数 lossNaN が返されることはありません。

    次の図では、1 つの観測値のスコア m に対する損失関数を比較しています。いくつかの関数は、点 (0,1) を通過するように正規化されています。

    Comparison of classification losses for different loss functions

    回帰損失

    "回帰損失" 関数は、回帰モデルの予測誤差を評価します。複数のモデルで同じタイプの損失を比較した場合、損失が低い方が予測モデルとして優れていることになります。

    以下のシナリオを考えます。

    • L は加重平均分類損失です。

    • n は標本サイズです。

    • yj は、観測値 j の観測された応答です。

    • f(Xj) は、予測子データ X の観測値 j の予測値です。

    • 観測値 j の重みは wj です。

    この状況では、名前と値の引数 LossFun を使用して指定できる、サポートされる損失関数は次の表のようになります。

    損失関数LossFun の値
    イプシロン不感応損失"epsiloninsensitive"L=max[0,|yf(x)|ε].
    平均二乗誤差"mse"L=[yf(x)]2.

    関数 loss で加重平均損失を計算する際、予測が NaN の観測値は省略されません。そのため、予測子データ X に欠損値がある場合に lossNaN が返されることがあります。ほとんどの場合、データ セットに予測子の欠損がなければ、関数 lossNaN が返されることはありません。

    アルゴリズム

    すべて折りたたむ

    観測値の重み

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

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

    バージョン履歴

    R2022a で導入