Main Content

incrementalDriftAwareLearner

インクリメンタル学習用のドリフト認識モデルを構築

R2022b 以降

    説明

    incrementalDriftAwareLearnerincrementalDriftAwareLearner モデル オブジェクトを作成します。これは、インクリメンタルな分類学習器または回帰学習器とインクリメンタルな概念ドリフト検出器が組み込まれたオブジェクトで、自己調整式のインクリメンタルな機械学習モデルを提供します。incrementalDriftAwareLearner は、インクリメンタル学習用のすべての分類モデルと回帰モデル、および Statistics and Machine Learning Toolbox™ でサポートされるすべての概念ドリフト検出法をサポートしています。

    Statistics and Machine Learning Toolbox のほとんどのモデル オブジェクトとは異なり、incrementalDriftAwareLearner は直接呼び出すことができます。incrementalDriftAwareLearner オブジェクトを作成すると、インクリメンタル ドリフト認識学習用に準備されます。

    incrementalDriftAwareLearner は、概念ドリフトに適応するインクリメンタル学習に最適です。バッチ ドリフト検出に対する従来のアプローチについては、detectdrift を参照してください。

    作成

    incrementalDriftAwareLearner モデル オブジェクトは次の方法で作成できます。

    • いずれかのインクリメンタル学習器を使用してインクリメンタルな分類学習器または回帰学習器を開始します。そのインクリメンタル学習モデルを incrementalDriftAwareLearner の呼び出しで入力として渡します。たとえば、以下のようにします。

      BaseLearner = incrementalClassificationLinear();
      Mdl = incrementalDriftAwareLearner(BaseLearner);

    • いずれかのインクリメンタル学習器を使用してインクリメンタルな分類学習器または回帰学習器を開始します。incrementalConceptDriftDetector を使用してインクリメンタルな概念ドリフト検出器を開始します。そのインクリメンタル学習モデルと概念ドリフト検出器の両方を incrementalDriftAwareLearner の呼び出しで入力として渡します。たとえば、以下のようにします。

      BaseLearner = incrementalRegressionKernel();
      DDM = incrementalConceptDriftDetector("ddm");
      Mdl = incrementalDriftAwareLearner(BaseLearner,DriftDetector=DDM);

    説明

    Mdl = incrementalDriftAwareLearner(BaseLearner) は、既定のモデル パラメーターと既定のドリフト検出器をもつインクリメンタル学習用のドリフト認識モデル Mdl を返します。

    Mdl = incrementalDriftAwareLearner(BaseLearner,Name=Value) は、名前と値の引数を使用して追加のオプションを設定します。たとえば、incrementalDriftAwareLearner(BaseLearner,DriftDetector=CDDetector,TrainingPeriod=1000) は、概念ドリフト検出器を事前定義された CDDetector と指定し、学習期間を 1000 個の観測値に設定します。

    入力引数

    すべて展開する

    基になるインクリメンタルな分類モデルまたは回帰モデル。次のいずれかとして指定します。

    これらの学習器の作成方法については、対応するリファレンス ページを参照してください。

    名前と値の引数

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

    例: BufferSize=5000,TrainingPeriod=8000,StableCountLimit=6000 は、バッファー サイズを 5000、学習期間を 8000、リセットするまでの連続する安定状態の観測値の上限を 6000 と指定します。

    各学習観測値についての BaseLearner の損失値を格納するバッファーのサイズ。スカラー整数として指定します。

    例: BufferSize=5000

    データ型: single | double

    ドリフトの監視と検出に使用するインクリメンタルな概念ドリフト検出器。HoeffdingDriftDetectionMethod オブジェクトまたは DriftDetectionMethod オブジェクトとして指定します。

    • BaseLearner がインクリメンタルな分類オブジェクトの場合、既定の検出器は移動平均法を使用する HoeffdingDriftDetectionMethod です。つまり、incrementalDriftAwareLearnerincrementalConceptDriftDetector("hddma") を使用してドリフト検出器を作成します。

    • BaseLearner がインクリメンタルな回帰オブジェクトの場合、既定では連続変数用の移動平均法を使用する HoeffdingDriftDetectionMethod です。つまり、incrementalDriftAwareLearnerincrementalConceptDriftDetector("hddma",InputType="continuous") を使用してドリフト検出器を作成します。

    別の方法を使用するインクリメンタルな概念ドリフト検出器を指定するには、incrementalConceptDriftDetector のリファレンス ページを参照してください。

    例: DriftDetector=dd

    学習に使用された観測値の数。スカラー整数として指定します。

    TrainingPeriod の値を Inf と指定すると、常に入力データで学習が行われます。

    TrainingPeriod の値が BaseLearner.MetricsWarmupPeriod の値より小さい場合、incrementalDriftAwareLearnerTrainingPeriod の値を BaseLearner.MetricsWarmupPeriod として設定します。

    例: TrainingPeriod=7000

    データ型: single | double

    ソフト リセットするまでの連続する 'Stable' の観測値の最大数。スカラー整数として指定します。

    例: StableCountLimit=35000

    データ型: single | double

    リセットするまでの連続する 'Warning' の観測値の最大数。スカラー整数として指定します。

    例: WarningCountLimit=1000

    データ型: single | double

    プロパティ

    すべて展開する

    この プロパティ は読み取り専用です。

    基になるインクリメンタルな分類モデルまたは回帰モデル。次のモデル オブジェクトのいずれかとして指定します。

    このプロパティは、入力引数 BaseLearner で設定されます。

    BaseLearner のプロパティにアクセスするには、たとえば Mdl.BaseLearner.Solver のようにドット表記を使用します。

    この プロパティ は読み取り専用です。

    基になるインクリメンタルな概念ドリフト検出器。HoeffdingDriftDetectionMethod オブジェクトまたは DriftDetectionMethod オブジェクトのいずれかとして指定します。

    このプロパティは、名前と値の引数 DriftDetector で設定されます。

    DriftDetector のプロパティにアクセスするには、たとえば Mdl.DriftDetector.WarningThreshold のようにドット表記を使用します。

    この プロパティ は読み取り専用です。

    潜在的なドリフトの監視を開始するまでの学習に使用された観測値の数。スカラー整数として指定します。

    このプロパティは、名前と値の引数 TrainingPeriod で設定されます。

    データ型: double

    この プロパティ は読み取り専用です。

    ソフト リセットするまでの連続する 'Stable' の観測値の最大数。スカラー整数として指定します。

    このプロパティは、名前と値の引数 StableCountLimit で設定されます。

    データ型: double

    この プロパティ は読み取り専用です。

    最新のデータを学習する前の DriftDetector のステータス。'Stable''Warning'、または 'Drift' として指定します。

    データ型: char

    この プロパティ は読み取り専用です。

    最新のデータを学習した後の DriftDetector の現在のステータス。'Stable''Warning'、または 'Drift' として指定します。

    データ型: char

    この プロパティ は読み取り専用です。

    DriftStatus'Drift' であるかどうかを示すフラグ。logical 0 (false) または 1 (true) として指定します。

    データ型: logical

    この プロパティ は読み取り専用です。

    リセットするまでの連続する 'Warning' の観測値の最大数。スカラー整数として指定します。

    データ型: double

    この プロパティ は読み取り専用です。

    DriftStatus'Warning' であるかどうかを示すフラグ。logical 0 (false) または 1 (true) として指定します。

    データ型: logical

    この プロパティ は読み取り専用です。

    BaseLearner で入力データでの学習を続行するかどうかを示すフラグ。logical 0 (false) または 1 (true) として指定します。

    データ型: logical

    この プロパティ は読み取り専用です。

    インクリメンタル モデルがパフォーマンス メトリクスを追跡するかどうかを示すフラグ。logical 0 (false) または 1 (true) として指定します。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。

    インクリメンタル モデル Mdl は、インクリメンタル近似関数が (Mdl.BaseLearner.EstimationPeriod + MetricsWarmupPeriod) 個の観測値をインクリメンタル モデルに当てはめた後、"ウォーム" (IsWarmtrue となる) になります。

    説明
    true または 1インクリメンタル モデル Mdl がウォームです。この結果、updateMetrics および updateMetricsAndFitMdlMetrics プロパティのパフォーマンス メトリクスを追跡します。
    false または 0インクリメンタル モデル Mdl がウォームでありません。updateMetrics および updateMetricsAndFit はパフォーマンス メトリクスを追跡しません。

    データ型: logical

    この プロパティ は読み取り専用です。

    予測子変数の数。非負の数値スカラーとして指定します。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。予測子変数の数は BaseLearner の開始時に指定できます。

    データ型: double

    この プロパティ は読み取り専用です。

    インクリメンタル モデル Mdl に当てはめる観測値の数。非負の数値スカラーとして指定します。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。

    NumTrainingObservations は、Mdl および学習データを fit または updateMetricsAndFit に渡すときに増加します。

    メモ

    従来式の学習済みモデルを変換して Mdl.BaseLearner を作成する場合、incrementalDriftAwareLearner は、従来式の学習済みモデルに当てはめる観測値の数を NumTrainingObservations に追加しません。

    データ型: double

    この プロパティ は読み取り専用です。

    updateMetrics または updateMetricsAndFit によってインクリメンタル学習中に更新されたモデルのパフォーマンス メトリクス。m 行 2 列の table として指定します。ここで、m は、BaseLearner の開始時に名前と値の引数 Metrics で指定されたメトリクスの数です。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。

    Metrics の列には Cumulative および Window のラベルが付けられます。

    • Cumulative – 要素 j は、メトリクス j で測定される、モデルがウォーム (IsWarm1) になった時点からの、モデルの性能です。

    • Window – 要素 j は、メトリクス j で測定され、MetricsWindowSize プロパティで指定されたウィンドウ内のすべての観測値に対して評価される、モデルの性能です。ソフトウェアは MetricsWindowSize 個の観測値を処理した後、Window を更新します。

    行には、指定したメトリクスのラベルが付けられます。

    データ型: table

    この プロパティ は読み取り専用です。

    インクリメンタル モデルが Metrics プロパティのパフォーマンス メトリクスを追跡する前に当てはめなければならない観測値の数。非負の整数として指定します。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。メトリクスのウォームアップ期間は BaseLearner の開始時に指定できます。

    データ型: double

    この プロパティ は読み取り専用です。

    ウィンドウ パフォーマンス メトリクスの計算に使用する観測値の数。正の整数として指定します。

    incrementalDriftAwareLearner は、このプロパティを Mdl.BaseLearner から取得します。メトリクスのウィンドウ サイズは BaseLearner の開始時に指定できます。

    データ型: double

    オブジェクト関数

    fitインクリメンタル学習用のドリフト認識学習器の新しいデータでの学習
    lossインクリメンタル ドリフト認識学習器の回帰誤差または分類誤差
    perObservationLossインクリメンタル ドリフト認識学習器の観測値ごとの回帰誤差または分類誤差
    predictインクリメンタル ドリフト認識学習モデルからの新しい観測の応答予測
    resetインクリメンタル ドリフト認識学習器のリセット
    updateMetricsインクリメンタル ドリフト認識学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新
    updateMetricsAndFitインクリメンタル ドリフト認識学習モデルの新しいデータに基づくパフォーマンス メトリクスの更新とモデルの学習

    すべて折りたたむ

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

    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 モデルを作成します。

    2. インクリメンタル線形 SVM モデルを使用して、既定のインクリメンタル ドリフト認識モデルを開始します。

    incMdl = incrementalClassificationLinear();
    idaMdl = incrementalDriftAwareLearner(incMdl);

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

    データ ストリームの作成用に各チャンクの変数の数を事前に割り当てて、分類誤差を格納するための変数も割り当てます。

    numObsPerChunk = 50;
    nchunk = floor(n/numObsPerChunk);
    ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);

    ドリフト ステータスを追跡する変数を事前に割り当てます。

    status = zeros(nchunk,1);
    statusname = strings(nchunk,1);

    それぞれ 50 個の観測値の入力チャンクを使用して、データ ストリームをシミュレートします。各反復で次を行います。

    1. updateMetricsAndFit を呼び出して、パフォーマンス メトリクスを更新し、ドリフト認識モデルを入力データに当てはめます。前のインクリメンタル モデルを新しいモデルで上書きします。

    2. 累積と反復ごとの分類誤差を ce に格納します。idaMdlMetrics プロパティに累積とウィンドウの分類誤差が格納され、各反復で更新されます。

    for j = 1:nchunk
     ibegin = min(n,numObsPerChunk*(j-1)+1);
     iend   = min(n,numObsPerChunk*j);
     idx = ibegin:iend;    
    
     idaMdl = updateMetricsAndFit(idaMdl,X(idx,:),Y(idx));
    
     statusname(j) = string(idaMdl.DriftStatus);
     if idaMdl.DriftDetected
           status(j) = 2;  
        elseif idaMdl.WarningDetected
           status(j) = 1;
        else 
           status(j) = 0;
        end   
     ce{j,:} = idaMdl.Metrics{"ClassificationError",:};
    end

    関数 updateMetricsAndFit は、まず updateMetrics を呼び出して入力データでモデルの性能を評価し、次に fit を呼び出してモデルをデータに当てはめます。

    関数 updateMetrics は、入力観測値を処理しながらモデルの性能を評価します。指定したメトリクスについて、関数で処理された観測値の累積の測定値と指定したウィンドウにおける測定値が Metrics モデル プロパティに書き込まれます。

    関数 fit は、データの入力バッチに基づいてベース学習器を更新してドリフトを監視することでモデルを当てはめます。fit を呼び出すと、次の手順が実行されます。

    • 最大 NumTrainingObservations 個の観測値について、モデルの学習が行われます。

    • 学習が完了すると、モデル損失の追跡が開始されます。概念ドリフトが発生していないかどうかがチェックされ、ドリフト ステータスが適宜更新されます。

    • ドリフト ステータスが Warning の場合、差し迫ったドリフトに備えて、BaseLearner に置き換わる一時的なモデルの学習が行われます。

    • ドリフト ステータスが Drift の場合、BaseLearner が一時的なモデルに置き換えられます。

    • ドリフト ステータスが Stable の場合、一時的なモデルが破棄されます。

    詳細については、"アルゴリズム" のセクションを参照してください。

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

    h = plot(ce.Variables);
    
    xlim([0 nchunk])
    ylabel("Classification Error")
    xlabel("Iteration")
    
    xline(idaMdl.MetricsWarmupPeriod/numObsPerChunk,"g-.","Warmup Period",LineWidth= 1.5)
    xline(idaMdl.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth= 1.5)
    xline(floor(numel(Y)/2)/numObsPerChunk,"m--","Drift",LabelVerticalAlignment="middle",LineWidth= 1.5)
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="best")

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

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

    figure()
    gscatter(1:nchunk,status,statusname,'gmr','*ox',[4 5 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.

    補助関数の HelperSineGeneratorHelperConceptDriftGenerator をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。

    concept1 = HelperSineGenerator(ClassificationFunction=1,IrrelevantFeatures=true,TableOutput=false);
    concept2 = HelperSineGenerator(ClassificationFunction=3,IrrelevantFeatures=true,TableOutput=false);
    driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);

    ClassificationFunction が 1 の場合、HelperSineGenerator"x1" < "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます。ClassificationFunction が 3 の場合はその逆になります。つまり、HelperSineGenerator は、"x1" >= "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます [2]。そのデータがインクリメンタル学習器で使用するために行列として返されます。

    HelperConceptDriftGenerator は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width)) を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [3]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。

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

    1. バイナリ分類用のインクリメンタル単純ベイズ分類モデルを作成します。

    2. 移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。

    3. インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルを開始します。学習期間を 5000 個の観測値として指定します。

    BaseLearner = incrementalClassificationNaiveBayes(MaxNumClasses=2,Metrics="classiferror");
    dd = incrementalConceptDriftDetector("hddma");
    idal = incrementalDriftAwareLearner(BaseLearner,DriftDetector=dd,TrainingPeriod=5000);

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

    numObsPerChunk = 10;
    numIterations = 4000;

    ドリフト ステータスとドリフト時間を追跡する変数、および分類誤差を格納する変数を事前に割り当てます。

    dstatus = zeros(numIterations,1);
    statusname = strings(numIterations,1);
    driftTimes = [];
    ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);

    それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。

    1. 予測子データとラベルをシミュレートし、補助関数 hgenerate を使用して driftGenerator を更新します。

    2. updateMetricsAndFit を呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。

    3. 可視化のためにドリフト ステータスと分類誤差を追跡して記録します。

    rng(12); % For reproducibility
    
    for j = 1:numIterations
     
     % Generate data
     [driftGenerator,X,Y] = hgenerate(driftGenerator,numObsPerChunk); 
    
     % Update performance metrics and fit
     idal = updateMetricsAndFit(idal,X,Y); 
    
     % Record drift status and classification error
     statusname(j) = string(idal.DriftStatus); 
     ce{j,:} = idal.Metrics{"ClassificationError",:};
     if idal.DriftDetected
           dstatus(j) = 2;  
        elseif idal.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
     if idal.DriftDetected
        driftTimes(end+1) = j; 
     end
     
    end

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

    h = plot(ce.Variables);
    
    xlim([0 numIterations])
    ylim([0 0.22])
    ylabel("Classification Error")
    xlabel("Iteration")
    
    xline(idal.MetricsWarmupPeriod/numObsPerChunk,"g-.","Warmup Period",LineWidth=1.5)
    xline(idal.MetricsWarmupPeriod/numObsPerChunk+driftTimes,"g-.","Warmup Period",LineWidth=1.5)
    xline(idal.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth=1.5)
    xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="best")

    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.

    関数 updateMetricsAndFit は、まず updateMetrics を呼び出して入力データでモデルの性能を評価し、次に fit を呼び出してモデルをデータに当てはめます。

    関数 updateMetrics は、入力観測値を処理しながらモデルの性能を評価します。指定したメトリクスについて、関数で処理された観測値の累積の測定値と指定したウィンドウにおける測定値が Metrics モデル プロパティに書き込まれます。

    関数 fit は、データの入力バッチに基づいてベース学習器を更新してドリフトを監視することでモデルを当てはめます。fit を呼び出すと、次の手順が実行されます。

    • 最大 NumTrainingObservations 個の観測値について、モデルの学習が行われます。

    • 学習が完了すると、モデル損失の追跡が開始されます。概念ドリフトが発生していないかどうかがチェックされ、ドリフト ステータスが適宜更新されます。

    • ドリフト ステータスが Warning の場合、差し迫ったドリフトに備えて、BaseLearner に置き換わる一時的なモデルの学習が行われます。

    • ドリフト ステータスが Drift の場合、BaseLearner が一時的なモデルに置き換えられます。

    • ドリフト ステータスが Stable の場合、一時的なモデルが破棄されます。

    詳細については、"アルゴリズム" のセクションを参照してください。

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

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

    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.

    補助関数の HelperRegrGeneratorHelperConceptDriftGenerator をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。

    concept1 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[1,20,40,50,55], ...
        FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false);
    concept2 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[10,20,45,56,80], ...
        FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false);
    driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);

    HelperRegrGenerator は、関数の呼び出しで指定された回帰用の特徴量と特徴量係数を使用してストリーミング データを生成します。この関数は、各ステップで正規分布から予測子を抽出します。その後、関数は特徴量係数と予測子の値を使用して、平均がゼロで指定のノイズ標準偏差をもつ正規分布からランダム ノイズを追加することで応答を計算します。そのデータがインクリメンタル学習器で使用するために行列として返されます。

    HelperConceptDriftGenerator は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width)) を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [3]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。

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

    1. 回帰用のインクリメンタル線形モデルを作成します。線形回帰モデルのタイプとソルバーのタイプを指定します。

    2. 移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。

    3. インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 6000 個の観測値として指定します。

    baseMdl = incrementalRegressionLinear(Learner="leastsquares",Solver="sgd",EstimationPeriod=1000,Standardize=false);
    dd = incrementalConceptDriftDetector("hddma",Alternative="greater",InputType="continuous",WarmupPeriod=1000);
    idal = incrementalDriftAwareLearner(baseMdl,DriftDetector=dd,TrainingPeriod=6000);

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

    numObsPerChunk = 10;
    numIterations = 4000;

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

    dstatus = zeros(numIterations,1);
    statusname = strings(numIterations,1);
    driftTimes = [];
    ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);

    それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。

    1. 予測子データとラベルをシミュレートし、補助関数 hgenerate を使用してドリフト発生器を更新します。

    2. updateMetricsAndFit を呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。

    3. 可視化のためにドリフト ステータスと回帰誤差を追跡して記録します。

    rng(12); % For reproducibility
    
    for j = 1:numIterations
     
     % Generate data
     [driftGenerator,X,Y] = hgenerate(driftGenerator,numObsPerChunk); 
    
     % Update performance metrics and fit
     idal = updateMetricsAndFit(idal,X,Y); 
    
     % Record drift status and regression error
     statusname(j) = string(idal.DriftStatus); 
     ce{j,:} = idal.Metrics{"MeanSquaredError",:};
     if idal.DriftDetected
           dstatus(j) = 2;  
        elseif idal.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
     if idal.DriftDetected
        driftTimes(end+1) = j; 
     end
    end

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

    h = plot(ce.Variables);
    
    xlim([0 numIterations])
    ylabel("Mean Squared Error")
    xlabel("Iteration")
    
    xline((idal.MetricsWarmupPeriod+idal.BaseLearner.EstimationPeriod)/numObsPerChunk,"g-.","Warmup Period",LineWidth=1.5)
    xline(idal.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth=1.5)
    xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="best")

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

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

    gscatter(1:numIterations,dstatus,statusname,'gmr','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.

    アルゴリズム

    すべて展開する

    参照

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