メインコンテンツ

updateMetricsAndFit

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

R2021a 以降

説明

ストリーミング データが与えられると、updateMetricsAndFit は、最初に、入力データの updateMetrics を呼び出して、インクリメンタル学習用の構成済みの単純ベイズ分類モデル (incrementalClassificationNaiveBayes オブジェクト) のパフォーマンスを評価します。次に、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,'Weights',Weights) は、観測値の重み Weights も設定します。

すべて折りたたむ

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

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5)
Mdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 0
                   Metrics: [1×2 table]
                ClassNames: [1×0 double]
            ScoreTransform: 'none'
         DistributionNames: 'normal'
    DistributionParameters: {}


  Properties, Methods

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

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"]);
mu11 = 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{"MinimalCost",:};
    mu11(j + 1) = Mdl.DistributionParameters{1,1}(1);
end

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

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

t = tiledlayout(2,1);
nexttile
plot(mu11)
ylabel('\mu_{11}')
xlim([0 nchunk])
nexttile
h = plot(mc.Variables);
xlim([0 nchunk])
ylabel('Minimal Cost')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.')
legend(h,mc.Properties.VariableNames)
xlabel(t,'Iteration')

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

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

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

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

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

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

fitcnb を使用して単純ベイズ分類モデルに学習させ、それをインクリメンタル学習器に変換し、その性能をストリーミング データで追跡してデータに当てはめる操作を 1 回の呼び出しで行います。観測値の重みを指定します。

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

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

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

単純ベイズ分類モデルの学習

単純ベイズ分類モデルをデータの半分の無作為標本に当てはめます。

idxtt = randsample([true false],n,true);
TTMdl = fitcnb(X(idxtt,:),Y(idxtt),'Weights',W(idxtt))
TTMdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
           NumObservations: 12053
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

TTMdl は従来式の学習済み単純ベイズ分類モデルを表す ClassificationNaiveBayes モデル オブジェクトです。

学習済みモデルの変換

従来式の学習済み分類モデルをインクリメンタル学習用の単純ベイズ分類モデルに変換します。インクリメンタル学習中に誤分類誤差率を追跡するように指定します。

IncrementalMdl = incrementalLearner(TTMdl,'Metrics',"classiferror")
IncrementalMdl = 
  incrementalClassificationNaiveBayes

                    IsWarm: 1
                   Metrics: [2×2 table]
                ClassNames: [1 2 3 4 5]
            ScoreTransform: 'none'
         DistributionNames: {1×60 cell}
    DistributionParameters: {5×60 cell}


  Properties, Methods

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

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

関数 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));
    mc{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
end

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

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

h = plot(mc.Variables);
xlim([0 nchunk])
ylabel('Classification Error')
legend(h,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.05 近辺で安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。

入力引数

すべて折りたたむ

パフォーマンスを測定してからデータに当てはめるインクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes モデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。

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

モデルのパフォーマンスを測定した後にモデルを当てはめる予測子データのチャンク。nMdl.NumPredictors 列の浮動小数点行列として指定します。

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

メモ

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

データ型: single | double

モデルのパフォーマンスを測定した後にモデルを当てはめるラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。

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

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

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

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

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

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

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

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

データ型: double | single

メモ

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

出力引数

すべて折りたたむ

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

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

分布モデルのパラメーターを更新する以外に、updateMetricsAndFit は、Y に必要でも未処理のクラスが含まれている場合、次のアクションを実行します。

  • incrementalClassificationNaiveBayes を使用して入力モデル Mdl を作成する際、名前と値の引数 ClassNames を使用して必要なすべてのクラスを指定しているわけではない場合、updateMetricsAndFit は以下を実行します。

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

    2. Mdl.Costcc 列の行列に拡張します。ここで cMdl.ClassNames のクラスの数です。結果の誤分類コスト行列は釣り合います。

    3. Mdl.Prior を更新された経験クラス分布の長さ c のベクトルに拡張します。

  • 入力モデル Mdl を作成する際、または incrementalLearner を使用して従来式の学習済み単純ベイズ モデルを変換する際に、必要なすべてのクラスを指定していても、誤分類コスト行列 (Mdl.Cost) を指定していない場合、updateMetricsAndFit は処理済みクラスの誤分類コストを 1 に、未処理クラスの誤分類コストを NaN に設定します。たとえば、updateMetricsAndFit が 3 つの可能なクラスのうち最初の 2 つのクラスを処理している場合、Mdl.Cost[0 1 NaN; 1 0 NaN; 1 1 0] となります。

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

参照

[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.

[2] Manning, Christopher D., Prabhakar Raghavan, and Hinrich Schütze. Introduction to Information Retrieval, NY: Cambridge University Press, 2008.

バージョン履歴

R2021a で導入

すべて展開する