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