Main Content

HoeffdingDriftDetectionMethod

Hoeffding 境界のドリフト検出法 (HDDM) を使用するインクリメンタルな概念ドリフト検出器

R2022a 以降

    説明

    HoeffdingDriftDetectionMethod モデル オブジェクトは、移動平均 (A 検定) または指数加重移動平均 (W 検定) に基づく Hoeffding 境界のノンパラメトリックなドリフト検出法を使用するインクリメンタルな概念ドリフト検出器を表します[1]。オブジェクトの作成後、オブジェクト関数 detectdrift を使用して、統計の更新や概念データのドリフト (故障率や回帰損失など) のチェックを行うことができます。

    HoeffdingDriftDetectionMethod はインクリメンタルな概念ドリフト検出に適しています。生データにおけるドリフト検出については、バッチ ドリフト検出用の detectdrift を参照してください。

    作成

    HoeffdingDriftDetectionMethod は、incrementalConceptDriftDetector の呼び出しで引数 DetectionMethod"hddma" または "hddmw" として指定することで作成できます。

    プロパティ

    すべて展開する

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

    ドリフト ステータスを判定する対立仮説のタイプ。'greater''less'、または 'unequal' として指定されます。

    データ型: char

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

    切り取り点までに観測された入力データの Hoeffding 境界。数値として指定されます。

    detectdrift は、次のいずれかの条件を満たす場合に、CutMeanCutHoeffdingBound を更新し、PostCutMeanPostCutHoeffdingBound をリセットします。

    • Alternative"greater" で、Mean + HoeffdingBoundCutMean + CutHoeffdingBound 以下。

    • Alternative"less" で、Mean - HoeffdingBoundCutMean - CutHoeffdingBound 以上。

    • Alternative"unequal" で、Mean + HoeffdingBoundCutMean - CutHoeffdingBound 以下または Mean - HoeffdingBoundCutMean + CutHoeffdingBound 以上。

    データ型: double

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

    切り取り点までに観測されたデータの加重平均。数値として指定されます。

    detectdrift は、次のいずれかの条件を満たす場合に、CutMeanCutHoeffdingBound を更新し、PostCutMeanPostCutHoeffdingBound をリセットします。

    • Alternative"greater" で、Mean + HoeffdingBoundCutMean + CutHoeffdingBound 以下。

    • Alternative"less" で、Mean - HoeffdingBoundCutMean - CutHoeffdingBound 以上。

    • Alternative"unequal" で、Mean + HoeffdingBoundCutMean - CutHoeffdingBound 以下または Mean - HoeffdingBoundCutMean + CutHoeffdingBound 以上。

    データ型: double

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

    ソフトウェアでドリフトが検出されたかどうかを示すフラグ。1 または 0 のいずれかとして指定されます。値 1DriftStatus'Drift' であることを意味します。

    データ型: logical

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

    現在のドリフト ステータス。'Stable''Warning'、または 'Drift' として指定されます。DriftStatusPreviousDriftStaus を比較することで、ドリフト ステータスの遷移を確認できます。

    データ型: char

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

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

    データ型: double

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

    連続変数の入力範囲の推定に使用された観測値の数。非負の整数として指定されます。

    データ型: double

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

    メモ

    このオプションは、指数加重移動平均法 (ewma) にのみ該当します。

    指数加重移動平均 (EWMA) 法 (HDDMW) の忘却係数。0 から 1 までのスカラー値として指定されます。

    データ型: double

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

    ドリフト検出器の学習に使用されたすべての入力データの Hoeffding 境界。数値として指定されます。

    データ型: double

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

    入力データの範囲。サイズ 2 の数値ベクトルとして指定されます。

    データ型: double

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

    入力データのタイプ。'binary' または 'continuous' のいずれかとして指定されます。

    データ型: char

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

    ウォームアップ期間が終了しているかどうかを示すフラグ。1 (true) または 0 (false) として指定されます。

    データ型: logical

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

    ドリフト検出器の学習に使用されたすべての入力データの加重平均。数値として指定されます。

    データ型: double

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

    ドリフト検出器の学習に使用された観測値の数。非負の整数値として指定されます。

    データ型: double

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

    切り取り点の後に観測されたデータの Hoeffding 境界。数値として指定されます。

    detectdrift は、次のいずれかの条件を満たす場合に、CutMeanCutHoeffdingBound を更新し、PostCutMeanPostCutHoeffdingBound をリセットします。

    • Alternative"greater" で、Mean + HoeffdingBoundCutMean + CutHoeffdingBound 以下。

    • Alternative"less" で、Mean - HoeffdingBoundCutMean - CutHoeffdingBound 以上。

    • Alternative"unequal" で、Mean + HoeffdingBoundCutMean - CutHoeffdingBound 以下または Mean - HoeffdingBoundCutMean + CutHoeffdingBound 以上。

    データ型: double

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

    切り取り点の後に観測されたデータの加重平均。数値として指定されます。

    detectdrift は、次のいずれかの条件を満たす場合に、CutMeanCutHoeffdingBound を更新し、PostCutMeanPostCutHoeffdingBound をリセットします。

    • Alternative"greater" で、Mean + HoeffdingBoundCutMean + CutHoeffdingBound 以下。

    • Alternative"less" で、Mean - HoeffdingBoundCutMean - CutHoeffdingBound 以上。

    • Alternative"unequal" で、Mean + HoeffdingBoundCutMean - CutHoeffdingBound 以下または Mean - HoeffdingBoundCutMean + CutHoeffdingBound 以上。

    データ型: double

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

    最新のデータのバッチを使用した最新の学習以前のドリフト ステータス。'Stable''Warning'、または 'Drift' として指定されます。DriftStatusPreviousDriftStaus を比較することで、ドリフト ステータスの遷移を確認できます。

    データ型: char

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

    ドリフト検出に使用された検定法。'ewma' または 'average' として指定されます。incrementalConceptDriftDetector の呼び出しにおける "hddmw""hddma" の検出法にそれぞれ対応します。

    データ型: char

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

    ドリフト検出器のウォームアップのための観測値の数。非負の整数として指定されます。

    データ型: double

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

    警告があるかどうかを示すフラグ。1 または 0 のいずれかとして指定されます。値 1DriftStatus'Warning' であることを意味します。

    データ型: logical

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

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

    データ型: double

    オブジェクト関数

    detectdriftドリフト検出器の状態とドリフト ステータスを新しいデータで更新
    resetインクリメンタルな概念ドリフト検出器をリセット

    すべて折りたたむ

    標準偏差が 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 回あります。

    参照

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