Main Content

incrementalConceptDriftDetector

インクリメンタルな概念ドリフト検出器のインスタンス化

R2022a 以降

    説明

    IncCDDetector = incrementalConceptDriftDetector() は、既定の手法である移動平均テストによる Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を返します。

    IncCDDetector = incrementalConceptDriftDetector(DetectionMethod) は、DetectionMethod の手法を使用するインクリメンタルな概念ドリフト検出器を返します。

    IncCDDetector = incrementalConceptDriftDetector(DetectionMethod,Name=Value) は、1 つ以上の Name=Value の引数を使用して追加のオプションを指定します。

    すべて折りたたむ

    ドリフト検出法 (DDM) を使用して概念ドリフト検出器を開始します。

    incCDDetector = incrementalConceptDriftDetector("ddm");

    最初の 1000 個の観測値は故障率が 0.1 で、1000 個の観測値をすぎると故障率が 0.6 に増加する乱数ストリームを作成します。

    rng(1234)  % For reproducibility
    numObservations = 3000;
    switchPeriod = 1000;
    
    for i = 1:numObservations
        if i <= switchPeriod
           failurerate = 0.1;
        else
           failurerate = 0.6;
        end
           X(i) = rand()<failurerate; % Value 1 represents failure
    end

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

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

    ドリフト検出器にデータを継続的に供給し、インクリメンタルなドリフト検出を実行します。各反復で次を行います。

    • ドリフト検出器の統計量を更新し、detectdrift で新しいデータ点を使用してドリフトを監視する。(メモ: detectdrift はウォームアップ期間後にドリフトをチェック)

    • 可視化のためにドリフト ステータスを追跡して記録する。

    • ドリフトが検出されたら、reset を使用してインクリメンタルな概念ドリフト検出器をリセットする。

    for i = 1:numObservations     
        
        incCDDetector = detectdrift(incCDDetector,X(i));
        statusname(i) = string(incCDDetector.DriftStatus);
              
        if incCDDetector.DriftDetected
           status(i) = 2;
           incCDDetector = reset(incCDDetector); % If drift detected, reset the detector
           sprintf("Drift detected at Observation #%d. Detector reset.",i)
        elseif incCDDetector.WarningDetected
           status(i) = 1;
        else 
           status(i) = 0;
        end   
    end
    ans = 
    "Drift detected at Observation #1078. Detector reset."
    

    観測番号 1000 で故障率が変わった後、detectdrift は観測番号 1078 でシフトを検出します。

    ドリフト ステータスと観測番号の関係をプロットします。

    gscatter(1:numObservations,status,statusname,'gyr','*',4,'on',"Observation number","Drift status")

    Figure contains an axes object. The axes object with xlabel Observation number, 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.

    標準偏差が 0.75 で、平均は時間と共に変化する正規分布から観測値が派生する乱数ストリームを作成します。最初の 1000 個の観測値は平均 2 の分布から派生し、次の 1000 個は平均 4 の分布から派生し、その後の 1000 個は平均 7 の分布から派生します。

    rng(1234) % For reproducibility
    numObservations = 3000;
    switchPeriod1 = 1000;
    switchPeriod2 = 2000;
    X = zeros([numObservations 1]);
    
    % Generate the data
    for i = 1:numObservations
       if i <= switchPeriod1
          X(i) = normrnd(2,0.75);
       elseif i <= switchPeriod2
          X(i) = normrnd(4,0.75);
       else
          X(i) = normrnd(7,0.75);
       end
    end

    インクリメンタルなドリフト検出の用途では、データ ストリームへのアクセスとモデルの更新が連続的に発生します。データを先に収集してからモデルに供給することはありません。ただし、この例では、明確にするためにデータのシミュレーションを分けて説明します。

    ドリフトのウォームアップ期間を 50 個の観測値に指定し、データ入力範囲の推定期間を 100 個に指定します。

    driftWarmupPeriod = 50;
    estimationPeriod = 100;

    インクリメンタルな概念ドリフト検出器を開始します。指数加重移動平均法 (EWMA) による Hoeffding 境界の手法を使用します。入力タイプとウォームアップ期間を指定します。

    incCDDetector = incrementalConceptDriftDetector("hddmw",InputType="continuous", ...
                    WarmupPeriod=driftWarmupPeriod,EstimationPeriod=estimationPeriod)
    incCDDetector = 
      HoeffdingDriftDetectionMethod
    
            PreviousDriftStatus: 'Stable'
                    DriftStatus: 'Stable'
                         IsWarm: 0
        NumTrainingObservations: 0
                    Alternative: 'greater'
                      InputType: 'continuous'
                     TestMethod: 'ewma'
    
    
      Properties, Methods
    
    

    incDDetector は、HoeffdingDriftDetectionMethod オブジェクトです。最初にオブジェクトを作成した時点では、DriftStatusIsWarmCutMeanNumTrainingObservations などのプロパティは初期状態になります。detectdrift は、それらをデータの供給に応じてインクリメンタルに更新し、ドリフトを監視します。

    バッチ サイズ、およびドリフト ステータスと平均 (データが入力されるたびにドリフト検出器で計算) を記録する変数を事前に割り当てます。

    status = zeros([numObservations 1]);
    statusname = strings([numObservations 1]);
    M = zeros([numObservations 1]);

    観測値を一度に 1 個ずつ処理してデータ ストリームをシミュレートし、インクリメンタルなドリフト検出を実行します。各反復で次を行います。

    • detectdrift で新しいデータを使用してドリフトを監視する。

    • 可視化のためにドリフト ステータスと統計量を追跡して記録する。

    • ドリフトが検出されたら、関数 reset を使用してインクリメンタルな概念ドリフト検出器をリセットする。

    for i = 1:numObservations
        
        incCDDetector = detectdrift(incCDDetector,X(i));
        
        M(i) = incCDDetector.Mean;
            
        if incCDDetector.DriftDetected
            status(i) = 2;
            statusname(i) = string(incCDDetector.DriftStatus);
            incCDDetector = reset(incCDDetector); % If drift detected, reset the detector
            sprintf("Drift detected at observation #%d. Detector reset.",i)
        elseif incCDDetector.WarningDetected
            status(i) = 1;
            statusname(i) = string(incCDDetector.DriftStatus);
            sprintf("Warning detected at observation #%d.",i)
        else 
            status(i) = 0;
            statusname(i) = string(incCDDetector.DriftStatus);
        end      
    end
    ans = 
    "Warning detected at observation #1024."
    
    ans = 
    "Warning detected at observation #1025."
    
    ans = 
    "Warning detected at observation #1026."
    
    ans = 
    "Warning detected at observation #1027."
    
    ans = 
    "Warning detected at observation #1028."
    
    ans = 
    "Warning detected at observation #1029."
    
    ans = 
    "Drift detected at observation #1030. Detector reset."
    
    ans = 
    "Warning detected at observation #2012."
    
    ans = 
    "Warning detected at observation #2013."
    
    ans = 
    "Warning detected at observation #2014."
    
    ans = 
    "Drift detected at observation #2015. Detector reset."
    

    ドリフト ステータスと観測番号の関係をプロットします。

    gscatter(1:numObservations,status,statusname,'gyr','*',5,'on',"Number of observations","Drift status")

    Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Stable, Warning, Drift.

    平均値と観測値の数の関係をプロットします。

    scatter(1:numObservations,M)

    Figure contains an axes object. The axes object contains an object of type scatter.

    このプロットから、標本平均が増加していることがわかります。平均値が大きくなり、最終的にソフトウェアによってデータのドリフトが検出されます。ドリフトが検出されたら、インクリメンタルなドリフト検出器をリセットします。これにより、平均値もリセットされます。プロットの標本平均がゼロである観測値は推定期間に対応します。推定期間は、最初に 1 回とドリフト検出後のドリフト検出器のリセットの後に 2 回あります。

    ドリフト検出法 (DDM) を使用して概念ドリフト検出器を開始します。

    incCDDetector = incrementalConceptDriftDetector("ddm",Alternative="less",WarmupPeriod=100);

    最初の 1000 個の観測値は故障率が 0.4 で、1000 個をすぎると故障率が 0.1 に減少する乱数ストリームを作成します。

    rng(1234)  % For reproducibility
    numObservations = 3000;
    switchPeriod = 1000;
    for i = 1:numObservations
        if i <= switchPeriod
           failurerate = 0.4;
        else
           failurerate = 0.125;
        end
           X(i) = rand()<failurerate; % Value 1 represents failure
    end

    ドリフト ステータスと最適な平均値および最適な標準偏差値を追跡する変数を事前に割り当てます。

    optmean = zeros(numObservations,1);
    optstddev = zeros(numObservations,1);
    status = zeros(numObservations,1);
    statusname = strings(numObservations,1);

    ドリフト検出器にデータを継続的に供給し、潜在的な変化を監視します。可視化のためにドリフト ステータスを記録します。

    for i = 1:numObservations     
        
        incCDDetector = detectdrift(incCDDetector,X(i)); 
    
        statusname(i) = string(incCDDetector.DriftStatus);
        optmean(i) = incCDDetector.OptimalMean;
        optstddev(i) = incCDDetector.OptimalStandardDeviation;
    
        if incCDDetector.DriftDetected
           status(i) = 2;
           incCDDetector = reset(incCDDetector); % If drift detected, reset the detector
           sprintf("Drift detected at Observation #%d. Detector reset.",i)
        elseif incCDDetector.WarningDetected
           status(i) = 1;
        else 
           status(i) = 0;
        end   
    end
    ans = 
    "Drift detected at Observation #1107. Detector reset."
    

    観測番号 1000 で故障率が変わった後、detectdrift は観測番号 1096 でシフトを検出します。

    最適な平均と最適な標準偏差の変化をプロットします。

    tiledlayout(2,1);
    ax1 = nexttile;
    plot(ax1,1:numObservations,optmean)
    ax2 = nexttile;
    plot(ax2,1:numObservations,optstddev)

    Figure contains 2 axes objects. Axes object 1 contains an object of type line. Axes object 2 contains an object of type line.

    ドリフト ステータスと観測番号の関係をプロットします。

    figure();
    gscatter(1:numObservations,status,statusname,'gyr','*',4,'on',"Observation number","Drift status")

    Figure contains an axes object. The axes object with xlabel Observation number, 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.

    detectdrift は、複数の観測値を警告ステータスと結論付けてからドリフトと判定しています。

    入力引数

    すべて折りたたむ

    インクリメンタルなドリフト検出法。次のいずれかとして指定します。

    検出法定義
    "ddm"ドリフト検出法 (DDM)
    "hddma"移動平均テストによる Hoeffding 境界のドリフト検出法 (HDDMA)
    "hddmw"指数加重移動平均 (EWMA) テストによる Hoeffding 境界のドリフト検出法 (HDDMW)

    名前と値の引数

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

    例: Alternative="less",InputType="continuous",InputBounds=[-1,1],ForgettingFactor=0.075 は、対立仮説を less (つまり左側)、入力データのタイプを連続データ、入力データの下限と上限を [-1,1]、HDDMW 法の忘却係数の値を 0.075 に指定します。

    一般オプション

    すべて折りたたむ

    ドリフト ステータスを判定する対立仮説のタイプ。"unequal""greater"、または "less" として指定します。2 つの検定統計量が F1(x) および F2(x) であるとすると、次のようになります。

    • "greater" は、正方向のドリフトの検定であり、F1(x)>F2(x) となります。

      この場合、帰無仮説は F1(x)F2(x) です。

    • "less" は、負方向のドリフトの検定であり、F1(x)<F2(x) となります。

      この場合、帰無仮説は F1(x)F2(x) です。

    • "unequal" は、双方向のドリフトの検定であり、F1(x)F2(x) となります。

      この場合、帰無仮説は F1(x)=F2(x) です。

      "unequal" は、HDDMA 法と HDDMW 法にのみ該当します。

    それぞれのタイプの検定において、detectdrift は統計量を更新し、WarningThreshold または DriftThreshold の有意水準で対立仮説を優先して帰無仮説を棄却できるかどうかをチェックします。WarningThreshold の有意水準で帰無仮説を棄却すると、DriftStatus'Warning' に更新します。DriftThreshold で帰無仮説を棄却すると、DriftStatus'Drift' に更新します。

    例: Alternative="less"

    ドリフト検出器への入力のタイプ。"binary" または "continuous" のいずれかとして指定します。

    例: InputType="continuous"

    ドリフト検出器のウォームアップに使用される観測値の数。非負の整数として指定します。ウォームアップ期間が終了するまで、detectdrift は入力データを使用してドリフト検出器に学習させ、内部の統計量を更新しますが、ドリフト ステータスはチェックしません。ウォームアップ期間に到達し、ドリフト検出器がウォームになると、ドリフト ステータスの変化のチェックが開始されます。

    例: WarmupPeriod=50

    データ型: double | single

    DDM のオプション

    すべて折りたたむ

    ドリフトになるまでの標準偏差の数の制限。非負のスカラー値として指定します。これは、全体の検定統計値が最適な検定統計値から離れていると見なし、ドリフト検出器がドリフト ステータスをドリフトとして設定するまでの許容される標準偏差の数です。既定値の 3 は 99.7% の信頼水準に相当します[1]

    DriftThreshold の値は WarningThreshold の値より厳密に大きくなければなりません。

    例: DriftThreshold=2.5

    データ型: double | single

    警告になるまでの標準偏差の数の制限。非負のスカラー値として指定します。これは、全体の検定統計値が最適な検定統計値から離れていると見なし、ドリフト検出器がドリフト ステータスを警告として設定するまでの許容される標準偏差の数です。既定値の 2 は 95% の信頼水準に相当します[1]

    WarningThreshold の値は DriftThreshold の値より厳密に小さくなければなりません。

    例: WarningThreshold=1.75

    データ型: double | single

    HDDMA と HDDMW のオプション

    すべて折りたたむ

    ドリフトが存在するかどうかを判定するしきい値。0 から 1 までの非負のスカラー値として指定します。これは、Hoeffding 不等式と McDiarmid 不等式で確率変数と期待値の間の許容誤差の計算に使用される有意水準です。この水準を超えると、ドリフト検出器はドリフト ステータスをドリフトとして設定します[2]

    DriftThreshold の値は WarningThreshold の値より厳密に小さくなければなりません。

    例: DriftThreshold=0.003

    データ型: double | single

    連続データの入力範囲の推定に使用する観測値の数。非負の整数として指定します。つまり、InputType"continuous" の場合、InputBounds の値を指定していないと、EstimationPeriod の観測値の数を使用して入力範囲が推定されます。推定期間の後にウォームアップ期間が始まります。

    InputBounds の値を指定している場合や InputType"binary" の場合、EstimationPeriod は無視されます。

    入力範囲の推定が必要な場合の既定値は 100 です。それ以外の場合の既定値は 0 です。

    例: EstimationPeriod=150

    データ型: double | single

    連続入力データの下限と上限。サイズ 2 の数値ベクトルとして指定します。

    InputType"continuous" の場合、InputBounds の値が指定されていないと、detectdrift は推定期間にデータから範囲を推定します。データ入力範囲の推定に使用する観測値の数は EstimationPeriod を使用して指定します。

    InputType"binary" の場合、ドリフト検出器は InputBounds の値を [0,1] に設定し、名前と値の引数 InputBounds は無視されます。

    HDDM では、ドリフト検出に Hoeffding 不等式と McDiarmid 不等式を使用します。これらの不等式では、制限付き入力が前提になります[2]

    例: InputBounds=[-1 1]

    データ型: double | single

    メモ

    このオプションは、指数加重移動平均 (EWMA) 法 (DetectionMethod の設定値が "hddmw" の場合に対応) にのみ該当します。

    HDDMW 法における忘却係数。0 から 1 までのスカラー値として指定します。忘却係数は、EWMA 統計量 X^t=λXt+(1λ)X^t1 における λ です[2]。忘却係数により、現在の平均の予測に過去の観測値がどの程度影響するかが決まります。ForgettingFactor の値が高いほど、現在の観測値の重みが増し、過去の観測値の影響が少なくなります。

    例: ForgettingFactor=0.075

    データ型: double | single

    警告かドリフトかを判別するしきい値。0 から 1 までの非負のスカラー値として指定します。これは、Hoeffding 不等式と McDiarmid 不等式で確率変数と期待値の間の許容誤差の計算に使用される有意水準です。この水準を超えると、ドリフト検出器はドリフト ステータスを警告として設定します[2]

    WarningThreshold の値は DriftThreshold の値より厳密に大きくなければなりません。

    例: WarningThreshold=0.007

    データ型: double | single

    出力引数

    すべて折りたたむ

    インクリメンタルな概念ドリフト検出器。DriftDetectionMethod または HoeffdingDriftDetectionMethod のいずれかのオブジェクトとして返されます。これらのオブジェクトとそのプロパティの詳細については、該当するリファレンス ページを参照してください。

    参照

    [1] Gama, Joao, Pedro Medas, Gladys Castillo, and Pedro P. Rodrigues. “Learning with drift detection.“ In Brazilian symposium on artificial intelligence, pp. 286-295. Berlin, Heidelberg: Springer. 2004, September.

    [2] Frias-Blanco, Isvani, Jose del Campo-Ávila, Ramos-Jimenez Gonzalo, Rafael Morales-Bueno, Augustin Ortiz-Diaz, and Yaile Caballero-Mota. “Online and non-parametric drift detection methods based on Hoeffding's bounds.“ IEEE Transactions on Knowledge and Data Engineering, Vol. 27, No. 3, pp.810-823. 2014.

    バージョン履歴

    R2022a で導入