メインコンテンツ

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

fit

インクリメンタル学習用のドリフト認識学習器の新しいデータでの学習

R2022b 以降

    説明

    Mdl = fit(Mdl,X,Y) は、インクリメンタル ドリフト認識学習モデル Mdl を返します。これは、予測子 X と応答データ Y を使用して学習させた入力インクリメンタル ドリフト認識学習モデル Mdl を表します。

    fit では Mdl.Metrics は更新されません。

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

    すべて折りたたむ

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

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

    データ セットの詳細については、コマンド ラインで Description を入力してください。

    予測子変数と応答変数を定義します。

    X = feat(idx,:);
    Y = actid(idx);

    応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。

    被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

    Y = Y > 2;

    データセットの後半部分のラベルを反転してドリフトをシミュレートします。

    Y(floor(numel(Y)/2):end,:) = ~Y(floor(numel(Y)/2):end,:);

    分類用の既定のインクリメンタル ドリフト認識モデルを次のように開始します。

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

    2. インクリメンタル線形 SVM モデルをベース学習器として使用して、既定のインクリメンタル ドリフト認識モデルを開始します。学習期間を観測値 5000 個に指定します。

    baseMdl = incrementalClassificationLinear(EstimationPeriod=5000,Solver="sgd");
    idaMdl = incrementalDriftAwareLearner(baseMdl,TrainingPeriod=5000);

    idaMdlincrementalDriftAwareLearner モデルです。そのプロパティはすべて読み取り専用です。既定では、incrementalDriftAwareLearner は移動平均に基づく Hoeffding 境界のドリフト検出法 ("hddma") を使用します。

    idaMdl は、他の演算の実行に使用する前に、データに当てはめなければなりません。

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

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

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

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

    % Preallocation
    numObsPerChunk = 50;
    nchunk = floor(n/numObsPerChunk);
    beta1 = zeros(nchunk,1);    
    numtrainobs = zeros(nchunk,1);
    dstatus = zeros(nchunk,1);
    statusname = strings(nchunk,1);
    driftTimes = [];
    ce = array2table(zeros(nchunk,2),VariableNames=["Cumulative" "Window"]);
    
    % Incremental fitting
    for j = 1:nchunk
        ibegin = min(n,numObsPerChunk*(j-1) + 1);
        iend   = min(n,numObsPerChunk*j);
        idx = ibegin:iend;    
    
        idaMdl = fit(idaMdl,X(idx,:),Y(idx));
        idaMdl = updateMetrics(idaMdl,X(idx,:),Y(idx));
        beta1(j) = idaMdl.BaseLearner.Beta(1);
        
        % Record drift status and classification error
        statusname(j) = string(idaMdl.DriftStatus); 
        ce{j,:} = idaMdl.Metrics{"ClassificationError",:};
        numtrainobs(j) = idaMdl.NumTrainingObservations; 
    
        if idaMdl.DriftDetected
           dstatus(j) = 2;  
           driftTimes(end+1) = j; 
        elseif idaMdl.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
     
    end

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

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

    tiledlayout(2,1)
    set(groot,DefaultConstantLineLineWidth=1.5);
    nexttile
    plot(beta1)
    ylabel("\beta_1")
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"r-.","EstimationPeriod")
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk + driftTimes,"r-.")
    xlabel('Iteration')
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ...
        "b-.",{"Estimation +","Training Period"},LabelVerticalAlignment="middle")
    xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift", ...
        LabelVerticalAlignment="middle")
    
    nexttile
    plot(numtrainobs)
    ylabel("Number of Training Observations")
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"r-.","EstimationPeriod")
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk + driftTimes,"r-.")
    xlabel("Iteration")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ...
        "b-.",{"Estimation +","Training Period"},LabelVerticalAlignment="middle")
    xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift", ...
        LabelVerticalAlignment="middle")

    Figure contains 2 axes objects. Axes object 1 with xlabel Iteration, ylabel \beta_1 contains 5 objects of type line, constantline. Axes object 2 with xlabel Iteration, ylabel Number of Training Observations contains 5 objects of type line, constantline.

    プロットは、推定期間が経過するまでは、fit がモデルをデータに当てはめることも、パラメーターを更新することもないということを示します。ドリフトが検出された後、関数は別の Mdl.BaseLearner.EstimationPeriod 個の観測値を待ってから新しいモデルをデータに当てはめます。

    累積とウィンドウごとの分類誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。

    figure()
    h = plot(ce.Variables);
    
    xlim([0 nchunk])
    ylabel("Classification Error")
    xlabel("Iteration")
    
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk, ...
        "g-.","Estimation + Warmup Period")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+ ...
        driftTimes,"g-.","Estimation + Warmup Period")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk, ...
        "b-.","Estimation + Training Period",LabelVerticalAlignment="middle")
    xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle")
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="north")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Classification Error contains 6 objects of type line, constantline. These objects represent Cumulative, Window.

    ドリフト ステータスと反復回数の関係をプロットします。

    gscatter(1:nchunk,dstatus,statusname,"gbr","o",5,"on","Iteration","Drift Status","filled")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Drift Status contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Stable, Drift.

    データの後半部分のラベルを予測し、ドリフト後の更新されたモデルの精度をチェックします。

    n = floor(numel(Y)/2);
    yhat = predict(idaMdl,X(n:end,:));
    accuracy = sum(Y(n:end)==yhat)/n
    accuracy = 
    0.9960
    

    robotarm データ セットを読み込みます。標本サイズ n と予測子変数の数 p を取得します。

    load robotarm
    n = numel(ytrain);
    p = size(Xtrain,2);

    データ セットの詳細については、コマンド ラインで Description を入力してください。

    観測値 2500 と 5000 の間の応答変数に人為的なドリフトを導入します。

    Y=ytrain;
    j=1.25;
    for i=2500:1250:5000
        idx=min(i+1250,5000);
        Y(i:idx)=ytrain(i:idx)*j;
        j=j+0.25;
    end

    回帰用のインクリメンタル ドリフト認識モデルを次のように開始します。

    1. 回帰用のインクリメンタル線形 SVM モデルを作成します。推定期間を 500 個の観測値に指定し、SGD ソルバーを指定します。

    2. 連続データ用のインクリメンタルなドリフト検出器を作成します。

    3. インクリメンタル線形 SVM モデルをベース学習器として使用し、作成したドリフト検出器を使用して、インクリメンタル ドリフト認識モデルを開始します。学習期間は 2000 と指定します。

    baseMdl = incrementalRegressionLinear(EstimationPeriod=500,Solver="sgd",MetricsWarmUpPeriod=750);
    ddetector = incrementalConceptDriftDetector("hddma",InputType="continuous",Alternative="greater");
    idaMdl = incrementalDriftAwareLearner(baseMdl,DriftDetector=ddetector,TrainingPeriod=2000);

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

    データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。

    numObsPerChunk = 10;
    nchunk = floor(n/numObsPerChunk);

    ドリフト ステータスとドリフト時間を追跡する変数、および回帰誤差と学習観測値の数を格納する変数を事前に割り当てます。

    dstatus = zeros(nchunk,1);
    statusname = strings(nchunk,1);
    driftTimes = [];
    
    ei = array2table(nan(nchunk,2),VariableNames=["Cumulative","Window"]);
    numtrainobs = zeros(nchunk,1);

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

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

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

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

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

    rng(123) % For reproducibility
    for j = 1:nchunk
    
        ibegin = min(n,numObsPerChunk*(j-1) + 1);
        iend   = min(n,numObsPerChunk*j);
        idx = ibegin:iend;
    
        idaMdl = updateMetrics(idaMdl,Xtrain(idx,:),Y(idx),ObservationsIn="rows");
        ei{j,:} = idaMdl.Metrics{"EpsilonInsensitiveLoss",:};
    
        idaMdl = fit(idaMdl,Xtrain(idx,:),Y(idx),ObservationsIn="rows");
        numtrainobs(j) = idaMdl.NumTrainingObservations;
    
        statusname(j) = string(idaMdl.DriftStatus);
        if idaMdl.DriftDetected
           dstatus(j) = 2;
           driftTimes(end+1) = j;
        elseif idaMdl.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
       
    end

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

    学習観測値の数とパフォーマンス メトリクスのトレース プロットをプロットします。推定期間、ウォームアップ メトリクス期間、および学習期間の時点をマークします。

    t = tiledlayout(2,1);
    nexttile
    plot(numtrainobs)
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"g-.","Estimation Period")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk,"m-.","Warmup Period")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk,"b--","Training Period")
    
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk+driftTimes,"g-.")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+driftTimes,"m-.")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk+driftTimes,"b--")
    xline(driftTimes,"r","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    xlim([0 nchunk])
    ylabel("Number of Training Observations")
    
    nexttile
    plot(ei.Variables)
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk,"g-.","Estimation Period")
    xline((idaMdl.MetricsWarmupPeriod+idaMdl.BaseLearner.EstimationPeriod)/numObsPerChunk,"m-.","Warmup Period")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk,"b--","Training Period")
    
    xline(idaMdl.BaseLearner.EstimationPeriod/numObsPerChunk+driftTimes,"g-.")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk+driftTimes,"m-.")
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.TrainingPeriod)/numObsPerChunk+driftTimes,"b--")
    xline(driftTimes,"r","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    xlim([0 nchunk])
    legend(ei.Properties.VariableNames,Location="northeast")
    ylabel("Regression Error")
    xlabel(t,"Iteration")

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

    ドリフト ステータスと反復回数の関係をプロットします。

    figure()
    gscatter(1:nchunk,dstatus,statusname,'gmr','*',5,'on',"Iteration","Drift Status")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Drift Status contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Stable, Warning, Drift.

    入力引数

    すべて折りたたむ

    ストリーミング データに当てはめるインクリメンタル ドリフト認識学習モデル。incrementalDriftAwareLearner モデル オブジェクトとして指定します。Mdl は関数 incrementalDriftAwareLearner を使用して作成できます。詳細については、オブジェクトのリファレンス ページを参照してください。

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

    Mdl.BaseLearner が名前と値の引数 ObservationsIn を受け入れる場合、ObservationsIn の値で変数と観測値の方向が決まります。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。

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

    メモ

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

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

    データ型: single | double

    モデルを当てはめる応答 (またはラベル) のチャンク。次のいずれかとして指定します。

    • 回帰モデルの場合、n 要素の浮動小数点ベクトル。ここで、nX の行数です。

    • 分類モデルの場合、categorical 配列、文字配列、string 配列、logical ベクトル、または文字ベクトルの cell 配列。Y が文字配列の場合、各行に 1 つのクラス ラベルを含めなければなりません。それ以外の場合、Yn 要素のベクトルでなければなりません。

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

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

    • Mdl.BaseLearner.ClassNames が空以外の場合は、次の条件が適用されます。

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

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

    • Mdl.BaseLearner.ClassNames が空の場合は、fit がデータから Mdl.BaseLearner.ClassNames を推定します。

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

    名前と値の引数

    すべて折りたたむ

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

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

    予測子データにおける観測値の次元。"columns" または "rows" として指定します。

    fit は、Mdl.BaseLearner が名前と値の引数 ObservationsIn をサポートする場合にのみ ObservationsIn をサポートします。

    例: ObservationsIn="columns"

    データ型: char | string

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

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

    例: Weights=w

    データ型: double | single

    出力引数

    すべて折りたたむ

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

    Mdl.BaseLearner.EstimationPeriod > 0 の場合、インクリメンタル近似関数 updateMetricsAndFit および fit は、どちらかの関数に渡された最初の Mdl.BaseLearner.EstimationPeriod 観測値を使用してハイパーパラメーターを推定します。これらの関数がそのデータへの入力モデルの学習を行うことはありません。ただし、n 個の観測値の入力チャンクが推定期間 m で残された観測値の数以上である場合、fit は最初の nm 個の観測値を使用してハイパーパラメーターを推定し、残りの m 個の観測値に入力モデルを当てはめます。

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

    アルゴリズム

    すべて折りたたむ

    参照

    [1] Barros, Roberto S.M. , et al. "RDDM: Reactive drift detection method." Expert Systems with Applications. vol. 90, Dec. 2017, pp. 344-55. https://doi.org/10.1016/j.eswa.2017.08.023.

    [2] Bifet, Albert, et al. "New Ensemble Methods for Evolving Data Streams." Proceedings of the 15th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM Press, 2009, p. 139. https://doi.org/10.1145/1557019.1557041.

    [3] Gama, João, et al. "Learning with drift detection". Advances in Artificial Intelligence – SBIA 2004, edited by Ana L. C. Bazzan and Sofiane Labidi, vol. 3171, Springer Berlin Heidelberg, 2004, pp. 286–95. https://doi.org/10.1007/978-3-540-28645-5_29.

    バージョン履歴

    R2022b で導入