柔軟なワークフローを使用した分類用のインクリメンタル学習の実装
この例では、柔軟なワークフローを使用して、逐次予測評価を伴うバイナリ分類用のインクリメンタル学習を実装する方法を示します。従来式の学習済みモデルは、インクリメンタル モデルを初期化します。この例は、具体的に次のことを行います。
データのサブセットでバイナリ分類用の線形モデルに学習させます。
従来式の学習済みモデルを、バイナリ分類用のインクリメンタル学習モデルに変換します。
観測値の小さなチャンクをインクリメンタル学習アルゴリズムにフィードする for ループを使用して、データ ストリームをシミュレートします。
各チャンクに対し、
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' Properties, Methods
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' Properties, Methods
インクリメンタル学習の実装
柔軟なワークフローを使用して、関数 updateMetrics
と fit
を別々に呼び出して、モデルのパフォーマンス メトリクスを更新し、インクリメンタル モデルを学習データに当てはめます。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。
updateMetrics
を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics
プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の向きを列方向に指定します。fit
を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の向きを列方向に指定します。分類誤差と推定された最初の係数 を保存します。
% 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
を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。
モデルの進化の検査
パフォーマンス メトリクスと推定された係数 のトレース プロットをプロットします。
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')
累積の損失は安定しており徐々に減少しますが、ウィンドウの損失には急な変動があります。
はまず急激に変動した後、fit
がより多くの観測値のチャンクを処理するにつれて徐々に平坦になります。