Main Content

updateMetricsAndFit

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

R2022a 以降

    説明

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

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

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

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

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

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

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

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

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

    すべて折りたたむ

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

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

    Mdl = incrementalClassificationKernel()
    Mdl = 
      incrementalClassificationKernel
    
                        IsWarm: 0
                       Metrics: [1x2 table]
                    ClassNames: [1x0 double]
                ScoreTransform: 'none'
        NumExpansionDimensions: 0
                   KernelScale: 1
    
    
    

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

    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);

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

    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
    
    
    

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

    学習済みモデルの変換

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

    IncrementalMdl = incrementalLearner(TTMdl)
    IncrementalMdl = 
      incrementalRegressionKernel
    
                        IsWarm: 1
                       Metrics: [1x2 table]
             ResponseTransform: 'none'
        NumExpansionDimensions: 2048
                   KernelScale: 1
    
    
    

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

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

    関数 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.IsWarmfalse の場合、updateMetricsAndFit はモデルのパフォーマンスを追跡しません。詳細については、パフォーマンス メトリクスを参照してください。

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

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

    メモ

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

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

    データ型: single | double

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

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

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

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

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

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

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

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

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

    既定では weightsones(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 はパフォーマンス メトリクスを計算しません。その結果、MdlMetrics プロパティは、NaN 値で構成された状態を完全に維持します。詳細については、パフォーマンス メトリクスを参照してください。

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

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

    アルゴリズム

    すべて折りたたむ

    パフォーマンス メトリクス

    • updateMetrics および updateMetricsAndFit は、インクリメンタル モデルが "ウォーム" (IsWarm プロパティが true) のときにのみ、新しいデータから Mdl.Metrics の table の行ラベルで指定されたモデルのパフォーマンス メトリクスを追跡します。インクリメンタル モデルは、fit または updateMetricsAndFit がインクリメンタル モデルを Mdl.MetricsWarmupPeriod 個の観測値 ("メトリクスのウォームアップ期間") に当てはめた後にウォームになります。

      Mdl.EstimationPeriod > 0 の場合、関数 fit および updateMetricsAndFit はモデルをデータに当てはめる前にハイパーパラメーターを推定します。そのため、関数は、モデルがメトリクスのウォームアップ期間を開始する前に EstimationPeriod 個の観測値を追加で処理しなければなりません。

    • Mdl.Metrics プロパティは、各パフォーマンス メトリクスの 2 つの形式を table の変数 (列) Cumulative および Window とし、個々のメトリクスを行に格納します。インクリメンタル モデルがウォームになると、updateMetrics および updateMetricsAndFit は次の頻度でメトリクスを更新します。

      • Cumulative — 関数は、モデルの性能追跡の開始以降の累積メトリクスを計算します。関数は、関数が呼び出されるたびにメトリクスを更新し、提供されたデータ セット全体に基づいて計算を行います。

      • Window — 関数は、Mdl.MetricsWindowSize プロパティによって決定されたウィンドウ内のすべての観測値に基づいてメトリクスを計算します。Mdl.MetricsWindowSize によってソフトウェアが Window メトリクスを更新する頻度も決まります。たとえば、Mdl.MetricsWindowSize が 20 の場合、関数は提供されたデータの最後の 20 個の観測値に基づいてメトリクスを計算します (X((end – 20 + 1):end,:) および Y((end – 20 + 1):end))。

        ウィンドウ内のパフォーマンス メトリクスを追跡するインクリメンタル関数は、次のプロセスを使用します。

        1. 指定された各メトリクスについて長さ Mdl.MetricsWindowSize のバッファーを保存し、観測値の重みのバッファーを保存します。

        2. 入力観測値のバッチに基づくモデル性能をメトリクス バッファーの要素に入力し、対応する観測値の重みを重みバッファーに格納します。

        3. バッファーがいっぱいになると、Mdl.Metrics.Window をメトリクス ウィンドウの性能の加重平均で上書きします。関数が観測値のバッチを処理するときにバッファーがあふれる場合、最新の入力観測値 Mdl.MetricsWindowSize がバッファーに入り、最も古い観測値がバッファーから削除されます。たとえば、Mdl.MetricsWindowSize が 20 で、メトリクス バッファーには前に処理されたバッチからの 10 個の値が存在し、15 個の値が入力されるとします。長さ 20 のウィンドウを構成するため、関数は 15 個の入力観測値からの測定値と前のバッチからの最新の 5 個の測定値を使用します。

    • CumulativeWindow のパフォーマンス メトリクスの値を計算する際、予測 (分類の場合はスコア、回帰の場合は応答) が NaN の観測値は省略されます。

    観測値の重み

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

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

    参照

    [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 で導入