このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
fit
説明
関数 fit
は、構成されたインクリメンタル学習用の単純ベイズ分類モデル (incrementalClassificationNaiveBayes
オブジェクト) をストリーミング データに当てはめます。到達したデータを使用して追加的にパフォーマンス メトリクスを追跡するには、代わりに updateMetricsAndFit
を使用します。
単純ベイズ分類モデルを一度にデータのバッチ全体に当てはめるか交差検証するには、fitcnb
を参照してください。
例
十分な事前情報なしでのモデルのインクリメンタル学習
データに含まれるクラスの想定される最大数のみがわかっている場合にインクリメンタル単純ベイズ学習器を当てはめます。
インクリメンタル単純ベイズ モデルを作成します。予測される最大クラス数を 5 と指定します。
Mdl = incrementalClassificationNaiveBayes('MaxNumClasses',5)
Mdl = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [1x2 table] ClassNames: [1x0 double] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {} Properties, Methods
Mdl
は incrementalClassificationNaiveBayes
モデルです。そのプロパティはすべて読み取り専用です。Mdl
が処理できる一意のクラスは最大 5 つです。既定では、事前クラス分布 Mdl.Prior
は経験的であり、ラベルが見つかると事前分布が更新されます。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1) % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
関数 fit
を使用してインクリメンタル モデルを学習データに当てはめます。50 個の観測値で構成されるチャンクを一度に当てはめます。各反復で次を行います。
50 個の観測値を処理して、データ ストリームをシミュレート。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
1 番目のクラス における 1 番目の予測子の平均と被験者が移動しているかどうか (
Y
> 2) の事前確率を保存し、インクリメンタル学習中にそれらのパラメーターがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); mu11 = zeros(nchunk,1); priormoved = 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 = fit(Mdl,X(idx,:),Y(idx)); mu11(j) = Mdl.DistributionParameters{1,1}(1); priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationNaiveBayes
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(mu11) ylabel('\mu_{11}') xlabel('Iteration') axis tight nexttile plot(priormoved) ylabel('\pi(Subject Is Moving)') xlabel(t,'Iteration') axis tight
予測子分布の事後平均は fit
で各チャンクが処理されると更新されます。事前クラス分布は経験的であるため、 (被験者が移動) は fit
で各チャンクが処理されると変化します。
すべてのクラス名を指定した状態での当てはめ
データに含まれるすべてのクラス名がわかっている場合にインクリメンタル単純ベイズ学習器を当てはめます。
デバイスに学習させ、被験者で測定された生体データに基づいて、被験者が座る、立つ、歩く、走る、踊るのいずれの状態であるかを予測するとします。各行動にはクラス名 1 ~ 5 をマッピングします。また、この調査では、クラスごとのデバイスの分布は一様になるものとします。
マルチクラス学習用のインクリメンタル単純ベイズ モデルを作成します。クラス名および一様な事前クラス分布を指定します。
classnames = 1:5; Mdl = incrementalClassificationNaiveBayes('ClassNames',classnames,'Prior','uniform')
Mdl = incrementalClassificationNaiveBayes IsWarm: 0 Metrics: [1x2 table] ClassNames: [1 2 3 4 5] ScoreTransform: 'none' DistributionNames: 'normal' DistributionParameters: {5x0 cell} Properties, Methods
Mdl
は incrementalClassificationNaiveBayes
モデル オブジェクトです。そのプロパティはすべて読み取り専用です。学習中に観測されるラベルは Mdl.ClassNames
のいずれかでなければなりません。
Mdl
は、他の演算の実行に使用する前に、データに当てはめなければなりません。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
load humanactivity n = numel(actid); rng(1); % For reproducibility idx = randsample(n,n); X = feat(idx,:); Y = actid(idx);
データ セットの詳細については、コマンド ラインで Description
を入力してください。
関数 fit
を使用して、インクリメンタル モデルを学習データに当てはめます。50 個の観測値のチャンクを一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
50 個の観測値を処理。
前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。
1 番目のクラス における 1 番目の予測子の平均と被験者が移動しているかどうか (
Y
> 2) の事前確率を保存し、インクリメンタル学習中にそれらのパラメーターがどのように進化するかを確認。
% Preallocation numObsPerChunk = 50; nchunk = floor(n/numObsPerChunk); mu11 = zeros(nchunk,1); priormoved = 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 = fit(Mdl,X(idx,:),Y(idx)); mu11(j) = Mdl.DistributionParameters{1,1}(1); priormoved(j) = sum(Mdl.Prior(Mdl.ClassNames > 2)); end
Mdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationNaiveBayes
モデル オブジェクトです。
パラメーターがインクリメンタル学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。
t = tiledlayout(2,1); nexttile plot(mu11) ylabel('\mu_{11}') xlabel('Iteration') axis tight nexttile plot(priormoved) ylabel('\pi(Subject Is Moving)') xlabel(t,'Iteration') axis tight
予測子分布の事後平均は fit
で各チャンクが処理されると更新されます。事前クラス分布は一様として指定されているため、 (被験者が移動) は 0.6 のまま fit
で各チャンクが処理されても変化しません。
観測値の重みの指定
fitcnb
を使用して単純ベイズ分類モデルに学習させ、それをインクリメンタル学習器に変換し、その性能をストリーミング データで追跡してからモデルをデータに当てはめます。観測値の重みを指定します。
データの読み込みと前処理
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
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: {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
IncrementalMdl
は incrementalClassificationNaiveBayes
モデルです。クラス名が IncrementalMdl.ClassNames
で指定されているため、インクリメンタル学習で見つかるラベルは IncrementalMdl.ClassNames
のいずれかでなければなりません。
パフォーマンス メトリクスの追跡とモデルの当てはめの個別の実行
関数 updateMetrics
および fit
を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。
50 個の観測値を一度に処理して、データ ストリームをシミュレートします。
updateMetrics
を呼び出し、観測値の入力チャンクを所与として、モデルの最小コストの累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics
プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の重みを指定します。最小コストを保存します。
fit
を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の重みを指定します。
% 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 = updateMetrics(IncrementalMdl,Xil(idx,:),Yil(idx), ... 'Weights',Wil(idx)); mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:}; IncrementalMdl = fit(IncrementalMdl,Xil(idx,:),Yil(idx),'Weights',Wil(idx)); end
IncrementalMdl
は、ストリーム内のすべてのデータで学習させた incrementalClassificationNaiveBayes
モデル オブジェクトです。
あるいは、updateMetricsAndFit
を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。
パフォーマンス メトリクスのトレース プロットをプロットします。
h = plot(mc.Variables); xlim([0 nchunk]) ylabel('Minimal Cost') legend(h,mc.Properties.VariableNames) xlabel('Iteration')
累積の損失は徐々に安定しますが、ウィンドウの損失には学習全体を通じて急な変動があります。
条件付き学習の実行
単純ベイズ分類モデルのパフォーマンスが低下した場合にのみ、そのモデルに対してインクリメンタル学習を行います。
人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。
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
によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。
X
— 予測子データのチャンク
浮動小数点行列
モデルを当てはめる予測子データのチャンク。n 行 Mdl.NumPredictors
列の浮動小数点行列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
メモ
Mdl.NumPredictors
= 0 の場合、fit
は X
から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors
から変化すると、fit
がエラーを生成します。
データ型: single
| double
Y
— ラベルのチャンク
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 浮動小数点ベクトル | 文字ベクトルの cell 配列
モデルを当てはめるラベルのチャンク。categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトルのいずれか、あるいは文字ベクトルの cell 配列として指定します。
観測値のラベル Y
の長さと X
の観測値の数は同じでなければなりません。Y(
は j
)X
内の観測値 j (行) のラベルです。
次の状況のいずれかまたは両方に該当する場合、fit
からエラーが発行されます。
Y
に新しいラベルが格納された時点で既にクラスの最大数に達していた (incrementalClassificationNaiveBayes
の引数MaxNumClasses
およびClassNames
を参照)。入力モデル
Mdl
のClassNames
プロパティが空以外で、Y
とMdl.ClassNames
のデータ型が異なる。
データ型: char
| string
| cell
| categorical
| logical
| single
| double
メモ
観測値 (予測子またはラベル) または重みが少なくとも 1 つの欠損 (NaN
) 値を含む場合、fit
はその観測値を無視します。したがって、fit
は n 個よりも少ない観測値を使用して更新したモデルを作成します。ここで n は X
内の観測値数です。
出力引数
Mdl
— 更新されたインクリメンタル学習用の単純ベイズ分類モデル
incrementalClassificationNaiveBayes
モデル オブジェクト
更新されたインクリメンタル学習用の単純ベイズ分類モデル。入力モデル Mdl
と同じデータ型のインクリメンタル学習モデル オブジェクト incrementalClassificationNaiveBayes
として返されます。
分布モデルのパラメーターを更新する以外に、fit
は、Y
に必要でも未処理のクラスが含まれている場合、次のアクションを実行します。
incrementalClassificationNaiveBayes
を使用して入力モデルMdl
を作成する際、名前と値の引数ClassNames
を使用して必要なすべてのクラスを指定しているわけではない場合、fit
は以下を実行します。Y
内の新しいラベルをMdl.ClassNames
の末尾に追加します。Mdl.Cost
を c 行 c 列の行列に拡張します。ここで c はMdl.ClassNames
のクラスの数です。結果の誤分類コスト行列は釣り合います。Mdl.Prior
を更新された経験的クラス分布の長さ c のベクトルに拡張します。
入力モデル
Mdl
を作成する際、またはincrementalLearner
を使用して従来式の学習済み単純ベイズ モデルを変換する際に、必要なすべてのクラスを指定していても、誤分類コスト行列 (Mdl.Cost
) を指定していない場合、fit
は処理済みクラスの誤分類コストを1
に、未処理クラスの誤分類コストをNaN
に設定します。たとえば、fit
が 3 つの可能なクラスのうち最初の 2 つのクラスを処理している場合、Mdl.Cost
は[0 1 NaN; 1 0 NaN; 1 1 0]
となります。
詳細
bag-of-tokens モデル
bag-of-tokens モデルでは、予測子 j の値は観測値のトークン j の発生数を表す非負の数値です。この多項モデルのカテゴリ (ビン) の数は、異なるトークンの数 (予測子の数) です。
ヒント
従来式の学習とは異なり、インクリメンタル学習には個別の検定 (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクを検定セットとして扱うには、インクリメンタル モデルと各入力チャンクを、同じデータでモデルに学習させる前に
updateMetrics
に渡します。
アルゴリズム
正規分布の推定器
予測子変数 j
が条件付き正規分布をもつ場合 (DistributionNames
プロパティを参照)、クラス固有の加重平均、および加重標準偏差の偏った (最尤) 推定を計算することにより、この分布がデータに当てはめられます。各クラス k に対して以下を実行します。
予測子 j の加重平均は次のようになります。
ここで wi は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
予測子 j の加重標準偏差の不偏推定器は次のようになります。
多項分布の推定確率
すべての予測子変数が条件付き多項分布を構成する場合 (DistributionNames
プロパティを参照)、bag-of-tokens モデルを使用して、この分布が当てはめられます。トークン j
がプロパティ DistributionParameters{
のクラス k
,j
}k
に出現する確率が保存されます。加法平滑化[1]を使用すると、推定確率は次のようになります。
ここで、以下になります。
はクラス k におけるトークン j の重み付き発生数です。
nk はクラス k 内の観測数です。
は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
は、クラス k に含まれているすべてのトークンの重み付き発生数の合計です。
多変量多項分布の推定確率
予測子変数 j
が条件付き多変量多項分布をもつ場合 (DistributionNames
プロパティを参照)、次のような手順になります。
一意のレベルのリストが収集され、並べ替えられたリストは
CategoricalLevels
に保存され、各レベルはビンと見なされます。予測子とクラスの各組み合わせは、個別の独立した多項確率変数です。各クラス k に対して、
CategoricalLevels{
に保存されたリストを使用して、カテゴリカル レベルごとのインスタンスがカウントされます。j
}クラス
k
の予測子j
が、プロパティDistributionParameters{
においてレベル L をもつ場合、すべてのレベルの確率はk
,j
}CategoricalLevels{
に保存されます。加法平滑化[1]を使用すると、推定確率は次のようになります。j
}ここで、以下になります。
は、クラス k 内の予測子 j が L に等しい観測値の重み付き個数です。
nk はクラス k 内の観測数です。
xij = L の場合は 、それ以外の場合は 0 です。
は観測値 i の重みです。クラス内の重みは、その合計がクラスの事前確率になるように正規化されます。
mj は予測子 j の異なるレベルの数です。
mk はクラス k 内の重み付けされた観測値の数です。
観測値の重み
それぞれの条件付き予測子分布について、fit
は加重平均と標準偏差を計算します。
クラスの事前確率分布が既知の場合 (つまり、事前分布が経験的分布でない場合)、fit
は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、既定の観測値の重みがそれぞれのクラスの事前確率であることを前提としています。
クラスの事前確率分布が経験的分布の場合、ソフトウェアは、fit
が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。
参照
[1] Manning, Christopher D., Prabhakar Raghavan, and Hinrich Schütze. Introduction to Information Retrieval, NY: Cambridge University Press, 2008.
バージョン履歴
R2021a で導入R2021b: 単純ベイズ インクリメンタル近似関数による条件付き正規予測子変数に対する偏った (最尤) 標準偏差の計算
R2021b 以降、単純ベイズ インクリメンタル近似関数 fit
および updateMetricsAndFit
は、学習中に条件付き正規予測子変数に対して加重標準偏差の偏った (最尤) 推定値を計算します。つまり、各クラス k に対して、インクリメンタル近似関数は、条件付き正規予測子 xj の加重偏差の平方和をクラス k の重みの和で正規化します。R2021b より前は、単純ベイズ インクリメンタル近似関数は、fitcnb
のような不偏標準偏差を計算していました。現在返される加重標準偏差の推定値は、R2021b より前に計算されていた加重標準偏差と次のファクタだけ異なります。
このファクタは、標本サイズが大きくなると 1 に近づきます。
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)