updateMetricsAndFit
説明
ストリーミング データが与えられると、updateMetricsAndFit
は、最初に、入力データの updateMetrics
を呼び出して、インクリメンタル学習用の構成済みの単純ベイズ分類モデル (incrementalClassificationNaiveBayes
オブジェクト) のパフォーマンスを評価します。次に、updateMetricsAndFit
は、fit
を呼び出して、モデルをそのデータに当てはめます。言い換えると、updateMetricsAndFit
は "逐次予測評価" を実行します。データの各入力チャンクをテスト セットとして扱い、累積的に測定されたパフォーマンス メトリクスと指定したウィンドウにおけるパフォーマンス メトリクスを追跡します[1]。
updateMetricsAndFit
は、モデルのパフォーマンス メトリクスを更新し、データの各チャンクでモデルに学習させる簡単な方法を提供します。また、updateMetrics
を呼び出してから fit
を呼び出して、個別に操作を実行することもできます。これにより柔軟性を高めることができます (たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます)。
は、インクリメンタル学習用の単純ベイズ分類モデル Mdl
= updateMetricsAndFit(Mdl
,X
,Y
)Mdl
を返します。これは、インクリメンタル学習用の入力単純ベイズ分類モデル Mdl
であり、次の変更が行われます。
updateMetricsAndFit
は、入力予測子と応答データ (それぞれX
とY
) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarm
がtrue
) の場合、updateMetricsAndFit
は以前に計算されたメトリクスを上書きし、Metrics
プロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFit
は代わりにMetrics
にNaN
値を保存します。updateMetricsAndFit
は、変更されたモデルを入力データに当てはめます。与えられたクラスに応じて各予測子変数の条件付き事後平均と標準偏差を更新し、新しい推定値を他の構成と共に出力モデルMdl
に保存します。
例
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
Mdl
は incrementalClassificationNaiveBayes
モデル オブジェクトです。そのプロパティはすべて読み取り専用です。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
各反復で次のアクションを実行してインクリメンタル学習を実装します。
50 個の観測値のチャンクを処理して、データ ストリームをシミュレートします。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書きします。
1 番目のクラス内の 1 番目の予測子の条件付き平均 、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。
% 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
は入力観測値でモデルの性能をチェックし、モデルをその観測値に当てはめます。
パフォーマンス メトリクスと が学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
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')
このプロットは、updateMetricsAndFit
が次のアクションを実行することを示しています。
をインクリメンタル学習のすべての反復で当てはめます。
パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算します。
累積メトリクスを各反復中に計算します。
ウィンドウ メトリクスを 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
IncrementalMdl
は incrementalClassificationNaiveBayes
モデルです。クラス名が IncrementalMdl.ClassNames
で指定されているため、インクリメンタル学習で見つかるラベルは IncrementalMdl.ClassNames
のいずれかでなければなりません。
パフォーマンス メトリクスの追跡とモデルの当てはめ
関数 updateMetricsAndFit
を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。
50 個の観測値を一度に処理して、データ ストリームをシミュレートします。
updateMetricsAndFit
を呼び出し、観測値の入力チャンクを所与として、モデルのパフォーマンス メトリクスの累積とウィンドウを更新し、モデルをデータに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。観測値の重みを指定します。誤分類誤差率を保存します。
% 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')
累積の損失は最初に変動した後に 0.05 近辺で安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。
入力引数
パフォーマンスを測定してからデータに当てはめるインクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes
モデル オブジェクトとして指定します。Mdl
は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner
によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
Mdl.IsWarm
が false
の場合、updateMetricsAndFit
はモデルのパフォーマンスを追跡しません。詳細については、パフォーマンス メトリクスを参照してください。
モデルのパフォーマンスを測定した後にモデルを当てはめる予測子データのチャンク。n 行 Mdl.NumPredictors
列の浮動小数点行列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
メモ
Mdl.NumPredictors
= 0 の場合、updateMetricsAndFit
は X
から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors
から変化すると、updateMetricsAndFit
がエラーを生成します。
データ型: single
| double
モデルのパフォーマンスを測定した後にモデルを当てはめるラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトル、または文字ベクトルの cell 配列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
次の状況のいずれかまたは両方に該当する場合、updateMetricsAndFit
からエラーが発行されます。
Y
に新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationNaiveBayes
の引数MaxNumClasses
およびClassNames
を参照)。入力モデル
Mdl
のClassNames
プロパティが空以外で、Y
とMdl.ClassNames
のデータ型が異なる。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN
) 値を含む場合、updateMetricsAndFit
はその観測値を無視します。したがって、updateMetricsAndFit
は n 個よりも少ない観測値を使用してモデル パフォーマンスを計算し、更新したモデルを作成します。ここで n は X
内の観測値数です。
出力引数
更新されたインクリメンタル学習用の単純ベイズ分類モデル。入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationNaiveBayes
として返されます。
モデルがウォームでない場合、updateMetricsAndFit
はパフォーマンス メトリクスを計算しません。その結果、Mdl
の Metrics
プロパティは、NaN
値で構成された状態を完全に維持します。モデルがウォームの場合、updateMetricsAndFit
は、新しいデータ X
と Y
における累積およびウィンドウのパフォーマンス メトリクスを計算し、Mdl.Metrics
の対応する要素を上書きします。詳細については、パフォーマンス メトリクスを参照してください。
分布モデルのパラメーターを更新する以外に、updateMetricsAndFit
は、Y
に必要でも未処理のクラスが含まれている場合、次のアクションを実行します。
incrementalClassificationNaiveBayes
を使用して入力モデルMdl
を作成する際、名前と値の引数ClassNames
を使用して必要なすべてのクラスを指定しているわけではない場合、updateMetricsAndFit
は以下を実行します。Y
内の新しいラベルをMdl.ClassNames
の末尾に追加します。Mdl.Cost
を c 行 c 列の行列に拡張します。ここで c はMdl.ClassNames
のクラスの数です。結果の誤分類コスト行列は釣り合います。Mdl.Prior
を更新された経験クラス分布の長さ c のベクトルに拡張します。
入力モデル
Mdl
を作成する際、またはincrementalLearner
を使用して従来式の学習済み単純ベイズ モデルを変換する際に、必要なすべてのクラスを指定していても、誤分類コスト行列 (Mdl.Cost
) を指定していない場合、updateMetricsAndFit
は処理済みクラスの誤分類コストを1
に、未処理クラスの誤分類コストをNaN
に設定します。たとえば、updateMetricsAndFit
が 3 つの可能なクラスのうち最初の 2 つのクラスを処理している場合、Mdl.Cost
は[0 1 NaN; 1 0 NaN; 1 1 0]
となります。
詳細
bag-of-tokens モデルでは、予測子 j の値は観測値のトークン j の発生数を表す非負の数値です。この多項モデルのカテゴリ (ビン) の数は、異なるトークンの数 (予測子の数) です。
アルゴリズム
予測子変数 j
が条件付き正規分布をもつ場合 (DistributionNames
プロパティを参照)、クラス固有の加重平均、および加重標準偏差の偏った (最尤) 推定を計算することにより、この分布がデータに当てはめられます。各クラス k に対して以下を実行します。
予測子 j の加重平均は次のようになります。
ここで wi は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
予測子 j の加重標準偏差の不偏推定器は次のようになります。
すべての予測子変数が条件付き多項分布を構成する場合 (DistributionNames
プロパティを参照)、bag-of-tokens モデルを使用して、この分布が当てはめられます。トークン j
がプロパティ DistributionParameters{
のクラス k
,j
}k
に出現する確率が保存されます。加法平滑化[2]を使用すると、推定確率は次のようになります。
ここで、以下になります。
はクラス k におけるトークン j の重み付き発生数です。
nk はクラス k 内の観測数です。
は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
は、クラス k に含まれているすべてのトークンの重み付き発生数の合計です。
予測子変数 j
が条件付き多変量多項分布をもつ場合 (DistributionNames
プロパティを参照)、次のような手順になります。
一意のレベルのリストが収集され、並べ替えられたリストは
CategoricalLevels
に保存され、各レベルはビンと見なされます。予測子とクラスの各組み合わせは、個別の独立した多項確率変数です。各クラス k に対して、
CategoricalLevels{
に保存されたリストを使用して、カテゴリカル レベルごとのインスタンスがカウントされます。j
}クラス
k
の予測子j
が、プロパティDistributionParameters{
においてレベル L をもつ場合、すべてのレベルの確率はk
,j
}CategoricalLevels{
に保存されます。加法平滑化[2]を使用すると、推定確率は次のようになります。j
}ここで、以下になります。
は、クラス k 内の予測子 j が L に等しい観測値の重み付き個数です。
nk はクラス k 内の観測数です。
xij = L の場合は 、それ以外の場合は 0 です。
は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
mj は予測子 j の異なるレベルの数です。
mk はクラス k 内の重み付けされた観測値の数です。
updateMetricsAndFit
は、インクリメンタル モデルが "ウォーム" (IsWarm
プロパティがtrue
) のときにのみ、新しいデータからMdl.Metrics
の table の行ラベルで指定されたモデルのパフォーマンス メトリクスを追跡します。incrementalLearner
を使用してインクリメンタル モデルを作成するときに、MetricsWarmupPeriod
が 0 (incrementalLearner
の既定値) である場合、モデルは作成時にウォームになります。それ以外の場合、インクリメンタル モデルは、
updateMetricsAndFit
などのインクリメンタル近似関数で次の両方のアクションを実行するとウォームになります。インクリメンタル モデルを
Mdl.MetricsWarmupPeriod
の観測値 ("メトリクスのウォームアップ期間") に当てはめる。インクリメンタル モデルを予測されるすべてのクラスに当てはめる (
incrementalClassificationNaiveBayes
の引数MaxNumClasses
とClassNames
を参照)。
Mdl.Metrics
は、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列)Cumulative
およびWindow
とし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetricsAndFit
は次の頻度でメトリクスを更新します。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
の観測値は省略されます。
それぞれの条件付き予測子分布について、updateMetricsAndFit
は加重平均と標準偏差を計算します。
事前クラス確率分布が既知の場合 (つまり、事前分布が経験分布でない場合)、updateMetricsAndFit
は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれの事前クラス確率であることを前提としています。
クラスの事前確率分布が経験分布の場合、ソフトウェアは、updateMetricsAndFit
が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
参照
[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 で導入R2021b 以降、単純ベイズ インクリメンタル近似関数 fit
および updateMetricsAndFit
は、学習中に条件付き正規予測子変数に対して加重標準偏差の偏った (最尤) 推定値を計算します。つまり、各クラス k に対して、インクリメンタル近似関数は、条件付き正規予測子 xj の加重偏差の平方和をクラス k の重みの和で正規化します。R2021b より前は、単純ベイズ インクリメンタル近似関数は、fitcnb
のような不偏標準偏差を計算していました。現在返される加重標準偏差の推定値は、R2021b より前に計算されていた加重標準偏差と次のファクタだけ異なります。
このファクタは、標本サイズが大きくなると 1 に近づきます。
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)