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: [60×1 double]
              Bias: -0.2998
            Lambda: 8.2967e-05
           Learner: 'svm'


  Properties, Methods

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

学習済みモデルの変換

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

            IsWarm: 1
           Metrics: [1×2 table]
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.2998
           Learner: 'svm'


  Properties, Methods

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

柔軟なワークフローを使用して、関数 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 のトレース プロットをプロットします。

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

累積の損失は安定しており徐々に減少しますが、ウィンドウの損失は不連続です。

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

参考

オブジェクト

関数

関連するトピック