メインコンテンツ

updateMetricsAndFit

ECOC インクリメンタル学習分類モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習

R2022a 以降

説明

ストリーミング データが与えられると、updateMetricsAndFit は、最初に、入力データの updateMetrics を呼び出して、インクリメンタル学習用の構成済みのマルチクラス誤り訂正出力符号 (ECOC) 分類モデル (incrementalClassificationECOC オブジェクト) のパフォーマンスを評価します。次に、updateMetricsAndFit は、fit を呼び出して、モデルをそのデータに当てはめます。言い換えると、updateMetricsAndFit"逐次予測評価" を実行します。データの各入力チャンクをテスト セットとして扱い、累積的に測定されたパフォーマンス メトリクスと指定したウィンドウにおけるパフォーマンス メトリクスを追跡します[1]

updateMetricsAndFit は、モデルのパフォーマンス メトリクスを更新し、データの各チャンクでモデルに学習させる簡単な方法を提供します。また、updateMetrics を呼び出してから fit を呼び出して、個別に操作を実行することもできます。これにより柔軟性を高めることができます (たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます)。

Mdl = updateMetricsAndFit(Mdl,X,Y) は、インクリメンタル学習モデル Mdl を返します。これは、入力インクリメンタル学習モデル Mdl であり、次の変更が行われます。

  1. updateMetricsAndFit は、入力予測子と応答データ (それぞれ XY) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarmtrue) の場合、updateMetricsAndFit は以前に計算されたメトリクスを上書きし、Metrics プロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFit は代わりに MetricsNaN 値を保存します。

  2. updateMetricsAndFit は、変更されたモデルを入力データに当てはめ、更新されたバイナリ学習器と構成を出力モデル Mdl に格納します。

Mdl = updateMetricsAndFit(Mdl,X,Y,Name=Value) は、1 つ以上の名前と値の引数によって指定された追加オプションを使用します。たとえば、予測子データ行列の列が観測値に対応するように指定したり、観測値の重みを設定したりできます。

すべて折りたたむ

クラスの最大数を指定してインクリメンタル ECOC 学習器を準備します。関数 updateMetricsAndFit を使用して、モデルの性能をストリーミング データで追跡してモデルをデータに当てはめる操作を 1 回の呼び出しで行います。

incrementalClassificationECOC を呼び出してインクリメンタル学習用の ECOC 分類モデルを作成し、データ内の予測される最大クラス数を 5 と指定します。

Mdl = incrementalClassificationECOC(MaxNumClasses=5)
Mdl = 
  incrementalClassificationECOC

            IsWarm: 0
           Metrics: [1×2 table]
        ClassNames: [1×0 double]
    ScoreTransform: 'none'
    BinaryLearners: {10×1 cell}
        CodingName: 'onevsone'
          Decoding: 'lossweighted'


  Properties, Methods

MdlincrementalClassificationECOC モデル オブジェクトです。そのプロパティはすべて読み取り専用です。

Mdl は、他の演算の実行に使用する前に、データに当てはめなければなりません。

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

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

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

各反復で次のアクションを実行してインクリメンタル学習を実装します。

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

  • 前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。

  • 1 番目のバイナリ学習器の 1 番目のモデル係数 β11、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認します。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
mc = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]);
beta11 = zeros(nchunk,1);      

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx));
    mc{j,:} = Mdl.Metrics{"ClassificationError",:};
    beta11(j) = Mdl.BinaryLearners{1}.Beta(1);
end

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

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

t = tiledlayout(2,1);
nexttile
plot(beta11)
ylabel("\beta_{11}")
xlim([0 nchunk])
nexttile
plot(mc.Variables)
xlim([0 nchunk])
ylabel("Classification Error")
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,"--")
legend(mc.Properties.VariableNames)
xlabel(t,"Iteration")

Figure contains 2 axes objects. Axes object 1 with ylabel \beta_{11} contains an object of type line. Axes object 2 with ylabel Classification Error contains 3 objects of type line, constantline. These objects represent Cumulative, Window.

このプロットは、updateMetricsAndFit が次のアクションを実行することを示しています。

  • β11 をインクリメンタル学習のすべての反復で当てはめます。

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

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

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

fitcecoc を使用して ECOC 分類モデルに学習させ、incrementalLearner を使用してインクリメンタル学習器に変換します。updateMetricsAndFit を使用して、モデルの性能をストリーミング データで追跡してモデルをストリーミング データに当てはめる操作を 1 回の呼び出しで行います。updateMetricsAndFit を呼び出すときに、観測値の方向と観測値の重みを指定します。

データの読み込みと前処理

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

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

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

静止している被験者 (Y <= 2) のデータが、移動している被験者のデータの倍の品質であると仮定します。静止している被験者の観測値に重み 2 を割り当て、移動している被験者の観測値に重み 1 を割り当てる重み変数を作成します。

W = ones(n,1) + (Y <= 2);

ECOC 分類モデルの学習

ECOC 分類モデルをデータの半分の無作為標本に当てはめます。

idxtt = randsample([true false],n,true);
TTMdl = fitcecoc(X(idxtt,:),Y(idxtt),Weights=W(idxtt))
TTMdl = 
  ClassificationECOC
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [1 2 3 4 5]
           ScoreTransform: 'none'
           BinaryLearners: {10×1 cell}
               CodingName: 'onevsone'


  Properties, Methods

TTMdl は従来式の学習済み ECOC 分類モデルを表す ClassificationECOC モデル オブジェクトです。

学習済みモデルの変換

従来式の学習済みモデルをインクリメンタル学習用のモデルに変換します。

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationECOC

            IsWarm: 1
           Metrics: [1×2 table]
        ClassNames: [1 2 3 4 5]
    ScoreTransform: 'none'
    BinaryLearners: {10×1 cell}
        CodingName: 'onevsone'
          Decoding: 'lossweighted'


  Properties, Methods

IncrementalMdlincrementalClassificationECOC モデル オブジェクトです。クラス名が IncrementalMdl.ClassNames で指定されているため、インクリメンタル学習で見つかるラベルは IncrementalMdl.ClassNames のいずれかでなければなりません。

パフォーマンス メトリクスの追跡とモデルの当てはめ

関数 updateMetricsAndFit を使用して、残りのデータに対してインクリメンタル学習を実行します。予測子行列を転置し、updateMetricsAndFit を呼び出すときにデータの方向を指定します。各反復で次を行います。

  1. 50 個の観測値を一度に処理して、データ ストリームをシミュレートします。

  2. updateMetricsAndFit を呼び出し、観測値の入力チャンクを所与として、モデルのパフォーマンス メトリクスの累積とウィンドウを更新し、モデルをデータに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。観測値の向きを列方向に指定し、観測値の重みを指定します。

  3. 誤分類誤差率を保存します。

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
mc = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]);
Xil = X(idxil,:)';
Yil = Y(idxil);
Wil = W(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(:,idx),Yil(idx), ...
        Weights=Wil(idx),ObservationsIn="columns");
    mc{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationECOC モデル オブジェクトです。

誤分類誤差率のトレース プロットを作成します。

plot(mc.Variables)
xlim([0 nchunk])
ylabel("Classification Error")
legend(mc.Properties.VariableNames)
xlabel("Iteration")

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

累積の損失は最初に変動した後に 0.03 近辺で安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。

入力引数

すべて折りたたむ

パフォーマンスの測定とデータへの当てはめが行われるインクリメンタル学習モデル。incrementalClassificationECOC モデル オブジェクトとして指定します。Mdl は、incrementalClassificationECOC を直接呼び出して作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner で変換して作成することもできます。

Mdl.IsWarmfalse の場合、updateMetricsAndFit はモデルのパフォーマンスを追跡しません。詳細については、パフォーマンス メトリクスを参照してください。

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

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

メモ

  • Mdl.NumPredictors = 0 の場合、updateMetricsAndFitX から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors から変化すると、updateMetricsAndFit がエラーを生成します。

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

データ型: single | double

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

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

次の状況のいずれかまたは両方に該当する場合、updateMetricsAndFit からエラーが発行されます。

  • Y に新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationECOC の引数 MaxNumClasses および ClassNames を参照)。

  • 入力モデル MdlClassNames プロパティが空以外で、YMdl.ClassNames のデータ型が異なる。

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

メモ

観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN) 値を含む場合、updateMetricsAndFit はその観測値を無視します。したがって、updateMetricsAndFitn 個よりも少ない観測値を使用してモデル パフォーマンスを計算し、更新したモデルを作成します。ここで nX 内の観測値数です。

名前と値の引数

すべて折りたたむ

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

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

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

例: ObservationsIn="columns"

データ型: char | string

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

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

正規化方式を含む詳細については、観測値の重みを参照してください。

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

データ型: double | single

出力引数

すべて折りたたむ

更新されたインクリメンタル学習用の ECOC 分類モデル。入力モデル Mdl と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationECOC として返されます。

モデルがウォームでない場合、updateMetricsAndFit はパフォーマンス メトリクスを計算しません。その結果、MdlMetrics プロパティは、NaN 値で構成された状態を完全に維持します。モデルがウォームの場合、updateMetricsAndFit は、新しいデータ XY における累積およびウィンドウのパフォーマンス メトリクスを計算し、Mdl.Metrics の対応する要素を上書きします。詳細については、パフォーマンス メトリクスを参照してください。

incrementalClassificationECOC を使用して入力モデル Mdl を作成する際、想定されるすべてのクラスが名前と値の引数 ClassNames を使用して指定されていない場合、想定されるクラスで未処理のクラスが Y に含まれていると、updateMetricsAndFit は次のアクションを実行します。

  1. Y 内の新しいラベルを Mdl.ClassNames の末尾に追加します。

  2. Mdl.Prior を更新された経験的クラス分布の長さ c のベクトルに拡張します。ここで、cMdl.ClassNames 内のクラスの数です。

アルゴリズム

すべて折りたたむ

参照

[1] Bifet, Albert, Ricard Gavaldá, Geoffrey Holmes, and Bernhard Pfahringer. Machine Learning for Data Streams with Practical Example in MOA. Cambridge, MA: The MIT Press, 2007.

拡張機能

すべて展開する

バージョン履歴

R2022a で導入