Main Content

updateMetrics

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

R2021a 以降

説明

ストリーミング データが与えられると、updateMetrics は、インクリメンタル学習用の構成済みの単純ベイズ分類モデル (incrementalClassificationNaiveBayes オブジェクト) のパフォーマンスを測定します。updateMetrics はパフォーマンス メトリクスを出力モデルに格納します。

updateMetrics では柔軟なインクリメンタル学習が可能です。この関数を呼び出してデータの入力チャンクでモデルのパフォーマンス メトリクスを更新した後、モデルにデータを学習させる前に他のアクションを実行できます。たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます。また、関数 updateMetricsAndFit を使用すると、データが到達したときにモデルのパフォーマンス メトリクスの更新とモデルの学習の両方を 1 回の呼び出しで実行できます。

指定したデータのバッチにおけるモデルのパフォーマンスを測定するには、代わりに loss を呼び出します。

Mdl = updateMetrics(Mdl,X,Y) は、インクリメンタル学習用の単純ベイズ分類モデル Mdl を返します。これは、入力予測子と応答データ (それぞれ XY) のモデル パフォーマンス メトリクスを含むように変更されたインクリメンタル学習用の入力単純ベイズ分類モデル Mdl です。

入力モデルが "ウォーム" (Mdl.IsWarmtrue) の場合、updateMetrics は以前に計算されたメトリクスを上書きし、Metrics プロパティに新しい値を保存します。それ以外の場合、updateMetrics は代わりに MetricsNaN 値を保存します。

Mdl = updateMetrics(Mdl,X,Y,'Weights',Weights) は、観測値の重み Weights も設定します。

すべて折りたたむ

fitcnb を使用して単純ベイズ分類モデルに学習させ、それをインクリメンタル学習器に変換し、その性能をストリーミング データまで追跡します。

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

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

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

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

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

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

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


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

学習済みモデルの変換

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationNaiveBayes

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


インクリメンタル モデルがウォームです。そのため、updateMetrics は、与えられたデータでのモデルのパフォーマンス メトリクスを追跡できます。

パフォーマンス メトリクスの追跡

関数 updateMetrics を使用して、残りのデータでのモデル パフォーマンスを追跡します。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. updateMetrics を呼び出し、観測値の入力チャンクを所与として、モデルの最小コストの累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。

  2. 1 番目のクラスにおける 1 番目の予測子の最小コストと平均 μ11 を保存します。

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
mu11 = [IncrementalMdl.DistributionParameters{1,1}(1); zeros(nchunk,1)];
Xil = X(idxil,:);
Yil = Y(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,Xil(idx,:),Yil(idx));
    mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:};
    mu11(j + 1) = IncrementalMdl.DistributionParameters{1,1}(1);
end

IncrementalMdl は、モデル パフォーマンスをデータ ストリーム内の観測値まで追跡した incrementalClassificationNaiveBayes モデル オブジェクトです。

パフォーマンス メトリクスと μ11 のトレース プロットをプロットします。

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

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

累積の損失は安定していますが、ウィンドウの損失には学習全体を通じて急な変動があります。

updateMetrics がモデルをデータに当てはめないため、μ11 は変更されません。

incrementalClassificationNaiveBayes を呼び出してインクリメンタル学習用の単純ベイズ分類モデルを作成し、データ内の予測される最大クラス数を 5 と指定します。最小コストに加えて誤分類誤差率を追跡するように指定します。

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'Metrics',"classiferror");

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

モデルのプロパティを照会して、モデルがウォームであるかどうかを調べます。

isWarm = Mdl.IsWarm
isWarm = logical
   0

Mdl.IsWarm0 であるため、Mdl はウォームではありません。

メトリクスのウォームアップ期間を表示して、モデルのパフォーマンスを測定する前にインクリメンタル近似関数 (fit など) で処理しなければならない観測値の数を調べます。

numObsBeforeMetrics = Mdl.MetricsWarmupPeriod
numObsBeforeMetrics = 1000

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

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

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

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

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

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

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

  • updateMetrics を使用して、入力チャンクのモデルのパフォーマンス メトリクスを測定します。対応する観測値の重みを指定し、入力モデルを上書きします。

  • モデルを入力チャンクに当てはめます。対応する観測値の重みを指定し、入力モデルを上書きします。

  • μ11 と誤分類誤差率を保存し、インクリメンタル学習中にそれらがどのように進化するかを確認します。

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

% 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),'Weights',W(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    Mdl = fit(Mdl,X(idx,:),Y(idx),'Weights',W(idx));
    mu11(j) = Mdl.DistributionParameters{1,1}(1);
end

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

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

t = tiledlayout(2,1);
nexttile
plot(mu11)
ylabel('\mu_{11}')
xlabel('Iteration')
axis tight
nexttile
plot(ce.Variables)
ylabel('ClassificationError')
xline(numObsBeforeMetrics/numObsPerChunk,'r-.')
xlim([0 nchunk])
legend(ce.Properties.VariableNames)
xlabel(t,'Iteration')

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

mdlIsWarm = numObsBeforeMetrics/numObsPerChunk
mdlIsWarm = 20

プロットは、fit によるデータへのモデルの当てはめは常に実行され、updateMetrics はメトリクスのウォームアップ期間 (20 チャンク) が経過するまでは分類誤差を追跡しないことを示しています。

単純ベイズ分類モデルのパフォーマンスが低下した場合にのみ、そのモデルに対してインクリメンタル学習を行います。

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

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

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

予測される最大クラス数が 5 で、追跡されるパフォーマンス メトリクスに誤分類誤差率を含み、メトリクス ウィンドウ サイズが 1000 となるように、インクリメンタル学習用の単純ベイズ分類モデルを構成します。構成したモデルを最初の 1000 個の観測値に当てはめます。

Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'MetricsWindowSize',1000, ...
    'Metrics','classiferror');
initobs = 1000;
Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

MdlincrementalClassificationNaiveBayes モデル オブジェクトです。

条件付きの当てはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。

  • 100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。

  • 入力データ チャンクでモデルのパフォーマンスを更新します。

  • 誤分類誤差率が 0.05 を超える場合にのみ、モデルをデータ チャンクに当てはめます。

  • パフォーマンスと当てはめを追跡するときは、前のインクリメンタル モデルを上書きします。

  • 誤分類誤差率と 2 番目のクラス μ21 における 1 番目の予測子の平均を保存し、学習中にそれらがどのように進化するかを確認します。

  • fit がモデルに学習させるタイミングを追跡します。

% Preallocation
numObsPerChunk = 100;
nchunk = floor((n - initobs)/numObsPerChunk);
mu21 = zeros(nchunk,1);
ce = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% 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,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    if ce{j,2} > 0.05
        Mdl = fit(Mdl,X(idx,:),Y(idx));
        trained(j) = true;
    end    
    mu21(j) = Mdl.DistributionParameters{2,1}(1);
end

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

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

t = tiledlayout(2,1);
nexttile
plot(mu21)
hold on
plot(find(trained),mu21(trained),'r.')
xlim([0 nchunk])
ylabel('\mu_{21}')
legend('\mu_{21}','Training occurs','Location','best')
hold off
nexttile
plot(ce.Variables)
xlim([0 nchunk])
ylabel('Misclassification Error Rate')
legend(ce.Properties.VariableNames,'Location','best')
xlabel(t,'Iteration')

Figure contains 2 axes objects. Axes object 1 with ylabel \mu_{21} contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent \mu_{21}, Training occurs. Axes object 2 with ylabel Misclassification Error Rate contains 2 objects of type line. These objects represent Cumulative, Window.

μ21 のトレース プロットは、前の観測ウィンドウ内における損失が最大で 0.05 である定数値の期間を示します。

入力引数

すべて折りたたむ

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

Mdl.IsWarmfalse の場合、updateMetrics はモデルのパフォーマンスを追跡しません。updateMetrics でパフォーマンス メトリクスを追跡する前に、次のすべてのアクションを実行しなければなりません。

  • 入力モデル Mdl を予測されるすべてのクラスに当てはめます (incrementalClassificationNaiveBayes の引数 MaxNumClassesClassNames を参照)。

  • 入力モデル Mdl とデータを fit に渡して、MdlMdl.MetricsWarmupPeriod の観測値に当てはめます。詳細については、パフォーマンス メトリクスを参照してください。

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

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

メモ

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

データ型: single | double

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

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

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

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

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

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

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

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

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

データ型: double | single

メモ

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

出力引数

すべて折りたたむ

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

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

ヒント

  • 従来式の学習とは異なり、インクリメンタル学習には個別のテスト (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクをテスト セットとして扱うには、インクリメンタル モデルと各入力チャンクを、fit を使用して同じデータでモデルに学習させる前に updateMetrics に渡します。

アルゴリズム

すべて折りたたむ

パフォーマンス メトリクス

  • updateMetrics は、インクリメンタル モデルが "ウォーム" (IsWarm プロパティが true) のときにのみ、新しいデータから Mdl.Metrics の table の行ラベルで指定されたモデルのパフォーマンス メトリクスのみを追跡します。

    • incrementalLearner を使用してインクリメンタル モデルを作成するときに、MetricsWarmupPeriod が 0 (incrementalLearner の既定値) である場合、モデルは作成時にウォームになります。

    • それ以外の場合、インクリメンタル モデルは、関数 fit で次の両方のアクションを実行するとウォームになります。

      • インクリメンタル モデルを Mdl.MetricsWarmupPeriod の観測値 ("メトリクスのウォームアップ期間") に当てはめる。

      • インクリメンタル モデルを予測されるすべてのクラスに当てはめる (incrementalClassificationNaiveBayes の引数 MaxNumClassesClassNames を参照)。

  • Mdl.Metrics は、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列) Cumulative および Window とし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetrics は次の頻度でメトリクスを更新します。

    • Cumulative — 関数は、モデルの性能追跡の開始以降の累積メトリクスを計算します。関数は、関数が呼び出されるたびにメトリクスを更新し、提供されたデータ セット全体に基づいて計算を行います。

    • Window — 関数は、Mdl.MetricsWindowSize プロパティによって決定されたウィンドウ内のすべての観測値に基づいてメトリクスを計算します。Mdl.MetricsWindowSize によってソフトウェアが Window メトリクスを更新する頻度も決まります。たとえば、Mdl.MetricsWindowSize が 20 の場合、関数は提供されたデータの最後の 20 個の観測値に基づいてメトリクスを計算します (X((end – 20 + 1):end,:) および Y((end – 20 + 1):end))。

      ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。

      1. 指定された各メトリクスについて長さ Mdl.MetricsWindowSize のバッファーを保存し、観測値の重みのバッファーを保存します。

      2. 入力観測値のバッチに基づくモデル性能をメトリクス バッファーの要素に入力し、対応する観測値の重みを重みバッファーに格納します。

      3. バッファーがいっぱいになると、Mdl.Metrics.Window をメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにバッファーがあふれる場合、最新の入力観測値 Mdl.MetricsWindowSize がバッファーに入り、最も古い観測値がバッファーから削除されます。たとえば、Mdl.MetricsWindowSize が 20 で、メトリクス バッファーには前に処理されたバッチからの 10 個の値が存在し、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。

  • CumulativeWindow のパフォーマンス メトリクスの値を計算する際、スコアが NaN の観測値は省略されます。

観測値の重み

それぞれの条件付き予測子分布について、updateMetrics は加重平均と標準偏差を計算します。

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

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

バージョン履歴

R2021a で導入