Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

fit

インクリメンタル学習モデルの学習

説明

関数 fit は、線形回帰 (incrementalRegressionLinear オブジェクト) または線形バイナリ分類 (incrementalClassificationLinear オブジェクト) について、構成されたインクリメンタル学習モデルをストリーミング データにあてはめます。到達したデータを使用して追加的にパフォーマンス メトリクスを追跡するには、代わりに updateMetricsAndFit を使用します。

回帰モデルまたは分類モデルを一度にデータのバッチ全体にあてはめるか交差検証するには、回帰または分類の他の機械学習モデルを参照してください。

Mdl = fit(Mdl,X,Y) はインクリメンタル学習モデル Mdl を返します。これは、予測子 X と応答データ Y を使用して学習させた、入力インクリメンタル学習モデル Mdl を表します。具体的には、fit は次の手順を実装します。

  1. 入力インクリメンタル学習モデル Mdl の構成、線形モデル係数、およびバイアス推定値を使用して、ソルバーを初期化します。

  2. データにモデルをあてはめ、更新された係数推定値と構成を出力モデル Mdl に保存します。

入力モデルと出力モデルのデータ型は同じです。

Mdl = fit(Mdl,X,Y,Name,Value) は、1 つ以上の名前と値のペアの引数によって指定された追加オプションを使用します。たとえば、観測値の重みを指定したり、予測子データ行列の列が観測値に対応することを指定したりできます。

すべて折りたたむ

バイナリ分類用の既定のインクリメンタル線形 SVM モデルを作成します。観測推定期間を 5,000、ソルバーを SGD に指定します。

Mdl = incrementalClassificationLinear('EstimationPeriod',5000,'Solver','sgd')
Mdl = 
  incrementalClassificationLinear

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


  Properties, Methods

MdlincrementalClassificationLinear モデルです。そのプロパティはすべて読み取り専用です。

Mdl を先にデータにあてはめなければ、それを使用した他の演算は実行できません。

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

load humanactivity
n = numel(actid);
rng(1) % For reproducibility
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

データ セットの詳細については、Description を表示してください。

応答は、5 つのクラスのいずれかになります。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

fit を使用してインクリメンタル モデルを学習データにあてはめます。50 個の観測値で構成されるチャンクを一度にあてはめ、データ ストリームをシミュレートします。各反復で次を行います。

  • 50 個の観測値を処理。

  • 前のインクリメンタル モデルを、入力観測値にあてはめた新しいモデルで上書き。

  • 観測値の学習回数 β1、および被験者が移動した (Y = true) かどうかの事前確率を保存して、インクリメンタル学習中の進化を監視。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
beta1 = zeros(nchunk,1);    
numtrainobs = zeros(nchunk,1);
priormoved = zeros(nchunk,1);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = fit(Mdl,X(idx,:),Y(idx));
    beta1(j) = Mdl.Beta(1);
    numtrainobs(j) = Mdl.NumTrainingObservations; 
    priormoved(j) = Mdl.Prior(Mdl.ClassNames == true);
end

IncrementalMdl は、ストリーム内のすべてのデータを適用させた incrementalClassificationLinear モデル オブジェクトです。

パラメーターがインクリメンタル学習中にどのように進化したかを確認するには、それらを別々のサブプロットにプロットします。

figure;
subplot(2,2,1)
plot(beta1)
ylabel('\beta_1')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight
subplot(2,2,2)
plot(numtrainobs);
ylabel('Number of Training Observations')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight
subplot(2,2,3)
plot(priormoved);
ylabel('Prior P(Subject Moved)')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
axis tight

プロットは、推定期間が経過するまでは、fit がモデルをデータにあてはめることも、パラメーターを更新することもないということを示します。

fitclinear を使用してバイナリ分類用の線形モデルに学習させ、モデルをインクリメンタル学習器に変換してから、そのパフォーマンスを追跡し、ストリーミング データ チャンクにあてはめます。観測値を列に配置し、観測値の重みを指定します。

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

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。予測子データの観測値を列に配置します。

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;

被験者が移動していない (Y = false) ときの収集データが、被験者が移動していたときのデータの倍の品質であると仮定します。静止している被験者から収集した観測値に 2 を割り当て、移動している被験者から収集した観測値に 1 を割り当てる重み変数を作成します。

W = ones(n,1) + ~Y;

バイナリ分類用の線形モデルの学習

バイナリ分類用の線形モデルを、データの半分から取った無作為標本にあてはめます。

idxtt = randsample([true false],n,true);
TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns',...
    'Weights',W(idxtt))
TTMdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.1107
            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.1107
           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);
Wil = W(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','Weights',Wil(idx));
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns',...
        'Weights',Wil(idx));
    beta1(j + 1) = IncrementalMdl.Beta(1);
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 がより多くのチャンクを処理するにつれて平坦になります。

線形回帰モデルのパフォーマンスが低下した場合にのみ、そのモデルに対してインクリメンタル学習を行います。

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

load NYCHousing2015

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

テーブルから応答変数 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}];

推定値またはメトリクスのウォーム アップ期間がなく、メトリクス ウィンドウ サイズが 1000 となるように、インクリメンタル学習用の線形回帰モデルを構成します。構成したモデルを最初の 100 個の観測値にあてはめます。

Mdl = incrementalRegressionLinear('EstimationPeriod',0,'MetricsWarmupPeriod',0,'MetricsWindowSize',1000);
numObsPerChunk = 100;
Mdl = fit(Mdl,X(1:numObsPerChunk,:),Y(1:numObsPerChunk));

MdlincrementalRegressionLinear モデル オブジェクトです。

条件付きのあてはめを行い、インクリメンタル学習を実行します。各反復でこの手順に従います。

  • 100 個の観測値のチャンクを一度に処理することで、データ ストリームをシミュレートします。

  • サイズが 200 の観測ウィンドウ内で、イプシロン不感応損失を計算することにより、モデル パフォーマンスを更新します。

  • それまでの最小損失の倍を超える損失が発生した場合にのみ、モデルをデータ チャンクにあてはめます。

  • パフォーマンスとあてはめを追跡するときは、前のインクリメンタル モデルを上書きします。

  • イプシロン不感応損失と β313 を保存して、損失と係数の進化を確認します。

  • fit がモデルに学習させるタイミングを追跡します。

% Preallocation
n = numel(Y) - numObsPerChunk;
nchunk = floor(n/numObsPerChunk);
beta313 = zeros(nchunk,1);
ei = array2table(nan(nchunk,2),'VariableNames',["Cumulative" "Window"]);
trained = false(nchunk,1);

% Incremental fitting
for j = 2:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;
    Mdl = updateMetrics(Mdl,X(idx,:),Y(idx));
    ei{j,:} = Mdl.Metrics{"EpsilonInsensitiveLoss",:};
    minei = min(ei{:,2});
    pdiffloss = (ei{j,2} - minei)/minei*100;
    if pdiffloss > 100
        Mdl = fit(Mdl,X(idx,:),Y(idx));
        trained(j) = true;
    end    
    beta313(j) = Mdl.Beta(end);
end

Mdl は、ストリーム内のすべてのデータを適用させた incrementalRegressionLinear モデル オブジェクトです。

モデルのパフォーマンスと β313 が学習中にどのように進化したかを確認するには、それらを別々のサブプロットにプロットします。

subplot(2,1,1)
plot(beta313)
hold on
plot(find(trained),beta313(trained),'r.')
ylabel('\beta_{313}')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
legend('\beta_{313}','Training occurs','Location','southeast')
hold off
subplot(2,1,2)
plot(ei.Variables)
ylabel('Epsilon Insensitive Loss')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
legend(ei.Properties.VariableNames)

β313 のトレース プロットは、損失がそれまでの最小損失の倍とならない定数値の期間を示します。

入力引数

すべて折りたたむ

ストリーミング データにあてはめるインクリメンタル学習モデル。incrementalClassificationLinear または incrementalRegressionLinear というモデル オブジェクトとして指定します。Mdl は、直接作成することも、サポートされている従来式の学習済み機械学習モデルを関数 incrementalLearner によって変換して作成することもできます。詳細については、対応するリファレンス ページを参照してください。

モデルがあてはめられる予測子データ チャンク。n 個の観測値と Mdl.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。名前と値のペアの引数 'ObservationsIn' の値は、変数と観測値の方向を決定します。

観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) のラベルです。

メモ

  • Mdl.NumPredictors = 0 の場合、fitX から予測子の数を推測し、出力モデルの対応するプロパティを設定します。それ以外の場合、ストリーミング データ内の予測子変数の数が Mdl.NumPredictors から変化すると、fit がエラーを生成します。

  • fit は、浮動小数点の入力予測子データのみをサポートしています。入力モデル Mdl がカテゴリカル データにあてはめられた、変換された従来型の学習済みモデルを表す場合、dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換し、すべてのダミー変数行列とその他の数値予測子を連結します。詳細は、ダミー変数を参照してください。

データ型: single | double

モデルをあてはめるラベルのチャンク。分類問題については、categorical 配列、文字配列、string 配列、logical ベクトル、浮動小数点ベクトルのいずれか、あるいは文字ベクトルの cell 配列として指定します。回帰問題については、浮動小数点ベクトルとして指定します。

観測値のラベル Y の長さと X の観測値の数は同じでなければなりません。Y(j)X 内の観測値 j (行または列) のラベルです。

分類問題では次のようになります。

  • fit はバイナリ分類のみをサポートします。

  • 入力モデル MdlClassNames プロパティが空以外の場合は、次の条件が適用されます。

    • YMdl.ClassNames のメンバーではないラベルを含む場合、fit はエラーを生成します。

    • YMdl.ClassNames のデータ型は同じでなければなりません。

データ型: char | string | cell | categorical | logical | single | double

メモ

  • 観測値 (予測子またはラベル) または重み Weight が少なくとも 1 つの欠損 (NaN) 値を含む場合、fit はその観測値を無視します。したがって、fit は n 個よりも少ない観測値を使用してモデル パフォーマンスを計算します。

  • チャンク サイズ n と確率的勾配降下 (SGD) ハイパーパラメーター バッチ サイズ (Mdl.BatchSize) は異なる値とすることができます。n < Mdl.BatchSize の場合、fit は SGD の適用時に n 個の利用可能な観測値を使用します。

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'ObservationsIn','columns','Weights',W は、予測子行列の列が観測値に対応すること、およびインクリメンタル学習中に適用する観測値の重みがベクトル W に格納されていることを指定します。

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。

観測値の重みのチャンク。'Weights' と正の値の浮動小数点ベクトルで構成されるコンマ区切りのペアとして指定します。fit は、Weights 内の対応する値を使用して X 内の観測値に重みを付けます。Weights のサイズは X 内の観測値の数 n と同じでなければなりません。

既定では Weightsones(n,1) です。

正規化方式を含む詳細については、観測値の重みを参照してください。

データ型: double | single

出力引数

すべて折りたたむ

更新されたインクリメンタル学習モデル。incrementalClassificationLinear または incrementalRegressionLinear の入力モデル Mdl と同じデータ型のインクリメンタル学習モデル オブジェクトとして返されます。

Mdl.EstimationPeriod > 0 の場合、インクリメンタル近似関数 updateMetricsAndFit および fit は、それらに渡された最初の Mdl.EstimationPeriod 観測値を使用してハイパーパラメーターを推定します。これらの関数がそのデータへの入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、fit は最初の n – m 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルをあてはめます。したがって、ソフトウェアは、Beta プロパティ、Bias プロパティ、ハイパーパラメーター プロパティ、および NumTrainingObservations などの記録保存プロパティを更新します。

分類問題の場合、入力モデル MdlClassNames プロパティが空の配列であれば、fit は出力モデル MdlClassNames プロパティを unique(Y) に設定します。

ヒント

  • 従来式の学習とは異なり、インクリメンタル学習用の個別の検定 (ホールドアウト) セットが存在しない場合もあります。そのため、データの各入力チャンクを検定セットとして扱うには、インクリメンタル モデルと各入力チャンクを、同じデータでモデルに学習させる前に updateMetrics に渡します。

アルゴリズム

すべて折りたたむ

観測値の重み

分類問題では、クラスの事前確率分布が既知 (Mdl.PriorNaN 値で構成されない) の場合、fit は、観測値の重みを正規化して、それぞれのクラスの事前クラス確率の合計になるようにします。このアクションは、観測値の重みが既定でそれぞれのクラスの事前確率であることを前提としています。

回帰問題の場合、またはクラスの事前確率分布が未知である場合、ソフトウェアは、fit が呼び出されるたびに、指定された観測値の重みを正規化して、合計が 1 になるようにします。

R2020b で導入