Main Content

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

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

  1. データのサブセットで線形回帰モデルに学習させます。

  2. 従来式の学習済みモデルを、線形回帰用のインクリメンタル学習モデルに変換します。

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

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

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

2015 年のニューヨーク市住宅データ セットを読み込み、データをシャッフルします。このデータの詳細については、NYC Open Data を参照してください。

load NYCHousing2015
rng(1) % For reproducibility
n = size(NYCHousing2015,1);
idxshuff = randsample(n,n);
NYCHousing2015 = NYCHousing2015(idxshuff,:);

マンハッタンから収集されたデータ (BOROUGH = 1) が、品質を 2 倍にする新しい方法を使用して収集されたとします。マンハッタンから収集した観測値に 2 を割り当て、その他すべての観測値に 1 を割り当てる重み変数を作成します。

NYCHousing2015.W = ones(n,1) + (NYCHousing2015.BOROUGH == 1);

テーブルから応答変数 SALEPRICE を抽出します。数値安定性を得るために、SALEPRICE1e6 の尺度でスケールします。

Y = NYCHousing2015.SALEPRICE/1e6;
NYCHousing2015.SALEPRICE = [];

カテゴリカル予測子からダミー変数メトリクスを作成します。

catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"];
dumvarstbl = varfun(@(x)dummyvar(categorical(x)),NYCHousing2015,...
    'InputVariables',catvars);
dumvarmat = table2array(dumvarstbl);
NYCHousing2015(:,catvars) = [];

テーブル内の他のすべての数値変数を売価の線形予測子として扱います。ダミー変数の行列を予測子データの残りに連結します。データを転置します。

idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform');
X = [dumvarmat NYCHousing2015{:,idxnum}]';

線形回帰モデルの学習

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

idxtt = randsample([true false],n,true);
TTMdl = fitrlinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns')
TTMdl = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1889
               Lambda: 2.1977e-05
              Learner: 'svm'


TTMdl は従来式の学習済み線形回帰モデルを表す RegressionLinear モデル オブジェクトです。

学習済みモデルの変換

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalRegressionLinear

               IsWarm: 1
              Metrics: [1x2 table]
    ResponseTransform: 'none'
                 Beta: [313x1 double]
                 Bias: 0.1889
              Learner: 'svm'


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

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

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

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

  3. 損失および最後に推定された係数 β313 を保存します。

% Preallocation
numObsPerChunk = 500;
nchunk = floor(n/numObsPerChunk);
ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta313 = zeros(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,X(:,idx),Y(idx),'ObservationsIn','columns');
    ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:};
    IncrementalMdl = fit(IncrementalMdl,X(:,idx),Y(idx),'ObservationsIn','columns');
    beta313(j) = IncrementalMdl.Beta(end);
end

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

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

モデルの進化の検査

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

t = tiledlayout(2,1);
nexttile
h = plot(ei.Variables);
xlim([0 nchunk])
ylabel('Epsilon Insensitive Loss')
legend(h,ei.Properties.VariableNames)
nexttile
plot(beta313)
ylabel('\beta_{313}')
xlim([0 nchunk])
xlabel(t,'Iteration')

Figure contains 2 axes objects. Axes object 1 with ylabel Epsilon Insensitive Loss contains 2 objects of type line. These objects represent Cumulative, Window. Axes object 2 with ylabel \beta_{313} contains an object of type line.

累積の損失は各反復 (500 個の観測値のチャンク) ごとに徐々に変化しますが、ウィンドウの損失には急な変動があります。メトリクス ウィンドウの既定値は 200 なので、updateMetrics は 500 個の観測値のチャンクごとに最新の 200 個の観測値に基づいて性能を測定します。

β313 はまず急激に変動した後、fit が観測値のチャンクを処理するたびに少しずつ変化します。

参考

オブジェクト

関数

関連するトピック