Main Content

柔軟なワークフローを使用した分類用のインクリメンタル学習の実装

この例では、柔軟なワークフローを使用して、逐次予測評価を伴うバイナリ分類用のインクリメンタル学習を実装する方法を示します。従来式の学習済みモデルは、インクリメンタル モデルを初期化します。この例は、具体的に次のことを行います。

  1. データのサブセットでバイナリ分類用の線形モデルに学習させます。

  2. 従来式の学習済みモデルを、バイナリ分類用のインクリメンタル学習モデルに変換します。

  3. 観測値の小さなチャンクをインクリメンタル学習アルゴリズムにフィードする for ループを使用して、データ ストリームをシミュレートします。

  4. 各チャンクに対し、updateMetrics を使用して、入力データに対するモデルの性能を測定し、fit を使用してモデルをデータに当てはめます。

この例ではアプリケーションをバイナリ分類問題として扱いますが、これと同じワークフローに従って、マルチクラス問題用のオブジェクトを使用すると、マルチクラスのインクリメンタル学習を実装できます。

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

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。予測子データの観測値を列に配置します。

load humanactivity
rng(1) % For reproducibility
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:)';
Y = actid(idx);

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

応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

バイナリ分類用の線形モデルの学習

バイナリ分類用の線形モデルを、データの半分から取った無作為標本に当てはめます。観測値がデータの列に沿うように指定します。

idxtt = randsample([true false],n,true);
TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns')
TTMdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60x1 double]
              Bias: -0.2999
            Lambda: 8.2967e-05
           Learner: 'svm'


TTMdl は、バイナリ分類用の従来式の学習済み線形モデルを表す ClassificationLinear モデル オブジェクトです。

学習済みモデルの変換

従来式の学習済み分類モデルを、インクリメンタル学習用のバイナリ分類線形モデルに変換します。

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

            IsWarm: 1
           Metrics: [1x2 table]
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60x1 double]
              Bias: -0.2999
           Learner: 'svm'


インクリメンタル学習の実装

柔軟なワークフローを使用して、関数 updateMetricsfit を別々に呼び出して、モデルのパフォーマンス メトリクスを更新し、インクリメンタル モデルを学習データに当てはめます。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. updateMetrics を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の向きを列方向に指定します。

  2. fit を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の向きを列方向に指定します。

  3. 分類誤差と推定された最初の係数 β1 を保存します。

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta1 = [IncrementalMdl.Beta(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),...
        'ObservationsIn','columns');
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns');
    beta1(j + 1) = IncrementalMdl.Beta(end);
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear モデル オブジェクトです。

あるいは、updateMetricsAndFit を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。

モデルの進化の検査

パフォーマンス メトリクスと推定された係数 β1 のトレース プロットをプロットします。

t = tiledlayout(2,1);
nexttile
h = plot(ce.Variables);
xlim([0 nchunk])
ylabel('Classification Error')
legend(h,ce.Properties.VariableNames)
nexttile
plot(beta1)
ylabel('\beta_1')
xlim([0 nchunk])
xlabel(t,'Iteration')

Figure contains 2 axes objects. Axes object 1 with ylabel Classification Error contains 2 objects of type line. These objects represent Cumulative, Window. Axes object 2 with ylabel \beta_1 contains an object of type line.

累積の損失は安定しており徐々に減少しますが、ウィンドウの損失には急な変動があります。

β1 はまず急激に変動した後、fit がより多くの観測値のチャンクを処理するにつれて徐々に平坦になります。

参考

オブジェクト

関数

関連するトピック