メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

updateMetricsAndFit

R2026a

カーネル インクリメンタル学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習

R2022a 以降

説明

ストリーミング データが与えられると、updateMetricsAndFit は、最初に、入力データの updateMetrics を呼び出して、カーネル回帰用 (incrementalRegressionKernel オブジェクト) またはバイナリ カーネル分類用 (incrementalClassificationKernel オブジェクト) に構成されたインクリメンタル学習モデルのパフォーマンスを評価します。次に、updateMetricsAndFit は、fit を呼び出して、モデルをそのデータに当てはめます。言い換えると、updateMetricsAndFit は "逐次予測評価" を実行します。データの各入力チャンクをテスト セットとして扱い、累積的に測定されたパフォーマンス メトリクスと指定したウィンドウにおけるパフォーマンス メトリクスを追跡します[1]。

updateMetricsAndFit は、モデルのパフォーマンス メトリクスを更新し、データの各チャンクでモデルに学習させる簡単な方法を提供します。また、updateMetrics を呼び出してから fit を呼び出して、個別に操作を実行することもできます。これにより柔軟性を高めることができます (たとえば、データのチャンクでのパフォーマンスに基づいて、モデルに学習させる必要があるかどうかを決定できます)。

Mdl = updateMetricsAndFit(Mdl,X,Y) は、インクリメンタル学習モデル Mdl を返します。これは、入力インクリメンタル学習モデル Mdl であり、次の変更が行われます。

  1. updateMetricsAndFit は、入力予測子と応答データ (それぞれ X と Y) のモデル パフォーマンスを測定します。入力モデルが "ウォーム" (Mdl.IsWarm が true) の場合、updateMetricsAndFit は以前に計算されたメトリクスを上書きし、Metrics プロパティに新しい値を保存します。それ以外の場合、updateMetricsAndFit は代わりに Metrics に NaN 値を保存します。

  2. updateMetricsAndFit は、次の手順に従って、変更されたモデルを入力データに当てはめます。

    1. 入力モデル Mdl の構成とモデル パラメーターを使用してソルバーを初期化します。

    2. データにモデルを当てはめ、更新されたモデル パラメーターと構成を出力モデル Mdl に保存します。

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

例

Mdl = updateMetricsAndFit(Mdl,X,Y,Weights=weights) は、観測値の重みも設定します。

例

例

すべて折りたたむ

incrementalClassificationKernel を呼び出して、バイナリ分類用のインクリメンタル カーネル モデルを直接作成します。updateMetricsAndFit を使用して、モデルの性能を追跡してモデルをストリーミング データに当てはめる操作を 1 回の呼び出しで行います。

バイナリ分類用の既定のインクリメンタル カーネル モデルを作成します。

Mdl = incrementalClassificationKernel()
Mdl = 
  incrementalClassificationKernel

                    IsWarm: 0
                   Metrics: [1×2 table]
                ClassNames: [1×0 double]
            ScoreTransform: 'none'
    NumExpansionDimensions: 0
               KernelScale: 1


  Properties, Methods

Mdl は incrementalClassificationKernel モデル オブジェクトです。そのプロパティはすべて読み取り専用です。

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;

関数 updateMetricsAndFit を使用して、インクリメンタル モデルを学習データに当てはめます。各反復で次を行います。

  • 50 個の観測値のチャンクを処理して、データ ストリームのシミュレーションを実行します。

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

  • 累積メトリクス、ウィンドウ メトリクス、および学習観測値の数を保存し、インクリメンタル学習中にそれらがどのように進化するかを確認します。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
ce = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]);
numtrainobs = [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 = updateMetricsAndFit(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    numtrainobs(j) = Mdl.NumTrainingObservations; 
end

Mdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationKernel モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は入力観測値でモデルの性能をチェックし、モデルをその観測値に当てはめます。

観測値の数とパフォーマンス メトリクスが学習中にどのように進化するかを確認するには、それらを別々のタイルにプロットします。

t = tiledlayout(2,1);
nexttile
plot(numtrainobs)
ylabel("Number of Training Observations")
xlim([0 nchunk])
nexttile
plot(ce.Variables)
xlim([0 nchunk])
ylabel("Classification Error")
xline((Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod)/numObsPerChunk,"--");
legend(ce.Properties.VariableNames)
xlabel(t,"Iteration")

Figure contains 2 axes objects. Axes object 1 with ylabel Number of Training Observations contains an object of type line. Axes object 2 with ylabel Classification Error contains 3 objects of type line, constantline. These objects represent Cumulative, Window.

プロットは、updateMetricsAndFit が次を行うことを示しています。

  • モデルをインクリメンタル学習のすべての反復で当てはめます。

  • パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算します。

  • 累積メトリクスを各反復中に計算します。

  • ウィンドウ メトリクスを 200 個の観測値 (4 回の反復) の処理後に計算します。

fitrkernel を使用してカーネル回帰モデルに学習させ、incrementalLearner を使用してインクリメンタル学習器に変換します。updateMetricsAndFit を使用して、モデルの性能を追跡してモデルをストリーミング データに当てはめる操作を 1 回の呼び出しで行います。updateMetricsAndFit を呼び出すときに観測値の重みを指定します。

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

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 を割り当てる重み変数を作成します。

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

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

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

この例の計算コストを削減するために、254 個のカテゴリをもつカテゴリカル変数が含まれている NEIGHBORHOOD 列を削除します。

NYCHousing2015.NEIGHBORHOOD = [];

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

catvars = ["BOROUGH","BUILDINGCLASSCATEGORY"];
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 = fitrkernel(X(idxtt,:),Y(idxtt),Weights=NYCHousing2015.W(idxtt))
TTMdl = 
  RegressionKernel
              ResponseName: 'Y'
                   Learner: 'svm'
    NumExpansionDimensions: 2048
               KernelScale: 1
                    Lambda: 2.1977e-05
             BoxConstraint: 1
                   Epsilon: 0.0547


  Properties, Methods

TTMdl は従来式の学習済みカーネル回帰モデルを表す RegressionKernel モデル オブジェクトです。

学習済みモデルの変換

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

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalRegressionKernel

                    IsWarm: 1
                   Metrics: [1×2 table]
         ResponseTransform: 'none'
    NumExpansionDimensions: 2048
               KernelScale: 1


  Properties, Methods

IncrementalMdl は incrementalRegressionKernel モデル オブジェクトです。そのプロパティはすべて読み取り専用です。

パフォーマンス メトリクスの追跡とモデルの当てはめ

関数 updateMetricsAndFit を使用して、残りのデータに対してインクリメンタル学習を実行します。各反復で次を行います。

  1. 500 個の観測値のチャンクを処理して、データ ストリームのシミュレーションを実行します。

  2. updateMetricsAndFit を呼び出し、観測値の入力チャンクを所与として、モデルのイプシロン不感応損失の累積とウィンドウを更新し、モデルをデータに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。観測値の重みを指定します。

  3. 損失を保存します。

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 500;
nchunk = floor(nil/numObsPerChunk);
ei = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]);
Xil = X(idxil,:);
Yil = Y(idxil);
Wil = NYCHousing2015.W(idxil);

% Incremental fitting
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), ...
        Weights=Wil(idx));
    ei{j,:} = IncrementalMdl.Metrics{"EpsilonInsensitiveLoss",:};
end

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

パフォーマンス メトリクスのトレース プロットをプロットします。

plot(ei.Variables)
xlim([0 nchunk])
ylabel("Epsilon Insensitive Loss")
legend(ei.Properties.VariableNames)
xlabel("Iteration")

Figure contains an axes object. The axes object with xlabel Iteration, ylabel Epsilon Insensitive Loss contains 2 objects of type line. These objects represent Cumulative, Window.

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

入力引数

すべて折りたたむ

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

Mdl.IsWarm が false の場合、updateMetricsAndFit はモデルのパフォーマンスを追跡しません。詳細については、パフォーマンス メトリクスを参照してください。

予測子データのチャンク。n 個の観測値と Mdl.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。

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

メモ

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

  • updateMetricsAndFit は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。

データ型: single | double

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

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

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

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

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

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

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

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

観測値の重みのチャンク。正の値の浮動小数点ベクトルとして指定します。updateMetricsAndFit は、weights 内の対応する値を使用して X 内の観測値に重みを付けます。weights のサイズは X 内の観測値の数 n と同じでなければなりません。

既定では weights は ones(n,1) です。

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

データ型: double | single

メモ

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

  • チャンク サイズ n と確率的勾配降下 (SGD) ハイパーパラメーター ミニバッチ サイズ (Mdl.SolverOptions.BatchSize) は異なる値とすることができ、n はミニバッチ サイズの倍数でなくてもかまいません。updateMetricsAndFit は SGD の適用時に各学習サイクルで BatchSize 個の観測値を使用します。最後の学習サイクルに使用する最後のミニバッチに含まれる観測値の数は、Mdl.SolverOptions.BatchSize 以下でもかまいません。

出力引数

すべて折りたたむ

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

updateMetricsAndFit を呼び出すと、次の条件が適用されます。

  • モデルがウォームでない場合、updateMetricsAndFit はパフォーマンス メトリクスを計算しません。その結果、Mdl の Metrics プロパティは、NaN 値で構成された状態を完全に維持します。詳細については、パフォーマンス メトリクスを参照してください。

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

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

アルゴリズム

すべて折りたたむ

参照

[1] Bifet, Albert, Ricard Gavaldá, Geoffrey Holmes, and Bernhard Pfahringer. Machine Learning for Data Streams with Practical Example in MOA. Cambridge, MA: The MIT Press, 2007.

拡張機能

すべて展開する

バージョン履歴

R2022a で導入

すべて展開する