このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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: {1x60 cell} DistributionParameters: {5x60 cell} Properties, Methods
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} 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)]; 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 である定数値の期間を示します。
入力引数
Mdl
— インクリメンタル学習用の単純ベイズ分類モデル
incrementalClassificationNaiveBayes
モデル オブジェクト
パフォーマンスを測定するインクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes
モデル オブジェクトとして指定します。Mdl
は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
Mdl.IsWarm
が false
の場合、updateMetrics
はモデルのパフォーマンスを追跡しません。updateMetrics
でパフォーマンス メトリクスを追跡する前に、次のすべてのアクションを実行しなければなりません。
入力モデル
Mdl
を予測されるすべてのクラスに当てはめます (incrementalClassificationNaiveBayes
の引数MaxNumClasses
とClassNames
を参照)。入力モデル
Mdl
とデータをfit
に渡して、Mdl
をMdl.MetricsWarmupPeriod
の観測値に当てはめます。詳細については、パフォーマンス メトリクスを参照してください。
X
— 予測子データのチャンク
浮動小数点行列
モデルのパフォーマンスを測定する予測子データのチャンク。n 行 Mdl.NumPredictors
列の浮動小数点行列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
メモ
Mdl.NumPredictors
= 0 の場合、updateMetrics
は X
から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors
から変化すると、updateMetrics
がエラーを生成します。
データ型: single
| double
Y
— ラベルのチャンク
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 浮動小数点ベクトル | 文字ベクトルの cell 配列
モデルのパフォーマンスを測定するラベルのチャンク。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
モデル オブジェクト
更新されたインクリメンタル学習用の単純ベイズ分類モデル。入力モデル 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 コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)