Main Content

incrementalLearner

単純ベイズ分類モデルのインクリメンタル学習器への変換

説明

IncrementalMdl = incrementalLearner(Mdl) は、従来式の学習済み単純ベイズ分類モデル Mdl のハイパーパラメーターを使用して、インクリメンタル学習用の単純ベイズ分類モデル IncrementalMdl を返します。プロパティ値は Mdl から得られた知識を反映しているため、IncrementalMdl は新しい観測値に対してラベルの予測を行うことができます。また "ウォーム" となるため、予測性能が追跡されます。

IncrementalMdl = incrementalLearner(Mdl,Name,Value) は、1 つ以上の名前と値の引数によって指定された追加オプションを使用します。一部のオプションでは、予測パフォーマンスの追跡を行う前に IncrementalMdl に学習させる必要があります。たとえば、'MetricsWarmupPeriod',50,'MetricsWindowSize',100 は、50 個の観測値から成る、パフォーマンス メトリクスの追跡前のインクリメンタル学習の予備期間を指定し、ウィンドウ パフォーマンス メトリクスを更新する前に 100 個の観測値を処理することを指定します。

すべて折りたたむ

fitcnb を使用して単純ベイズ モデルに学習させ、それをインクリメンタル学習器に変換します。

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

人の行動のデータ セットを読み込みます。

load humanactivity

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

単純ベイズ モデルの学習

単純ベイズ分類モデルをデータ セット全体に当てはめます。

TTMdl = fitcnb(feat,actid);

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 モデル オブジェクトです。

  • 関数 incrementalLearner は、学習した条件付き予測子分布パラメーターを、TTMdl が学習データから抽出する他の情報と共に渡して、インクリメンタル学習器を初期化します。

  • IncrementalMdl はウォーム (IsWarm1) です。これは、インクリメンタル学習関数がパフォーマンス メトリクスの追跡と予測を実行できることを意味します。

応答予測

従来式の学習済みモデルから変換して作成したインクリメンタル学習器は、追加の処理なしで予測を生成できます。

両方のモデルを使用して、すべての観測値の分類スコア (クラス事後確率) を予測します。

[~,ttscores] = predict(TTMdl,feat);
[~,ilcores] = predict(IncrementalMdl,feat);
compareScores = norm(ttscores - ilcores)
compareScores = 0

モデルによって生成されたスコアの差は 0 です。

学習済みの単純ベイズ モデルを使用して、インクリメンタル学習器を初期化します。メトリクスのウォームアップ期間を指定して、インクリメンタル学習器を準備します。その間、関数updateMetricsAndFitはモデルの当てはめのみを行います。メトリクス ウィンドウ サイズを観測値 500 個に指定します。

人の行動のデータ セットを読み込みます。

load humanactivity

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

データをランダムに 2 分割します。最初の半分は従来式のモデルの学習用、残りの半分はインクリメンタル学習用です。

n = numel(actid);

rng(1) % For reproducibility
cvp = cvpartition(n,'Holdout',0.5);
idxtt = training(cvp);
idxil = test(cvp);

% First half of data
Xtt = feat(idxtt,:);
Ytt = actid(idxtt);

% Second half of data
Xil = feat(idxil,:);
Yil = actid(idxil);

データの最初の半分に単純ベイズ モデルを当てはめます。クラス 2 を誤分類した場合に分類器に 2 倍のペナルティを与えるものとします。

C = ones(5) - eye(5);
C(2,[1 3 4 5]) = 2;
TTMdl = fitcnb(Xtt,Ytt,'Cost',C);

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

  • メトリクスのウォームアップ期間は観測値 2000 個。

  • メトリクス ウィンドウ サイズは観測値 500 個。

  • 分類誤差および最小コストを使用してモデルの性能を測定。incrementalClassificationNaiveBayes はこのメトリクスを常に追跡するため、Metrics"mincost" を指定する必要はありません。

IncrementalMdl = incrementalLearner(TTMdl,'MetricsWarmupPeriod',2000,'MetricsWindowSize',500,...
    'Metrics','classiferror');

関数 updateMetricsAndFit を使用して、インクリメンタル モデルをデータの残りの半分に当てはめます。各反復で次を行います。

  • 20 個の観測値を一度に処理して、データ ストリームをシミュレート。

  • 前のインクリメンタル モデルを、入力観測値に当てはめた新しいモデルで上書き。

  • 1 番目のクラス内の 2 番目の予測子の平均 μ12、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。

% Preallocation
nil = numel(Yil);
numObsPerChunk = 20;
nchunk = ceil(nil/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
mc = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
mu12 = [IncrementalMdl.DistributionParameters{1,2}(1); zeros(nchunk,1)];    

% 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));
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:};
    mu12(j + 1) = IncrementalMdl.DistributionParameters{1,2}(1);
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationNaiveBayes モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は入力観測値でモデルの性能をチェックし、モデルをその観測値に当てはめます。

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

t = tiledlayout(3,1);
nexttile
plot(mu12)
ylabel('\mu_{12}')
xlim([0 nchunk]);
xline(IncrementalMdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
nexttile
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
xline(IncrementalMdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,ce.Properties.VariableNames,'Location','northwest')
nexttile
h = plot(mc.Variables);
xlim([0 nchunk]);
ylabel('Minimal Cost')
xline(IncrementalMdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,mc.Properties.VariableNames,'Location','northwest')
xlabel(t,'Iteration')

Figure contains 3 axes objects. Axes object 1 contains 2 objects of type line, constantline. Axes object 2 contains 3 objects of type line, constantline. These objects represent Cumulative, Window. Axes object 3 contains 3 objects of type line, constantline. These objects represent Cumulative, Window.

このプロットは、updateMetricsAndFit が次のアクションを実行することを示しています。

  • μ12 をインクリメンタル学習のすべての反復で当てはめる。

  • パフォーマンス メトリクスをメトリクスのウォームアップ期間 (赤色の垂直な線) 後にのみ計算。

  • 累積メトリクスを各反復中に計算。

  • ウィンドウ メトリクスを 500 個の観測値 (25 回の反復) の処理後に計算。

データは行動で順序付けされるため、平均とパフォーマンス メトリクスは定期的に急激に変動します。

入力引数

すべて折りたたむ

マルチクラス分類用の従来式の学習済み単純ベイズ モデル。fitcnb によって返される ClassificationNaiveBayes モデル オブジェクトとして指定します。Mdl.DistributionNames に格納される各予測子変数の条件付き分布はカーネル分布にはできません。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: 'Metrics',["classiferror" "mincost"],'MetricsWindowSize',100 は、誤分類率と最小コストを追跡することを指定し、ウィンドウ パフォーマンス メトリクスを更新する前に 100 個の観測値を処理することを指定します。

関数 updateMetrics または updateMetricsAndFit を使ってインクリメンタル学習中に追跡するモデルのパフォーマンス メトリクス。組み込みの損失関数の名前、名前の string ベクトル、関数ハンドル (@metricName など)、関数ハンドルの構造体配列、または名前、関数ハンドル、構造体配列の cell ベクトルとして指定します。

次の表は、組み込みの損失関数名の一覧です。string ベクトルを使用して、複数指定できます。

名前説明
"binodeviance"二項分布からの逸脱度
"classiferror"分類誤差
"exponential"指数
"hinge"ヒンジ
"logit"ロジスティック
"mincost"最小予測誤分類コスト (事後確率である分類スコアの場合)
"quadratic"2 次

組み込み損失関数の詳細については、loss を参照してください。

例: 'Metrics',["classiferror" "mincost"]

パフォーマンス メトリクスを返すカスタム関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。

metric = customMetric(C,S,Cost)

  • 出力引数 metric は n 行 1 列の数値ベクトルです。ここで、各要素は、学習サイクル中にインクリメンタル学習関数によって処理されたデータの対応する観測値の損失です。

  • 関数名 (ここでは customMetric) を選択します。

  • C は n 行 K 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。K はクラスの数です。列の順序は ClassNames プロパティのクラスの順序に対応します。C を作成するには、指定されたデータの各観測値について観測値 p がクラス q に属する場合に C(p,q) = 1 を設定します。行 p の他の要素を 0 に設定します。

  • S は、予測分類スコアの n 行 K 列の数値行列です。Spredict の出力 Score に似ています。ここで、行はデータの観測値に対応し、列の順序は ClassNames プロパティのクラスの順序に対応しています。S(p,q) は、クラス q に分類されている観測値 p の分類スコアです。

  • Cost は、誤分類コストの、K 行 K 列の数値行列です。名前と値の引数 'Cost' を参照してください。

複数のカスタム メトリクスを指定し、それぞれにカスタム名を割り当てるには、構造体配列を使用します。組み込みメトリクスとカスタム メトリクスの組み合わせを指定するには、cell ベクトルを使用します。

例: 'Metrics',struct('Metric1',@customMetric1,'Metric2',@customMetric2)

例: 'Metrics',{@customMetric1 @customMetric2 'logit' struct('Metric3',@customMetric3)}

updateMetrics および updateMetricsAndFit は、table で指定したメトリクスをプロパティ IncrementalMdl.Metrics に保存します。Metrics のデータ型によって、table の行名が決まります。

'Metrics' 値のデータ型Metrics プロパティの行名の説明
string または文字ベクトル対応する組み込みメトリクスの名前"classiferror" の行名は "ClassificationError"
構造体配列フィールド名struct('Metric1',@customMetric1) の行名は "Metric1"
プログラム ファイルに格納されている関数への関数ハンドル関数名@customMetric の行名は "customMetric"
無名関数CustomMetric_j。ここで、jMetrics のメトリクス j@(C,S,Cost)customMetric(C,S,Cost)... の行名は CustomMetric_1

パフォーマンス メトリクス オプションの詳細については、パフォーマンス メトリクスを参照してください。

データ型: char | string | struct | cell | function_handle

インクリメンタル モデルが Metrics プロパティのパフォーマンス メトリクスを追跡する前に当てはめなければならない観測値の数。非負の整数として指定します。インクリメンタル モデルは、インクリメンタル近似関数が MetricsWarmupPeriod 個の観測値をインクリメンタル モデルに当てはめた後、ウォームになります。

パフォーマンス メトリクス オプションの詳細については、パフォーマンス メトリクスを参照してください。

例: 'MetricsWarmupPeriod',50

データ型: single | double

ウィンドウ パフォーマンス メトリクスの計算に使用する観測値の数。正の整数として指定します。

パフォーマンス メトリクス オプションの詳細については、パフォーマンス メトリクスを参照してください。

例: 'MetricsWindowSize',100

データ型: single | double

出力引数

すべて折りたたむ

インクリメンタル学習用の単純ベイズ分類モデル。incrementalClassificationNaiveBayes モデル オブジェクトとして返されます。IncrementalMdl は新しいデータに基づいて予測を生成するようにも構成されます (predict を参照)。

incrementalLearner は、Mdl のモデル情報を使用して IncrementalMdl をインクリメンタル学習用に初期化します。次の表は、incrementalLearnerIncrementalMdl の対応するプロパティに渡す Mdl のプロパティを示したものです。関数では、これらのほかに、Y (クラス ラベル) や W (観測値の重み) など、IncrementalMdl を初期化するために必要なモデル プロパティも使用します。

プロパティ説明
CategoricalLevels

多変量多項予測子のレベル。NumPredictors と同じ長さの cell 配列

CategoricalPredictorsカテゴリカル予測子のインデックス。正の整数のベクトル
ClassNamesバイナリ分類のクラス ラベル。名前のリスト
Cost誤分類コスト。数値行列
DistributionNames予測子変数の条件付き分布の名前。各セルに 'normal' または 'mvmn' を含む cell 配列か、もしくは値 'mn'
DistributionParameters予測子変数の条件付き分布のパラメーター値。長さ 2 の数値ベクトルの cell 配列 (詳細については DistributionParameters を参照)
NumPredictors予測子の数。正の整数
Prior前のクラス ラベルの分布。数値ベクトル
ScoreTransformスコア変換関数。関数名または関数ハンドル

詳細

すべて折りたたむ

インクリメンタル学習

"インクリメンタル学習" ("オンライン学習") は、予測子変数の分布、予測関数や目的関数の要素 (調整パラメーターの値を含む)、観測値のラベル付けなどがほとんど未知、またはまったく未知の可能性のある、データ ストリームからの入力データの処理に着目した、機械学習の一分野です。インクリメンタル学習が従来の機械学習と異なっているのは、モデルへの当てはめ、ハイパーパラメーター調整のための交差検証の実行、および予測子の分布の推測を行うために、十分にラベル付けされたデータを使用できるということです。

入力観測値に対し、インクリメンタル学習モデルは、次のいずれかの方法 (通常はこの順序) でデータを処理します。

  • ラベルの予測。

  • 予測性能の測定。

  • モデルの構造的な破綻やドリフトについてのチェック。

  • 入力観測値へのモデルの当てはめ。

詳細については、インクリメンタル学習の概要を参照してください。

アルゴリズム

すべて折りたたむ

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

  • 関数 updateMetrics および updateMetricsAndFit は、インクリメンタル モデルが "ウォーム" (IsWarm プロパティが true) のときにのみ、新しいデータからモデルのパフォーマンス メトリクス (Metrics) を追跡します。

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

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

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

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

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

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

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

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

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

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

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

バージョン履歴

R2021a で導入