Main Content

回帰学習器で学習させた SVM 回帰モデルからのインクリメンタル学習モデルの初期化

この例では、回帰学習器アプリを使用して線形 SVM 回帰モデルの調整と学習を行う方法を示します。その後、コマンド ラインで、アプリでの学習から得た情報を使用して、線形 SVM 回帰用のインクリメンタル モデルを初期化し、学習を行います。

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

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

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

数値安定性を得るために、SALEPRICE1e6 の尺度でスケールします。

NYCHousing2015.SALEPRICE = NYCHousing2015.SALEPRICE/1e6;

線形 SVM 回帰モデルにデータの約 1% を学習させ、残りのデータをインクリメンタル学習用に予約するとします。

回帰学習器はカテゴリカル変数をサポートします。ただし、インクリメンタル学習用モデルにはダミー コード化されたカテゴリカル変数が必要です。変数 BUILDINGCLASSCATEGORY および変数 NEIGHBORHOOD に含まれる水準は種類が多い (件数が少ないものもある) ことから、区画内にすべてのカテゴリが含まれない可能性が高くなります。そのため、すべてのカテゴリカル変数をダミー コード化します。ダミー変数の行列を数値変数の残りに連結します。

catvars = ["BOROUGH" "BUILDINGCLASSCATEGORY" "NEIGHBORHOOD"];
dumvars = splitvars(varfun(@(x)dummyvar(categorical(x)),NYCHousing2015, ...
      'InputVariables',catvars));
NYCHousing2015(:,catvars) = [];
idxnum = varfun(@isnumeric,NYCHousing2015,'OutputFormat','uniform');
NYCHousing2015 = [dumvars NYCHousing2015(:,idxnum)];

cvpartition を呼び出し、0.99 のホールドアウト (テスト) 標本比率を指定して、データを無作為に 1% と 99% のサブセットに分割します。1% と 99% の区画用のテーブルを作成します。

cvp = cvpartition(n,'HoldOut',0.99);
idxtt = cvp.training;
idxil = cvp.test;
NYCHousing2015tt = NYCHousing2015(idxtt,:);
NYCHousing2015il = NYCHousing2015(idxil,:);

回帰学習器を使用したモデルの調整と学習

コマンド ラインに regressionLearner と入力して、回帰学習器を開きます。

regressionLearner

あるいは、[アプリ] タブで [さらに表示] 矢印をクリックしてアプリ ギャラリーを開きます。[機械学習および深層学習] でアプリのアイコンをクリックします。

学習データ セットと変数を選択します。

  1. [回帰学習器] タブで、[ファイル] セクションの [新規セッション] を選択し、[ワークスペースから] を選択します。

  2. [ワークスペースからの新規セッション] ダイアログ ボックスで、[データ セット変数] のデータ セット [NYCHousing2015tt] を選択します。

  3. [応答] で、応答変数 [SALEPRICE] が選択されていることを確認します。

  4. [セッションの開始] をクリックします。

アプリは既定で 5 分割交差検証を実施します。

線形 SVM 回帰モデルを学習させます。ベイズ最適化を使用して [イプシロン] ハイパーパラメーターのみを調整します。

  1. [回帰学習器] タブの [モデル] セクションで [さらに表示] 矢印をクリックしてアプリ ギャラリーを開きます。[サポート ベクター マシン] セクションで [最適化可能な SVM] をクリックします。

  2. モデルの [概要] タブの [モデルのハイパーパラメーター] セクションで、次のようにします。

    1. [イプシロン] を除くすべての使用可能なオプションの [最適化] ボックスの選択を解除します。

    2. [カーネル スケール] の値を [手動] および 1 に設定します。

    3. [データの標準化] の値を [いいえ] に設定します。

    SVM hyperparameter optimization options

  3. [回帰学習器] タブの [学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。

アプリは、最適化が進行するにしたがってモデルの汎化最小 MSE のプロットを表示します。アプリでアルゴリズムが最適化されるまでに時間がかかることがあります。

Minimum MSE plot for the optimizable SVM model

学習済みの最適化された線形 SVM 回帰モデルをエクスポートします。

  1. [回帰学習器] タブの [エクスポート] セクションで [モデルのエクスポート] を選択し、[モデルのエクスポート] を選択します。

  2. [モデルのエクスポート] ダイアログ ボックスで [OK] をクリックします。

アプリは、学習済みのモデルを構造体配列 trainedModel で他の変数と共にワークスペースに渡します。回帰学習器を閉じます。

エクスポートされたモデルのインクリメンタル モデルへの変換

コマンド ラインで、trainedModel から学習済みの SVM 回帰モデルを抽出します。

Mdl = trainedModel.RegressionSVM;

モデルをインクリメンタル モデルに変換します。

IncrementalMdl = incrementalLearner(Mdl)
IncrementalMdl.Epsilon
IncrementalMdl = 

  incrementalRegressionLinear

               IsWarm: 1
              Metrics: [1×2 table]
    ResponseTransform: 'none'
                 Beta: [312×1 double]
                 Bias: 12.3802
              Learner: 'svm'


  Properties, Methods


ans =

    5.4536

IncrementalMdl は、線形 SVM 回帰モデルを使用したインクリメンタル学習用の incrementalRegressionLinear モデル オブジェクトです。incrementalLearner は、Mdl から学習した Epsilon ハイパーパラメーターの係数および最適化された値を使用して、IncrementalMdl を初期化します。そのため、IncrementalMdl とデータを predict に渡すことで応答を予測できます。また、IsWarm プロパティは true です。つまり、インクリメンタル学習関数は、インクリメンタル学習の最初からモデルの性能を測定します。

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

インクリメンタル学習関数は浮動小数点行列のみを受け入れるため、予測子と応答データの行列を作成します。

Xil = NYCHousing2015il{:,1:(end-1)};
Yil = NYCHousing2015il{:,end};

関数 updateMetricsAndFit を使用して、99% のデータ区画でインクリメンタル学習を実行します。500 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. updateMetricsAndFit を呼び出し、観測値の入力チャンクを所与として、モデルのイプシロン不感応損失の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。

  2. 損失と最後に推定された係数 β313 を保存します。

% Preallocation
nil = sum(idxil);
numObsPerChunk = 500;
nchunk = floor(nil/numObsPerChunk);
ei = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta313 = [IncrementalMdl.Beta(end); zeros(nchunk,1)];

% Incremental learning
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetricsAndFit(IncrementalMdl,Xil(idx,:),Yil(idx));
    ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:};
    beta313(j + 1) = IncrementalMdl.Beta(end);
end

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

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

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

Trace plots of the epsilon-insensitive loss and last coefficient

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

β313 は急激に変動した後、updateMetricsAndFit が観測値のチャンクを処理するたびに平坦になります。

参考

アプリ

オブジェクト

関数

関連するトピック