Main Content

fit

インクリメンタル学習用のカーネル モデルの学習

R2022a 以降

    説明

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

    カーネル回帰モデルまたはカーネル分類モデルを一度にデータのバッチ全体に当てはめるか交差検証するには、fitrkernel または fitckernel をそれぞれ参照してください。

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

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

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

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

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

    すべて折りたたむ

    関数 incrementalClassificationKernel を呼び出すときに incrementalClassificationKernel モデル オブジェクトのインクリメンタル学習オプションを構成します。入力観測値にモデルを当てはめます。

    バイナリ分類用のインクリメンタル カーネル モデルを作成します。推定期間を 5000 個の観測値に指定し、確率的勾配降下 (SGD) ソルバーを指定します。

    Mdl = incrementalClassificationKernel(EstimationPeriod=5000,Solver="sgd")
    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;

    関数 fit を使用してインクリメンタル モデルを学習データに当てはめます。50 個の観測値で構成されるチャンクを一度に当てはめます。各反復で次を行います。

    • 50 個の観測値を処理して、データ ストリームをシミュレート。

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

    • 学習観測値の数、および被験者が移動した (Y = true) かどうかの事前確率を保存して、インクリメンタル学習中にそれらがどのように進化するかを確認。

    % Preallocation
    numObsPerChunk = 50;
    nchunk = floor(n/numObsPerChunk);  
    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));
        numtrainobs(j) = Mdl.NumTrainingObservations; 
        priormoved(j) = Mdl.Prior(Mdl.ClassNames == true);
    end

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

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

    t = tiledlayout(2,1);
    nexttile
    plot(numtrainobs)
    xlim([0 nchunk])
    ylabel("Number of Training Observations")
    xline(Mdl.EstimationPeriod/numObsPerChunk,"-.")
    nexttile
    plot(priormoved)
    xlim([0 nchunk])
    ylabel("\pi(Subject Is Moving)")
    xline(Mdl.EstimationPeriod/numObsPerChunk,"-.")
    xlabel(t,"Iteration")

    Figure contains 2 axes objects. Axes object 1 with ylabel Number of Training Observations contains 2 objects of type line, constantline. Axes object 2 with ylabel \pi(Subject Is Moving) contains 2 objects of type line, constantline.

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

    fitckernel を使用してバイナリ分類用のカーネル モデルに学習させ、incrementalLearner を使用してインクリメンタル学習器に変換します。モデルの性能を追跡し、モデルをストリーミング データに当てはめます。fitckernel およびインクリメンタル学習関数を呼び出すときに観測値の重みを指定します。

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

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

    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 = fitckernel(X(idxtt,:),Y(idxtt),Weights=W(idxtt))
    TTMdl = 
      ClassificationKernel
                  ResponseName: 'Y'
                    ClassNames: [0 1]
                       Learner: 'svm'
        NumExpansionDimensions: 2048
                   KernelScale: 1
                        Lambda: 8.2967e-05
                 BoxConstraint: 1
    
    
    

    TTMdl は、バイナリ分類用の従来式の学習済みカーネル モデルを表す ClassificationKernel モデル オブジェクトです。

    学習済みモデルの変換

    従来式の学習済み分類モデルをインクリメンタル学習用のモデルに変換します。

    IncrementalMdl = incrementalLearner(TTMdl)
    IncrementalMdl = 
      incrementalClassificationKernel
    
                        IsWarm: 1
                       Metrics: [1x2 table]
                    ClassNames: [0 1]
                ScoreTransform: 'none'
        NumExpansionDimensions: 2048
                   KernelScale: 1
    
    
    

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

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

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

    1. 50 個の観測値を一度に処理して、データ ストリームをシミュレートします。

    2. updateMetrics を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。関数がモデルをデータ チャンクに当てはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の重みを指定します。

    3. fit を呼び出して、観測値の入力チャンクにモデルを当てはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の重みを指定します。

    4. 分類誤差と学習観測値の数を保存します。

    % Preallocation
    idxil = ~idxtt;
    nil = sum(idxil);
    numObsPerChunk = 50;
    nchunk = floor(nil/numObsPerChunk);
    ce = array2table(zeros(nchunk,2),VariableNames=["Cumulative","Window"]);
    numtrainobs = [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), ...
            Weights=Wil(idx));
        ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
        IncrementalMdl = fit(IncrementalMdl,Xil(idx,:),Yil(idx), ...
            Weights=Wil(idx));
        numtrainobs(j) = IncrementalMdl.NumTrainingObservations;
    end

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

    あるいは、updateMetricsAndFit を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータに当てはめることもできます。

    学習観測値の数とパフォーマンス メトリクスのトレース プロットをプロットします。

    t = tiledlayout(2,1);
    nexttile
    plot(numtrainobs)
    xlim([0 nchunk])
    ylabel("Number of Training Observations")
    nexttile
    plot(ce.Variables)
    xlim([0 nchunk])
    legend(ce.Properties.VariableNames)
    ylabel("Classification Error")
    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 2 objects of type line. These objects represent Cumulative, Window.

    プロットは、関数 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 = [];

    この例の計算コストを削減するために、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}];

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

    Mdl = incrementalRegressionKernel(EstimationPeriod=0, ...
        MetricsWarmupPeriod=0,MetricsWindowSize=1000);
    initobs = 100;
    Mdl = fit(Mdl,X(1:initobs,:),Y(1:initobs));

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

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

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

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

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

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

    • イプシロン不感応損失と学習観測値の数を保存して、それらが学習中にどのように進化するかを確認します。

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

    % Preallocation
    numObsPerChunk = 100;
    nchunk = floor((n - initobs)/numObsPerChunk);
    ei = array2table(nan(nchunk,2),VariableNames=["Cumulative","Window"]);
    numtrainobs = zeros(nchunk,1);
    trained = false(nchunk,1);
    
    % Incremental fitting
    for j = 1:nchunk
        ibegin = min(n,numObsPerChunk*(j-1) + 1 + initobs);
        iend   = min(n,numObsPerChunk*j + initobs);
        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    
        numtrainobs(j) = Mdl.NumTrainingObservations;
    end

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

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

    t = tiledlayout(2,1);
    nexttile
    plot(numtrainobs)
    hold on
    plot(find(trained),numtrainobs(trained),"r.")
    xlim([0 nchunk])
    ylabel("Number of Training Observations")
    legend("Number of Training Observations","Training occurs",Location="best")
    hold off
    nexttile
    plot(ei.Variables)
    xlim([0 nchunk])
    ylabel("Epsilon Insensitive Loss")
    legend(ei.Properties.VariableNames)
    xlabel(t,"Iteration")

    Figure contains 2 axes objects. Axes object 1 with ylabel Number of Training Observations contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Number of Training Observations, Training occurs. Axes object 2 with ylabel Epsilon Insensitive Loss contains 2 objects of type line. These objects represent Cumulative, Window.

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

    入力引数

    すべて折りたたむ

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

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

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

    メモ

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

    • fit は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。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

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

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

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

    データ型: double | single

    メモ

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

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

    出力引数

    すべて折りたたむ

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

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

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

    ヒント

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

    アルゴリズム

    すべて折りたたむ

    観測値の重み

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

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

    バージョン履歴

    R2022a で導入