updateMetrics
説明
ストリーミング データが与えられると、updateMetrics は、インクリメンタル学習用の構成済みの単純ベイズ分類モデル (incrementalClassificationNaiveBayes オブジェクト) のパフォーマンスを測定します。updateMetrics はパフォーマンス メトリクスを出力モデルに格納します。
updateMetrics では柔軟なインクリメンタル学習が可能です。この関数を呼び出してデータの入力チャンクでモデルのパフォーマンス メトリクスを更新した後、モデルにデータを学習させる前に他のアクションを実行できます。たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます。また、関数 updateMetricsAndFit を使用すると、データが到達したときにモデルのパフォーマンス メトリクスの更新とモデルの学習の両方を 1 回の呼び出しで実行できます。
指定したデータのバッチにおけるモデルのパフォーマンスを測定するには、代わりに loss を呼び出します。
は、インクリメンタル学習用の単純ベイズ分類モデル Mdl = updateMetrics(Mdl,X,Y)Mdl を返します。これは、入力予測子と応答データ (それぞれ X と Y) のモデル パフォーマンス メトリクスを含むように変更されたインクリメンタル学習用の入力単純ベイズ分類モデル Mdl です。
入力モデルが "ウォーム" (Mdl.IsWarm が true) の場合、updateMetrics は以前に計算されたメトリクスを上書きし、Metrics プロパティに新しい値を保存します。それ以外の場合、updateMetrics は代わりに Metrics に NaN 値を保存します。
例
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: {1×60 cell}
DistributionParameters: {5×60 cell}
Properties, Methods
TTMdl は、従来式の学習済みモデルを表す ClassificationNaiveBayes モデル オブジェクトです。
学習済みモデルの変換
従来式の学習済み分類モデルをインクリメンタル学習用の単純ベイズ分類モデルに変換します。
IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl =
incrementalClassificationNaiveBayes
IsWarm: 1
Metrics: [1×2 table]
ClassNames: [1 2 3 4 5]
ScoreTransform: 'none'
DistributionNames: {1×60 cell}
DistributionParameters: {5×60 cell}
Properties, Methods
インクリメンタル モデルがウォームです。そのため、updateMetrics は、与えられたデータでのモデルのパフォーマンス メトリクスを追跡できます。
パフォーマンス メトリクスの追跡
関数 updateMetrics を使用して、残りのデータでのモデル パフォーマンスを追跡します。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
updateMetricsを呼び出し、観測値の入力チャンクを所与として、モデルの最小コストの累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metricsプロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。1 番目のクラスにおける 1 番目の予測子の最小コストと平均 を保存します。
% 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,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 モデル オブジェクトです。
パフォーマンス メトリクスと のトレース プロットをプロットします。
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')

累積の損失は安定していますが、ウィンドウの損失には学習全体を通じて急な変動があります。
updateMetrics がモデルをデータに当てはめないため、 は変更されません。
incrementalClassificationNaiveBayes を呼び出してインクリメンタル学習用の単純ベイズ分類モデルを作成し、データ内の予測される最大クラス数を 5 と指定します。最小コストに加えて誤分類誤差率を追跡するように指定します。
Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5,'Metrics',"classiferror");
Mdl は incrementalClassificationNaiveBayes モデルです。そのプロパティはすべて読み取り専用です。
モデルのプロパティを照会して、モデルがウォームであるかどうかを調べます。
isWarm = Mdl.IsWarm
isWarm = logical
0
Mdl.IsWarm が 0 であるため、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を使用して、入力チャンクのモデルのパフォーマンス メトリクスを測定します。対応する観測値の重みを指定し、入力モデルを上書きします。モデルを入力チャンクに当てはめます。対応する観測値の重みを指定し、入力モデルを上書きします。
と誤分類誤差率を保存し、インクリメンタル学習中にそれらがどのように進化するかを確認します。
% 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')

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));
Mdl は incrementalClassificationNaiveBayes モデル オブジェクトです。
条件付きの当てはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。
100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。
入力データ チャンクでモデルのパフォーマンスを更新します。
誤分類誤差率が 0.05 を超える場合にのみ、モデルをデータ チャンクに当てはめます。
パフォーマンスと当てはめを追跡するときは、前のインクリメンタル モデルを上書きします。
誤分類誤差率と 2 番目のクラス における 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 モデル オブジェクトです。
モデルのパフォーマンスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
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')

のトレース プロットは、前の観測ウィンドウ内における損失が最大で 0.05 である定数値の期間を示します。
入力引数
パフォーマンスを測定するインクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes モデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
Mdl.IsWarm が false の場合、updateMetrics はモデルのパフォーマンスを追跡しません。updateMetrics でパフォーマンス メトリクスを追跡する前に、次のすべてのアクションを実行しなければなりません。
入力モデル
Mdlを予測されるすべてのクラスに当てはめます (incrementalClassificationNaiveBayesの引数MaxNumClassesとClassNamesを参照)。入力モデル
Mdlとデータをfitに渡して、MdlをMdl.MetricsWarmupPeriodの観測値に当てはめます。詳細については、パフォーマンス メトリクスを参照してください。
モデルのパフォーマンスを測定する予測子データのチャンク。n 行 Mdl.NumPredictors 列の浮動小数点行列として指定します。
観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行) のラベルです。
メモ
Mdl.NumPredictors = 0 の場合、updateMetrics は X から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors から変化すると、updateMetrics がエラーを生成します。
データ型: single | double
モデルのパフォーマンスを測定するラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。
観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y( は j)X 内の観測値 j (行) のラベルです。
次の状況のいずれかまたは両方に該当する場合、updateMetrics からエラーが発行されます。
Yに新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationNaiveBayesの引数MaxNumClassesおよびClassNamesを参照)。入力モデル
MdlのClassNamesプロパティが空以外で、YとMdl.ClassNamesのデータ型が異なる。
データ型: char | string | cell | categorical | logical | single | double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN) 値を含む場合、updateMetrics はその観測値を無視します。したがって、updateMetrics は n 個よりも少ない観測値を使用してモデル パフォーマンスを計算します。ここで n は X 内の観測値数です。
出力引数
更新されたインクリメンタル学習用の単純ベイズ分類モデル。入力モデル Mdl と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationNaiveBayes として返されます。
モデルがウォームでない場合、updateMetrics はパフォーマンス メトリクスを計算しません。その結果、Mdl の Metrics プロパティは、NaN 値で構成された状態を完全に維持します。モデルがウォームの場合、updateMetrics は、新しいデータ X と Y における累積およびウィンドウのパフォーマンス メトリクスを計算し、Mdl.Metrics の対応する要素を上書きします。入力モデル Mdl の他のプロパティは、すべて出力モデル Mdl に引き継がれます。詳細については、パフォーマンス メトリクスを参照してください。
ヒント
従来式の学習とは異なり、インクリメンタル学習には個別のテスト (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクをテスト セットとして扱うには、インクリメンタル モデルと各入力チャンクを、
fitを使用して同じデータでモデルに学習させる前にupdateMetricsに渡します。
アルゴリズム
updateMetricsは、インクリメンタル モデルが "ウォーム" (IsWarmプロパティがtrue) のときにのみ、新しいデータからMdl.Metricsの table の行ラベルで指定されたモデルのパフォーマンス メトリクスのみを追跡します。incrementalLearnerを使用してインクリメンタル モデルを作成するときに、MetricsWarmupPeriodが 0 (incrementalLearnerの既定値) である場合、モデルは作成時にウォームになります。それ以外の場合、インクリメンタル モデルは、関数
fitで次の両方のアクションを実行するとウォームになります。インクリメンタル モデルを
Mdl.MetricsWarmupPeriodの観測値 ("メトリクスのウォームアップ期間") に当てはめる。インクリメンタル モデルを予測されるすべてのクラスに当てはめる (
incrementalClassificationNaiveBayesの引数MaxNumClassesとClassNamesを参照)。
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))。ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。
指定された各メトリクスについて長さ
Mdl.MetricsWindowSizeのバッファーを保存し、観測値の重みのバッファーを保存します。入力観測値のバッチに基づくモデル性能をメトリクス バッファーの要素に入力し、対応する観測値の重みを重みバッファーに格納します。
バッファーがいっぱいになると、
Mdl.Metrics.Windowをメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにバッファーがあふれる場合、最新の入力観測値Mdl.MetricsWindowSizeがバッファーに入り、最も古い観測値がバッファーから削除されます。たとえば、Mdl.MetricsWindowSizeが 20 で、メトリクス バッファーには前に処理されたバッチからの 10 個の値が存在し、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。
CumulativeとWindowのパフォーマンス メトリクスの値を計算する際、スコアがNaNの観測値は省略されます。
それぞれの条件付き予測子分布について、updateMetrics は加重平均と標準偏差を計算します。
事前クラス確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、updateMetrics は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれの事前クラス確率であることを前提としています。
クラスの事前確率分布が経験分布の場合、ソフトウェアは、updateMetrics が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
バージョン履歴
R2021a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)