Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

loss

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

説明

関数 loss は、線形回帰 (incrementalRegressionLinear オブジェクト) または線形バイナリ分類 (incrementalClassificationLinear オブジェクト) 用に構成されたインクリメンタル学習モデルの回帰損失または分類損失を返します。

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

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

L = loss(Mdl,X,Y,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、予測子データ行列の列が観測値に対応することを指定したり、分類損失関数を指定したりします。

すべて折りたたむ

次の 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;

バイナリ分類用のインクリメンタル線形 SVM モデルを作成します。クラス名、前のクラスの分布 (一様)、任意の係数、およびバイアス値を指定して loss の準備をします。メトリクス ウィンドウ サイズを観測値 1000 個に指定します。

p = size(X,2);
Beta = randn(p,1);
Bias = randn(1);
Mdl = incrementalClassificationLinear('Beta',Beta,'Bias',Bias,...
    'ClassNames',unique(Y),'Prior','uniform','MetricsWindowSize',1000);

MdlincrementalClassificationLinear モデルです。そのプロパティはすべて読み取り専用です。値を指定するための代替手段として、次のいずれかのアクションを実行してモデルを準備できます。

  • fitcsvm または fitclinear を使用して、データのサブセットで SVM モデルに学習させた後 (そのようなデータが利用可能な場合)、incrementalLearner を使用してモデルをインクリメンタル学習器に変換します。

  • fit を使用して、Mdl をデータに漸増的にあてはめます。

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

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

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

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

  4. すべてのパフォーマンス メトリクスを保存して、インクリメンタル学習中の進化を監視します。

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

% Incremental learning
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    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 は、ストリーム内のすべてのデータを適用させた incrementalClassificationLinear モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetrics は入力観測値でのモデルの性能をチェックし、モデルをその観測値にあてはめます。loss はメトリクスのウォームアップ期間に依存しないため、すべての反復について分類誤差を測定します。

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

figure;
h = plot(ce.Variables);
xlim([0 nchunk]);
ylim([0 0.05])
ylabel('Classification Error')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,ce.Properties.VariableNames)
xlabel('Iteration')

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

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

ロボット アームのデータ セットを読み込みます。

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

データ セットの詳細については、Description を表示してください。

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

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

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

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

  • すべての回帰係数およびバイアスを 0 に指定して、モデルを応答予測用に準備。

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

Mdl = incrementalRegressionLinear('MetricsWarmupPeriod',1000,'MetricsWindowSize',500,...
    'Metrics',maemetric,'Beta',zeros(p,1),'Bias',0,'EstimationPeriod',0)
Mdl = 
  incrementalRegressionLinear

               IsWarm: 0
              Metrics: [2×2 table]
    ResponseTransform: 'none'
                 Beta: [32×1 double]
                 Bias: 0
              Learner: 'svm'


  Properties, Methods

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

データ ストリームをシミュレートし、インクリメンタル学習を実行します。各反復で次を行います。

  • 50 個の観測値のチャンクを処理します。

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

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

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

  • 累積、ウィンドウ、およびチャンクのメトリクスを保存して、インクリメンタル学習中の進化を監視します。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
mae = array2table(zeros(nchunk,3),'VariableNames',["Cumulative" "Window" "Chunk"]);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    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

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

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

figure;
h = plot(mae.Variables);
ylabel('Mean Absolute Deviation')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(h,mae.Properties.VariableNames)

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

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

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

  • updateMetrics は、ウィンドウ メトリクスを 500 個の観測値の処理後に計算

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

入力引数

すべて折りたたむ

インクリメンタル学習モデル。incrementalClassificationLinear または incrementalRegressionLinear モデル オブジェクトとして指定するか、直接作成するか、または関数 incrementalLearner を使用して、サポートされている従来式の学習済み機械学習モデルを変換して作成します。詳細については、学習問題に対応するリファレンス ページを参照してください。

Mdl は、観測値のバッチでの損失を計算するように準備されなければなりません。

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

  • そうでない場合、Mdl が次の基準を満たすように、直接指定するか、fit または updateMetricsAndFit を使用してデータにあてはめなければなりません。

    • MdlincrementalRegressionLinear モデルである場合、そのモデル係数 Mdl.Beta およびバイアス Mdl.Bias は空でない配列でなければなりません。

    • MdlincrementalClassificationLinear モデルである場合、そのモデル係数 Mdl.Beta およびバイアス Mdl.Bias は空でない配列でなければならず、クラス名のセット Mdl.ClassNames は 2 つのクラスを含んでいなければなりません。また、前のクラスの分布 Mdl.Prior は既知の値を含んでいなければなりません。

    • オブジェクト タイプにかかわらず、関数が予測子データを標準化するようにモデルを構成した場合、予測子の平均 Mdl.Mu および標準偏差 Mdl.Sigma は空でない配列でなければなりません。

損失を計算するための予測子データのバッチ。n 個の観測値および Mdl.NumPredictors 予測子変数の浮動小数点行列として指定します。名前と値のペアの引数 'ObservationsIn' の値は、変数と観測値の方向を決定します。

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

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

メモ

loss は、浮動小数点の入力予測子データのみをサポートしています。入力モデル Mdl がカテゴリカル データにあてはめられた、変換された従来型の学習済みモデルを表す場合、dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換し、すべてのダミー変数行列とその他の数値予測子を連結します。詳細は、ダミー変数を参照してください。

データ型: single | double

損失を計算するラベルのバッチ。分類問題では、categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。回帰問題では、浮動小数点ベクトルとして指定します。

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

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

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

  • 入力モデル MdlClassNames プロパティが空でない場合、次の条件が適用されます。

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

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

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

名前と値のペアの引数

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

例: 'ObservationsIn','columns','Weights',W は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W に格納されていることを指定します。

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

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

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

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

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

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

    lossval = lossfcn(C,S,W)

    ここで、

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

    • 関数名 (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 列の数値ベクトルです。

  • 回帰問題: 次の表は、MdlincrementalRegressionLinear モデルであるときに使用可能な損失関数の一覧です。対応する文字ベクトルまたは 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

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。

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

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

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

データ型: double | single

出力引数

すべて折りたたむ

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

詳細

すべて折りたたむ

分類損失

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

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

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

  • n は標本サイズです。

  • バイナリ分類は以下です。

    • yj は観測されたクラス ラベルです。陰性クラスを示す -1 または陽性クラスを示す 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).
分類誤差"classiferror"

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

これは重み付きの誤分類観測値の比率です。y^j は、事後確率が最大であるクラスに対応するクラス ラベルです。I{x} はインジケーター関数です。

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

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

Comparison of classification losses for different loss functions

回帰損失

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

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

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

  • n は標本サイズです。

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

  • f(Xj) = β0 + xjβ は、予測子データ X の観測値 j の予測値です。ここで、β0 はバイアス、β は係数のベクトルです。

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

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

損失関数LossFun の値
イプシロン不感応損失"epsiloninsensitive"

L=max[0,|yf(x)|ε].

平均二乗誤差"mse"

L=[yf(x)]2.

アルゴリズム

すべて折りたたむ

観測値の重み

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

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

R2020b で導入