incrementalConceptDriftDetector
構文
説明
は、既定の手法である移動平均テストによる Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を返します。IncCDDetector
= incrementalConceptDriftDetector()
は、IncCDDetector
= incrementalConceptDriftDetector(DetectionMethod
)DetectionMethod
の手法を使用するインクリメンタルな概念ドリフト検出器を返します。
は、1 つ以上の IncCDDetector
= incrementalConceptDriftDetector(DetectionMethod
,Name=Value
)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")
連続データにおけるドリフトの監視
標準偏差が 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
オブジェクトです。最初にオブジェクトを作成した時点では、DriftStatus
、IsWarm
、CutMean
、NumTrainingObservations
などのプロパティは初期状態になります。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")
平均値と観測値の数の関係をプロットします。
scatter(1:numObservations,M)
このプロットから、標本平均が増加していることがわかります。平均値が大きくなり、最終的にソフトウェアによってデータのドリフトが検出されます。ドリフトが検出されたら、インクリメンタルなドリフト検出器をリセットします。これにより、平均値もリセットされます。プロットの標本平均がゼロである観測値は推定期間に対応します。推定期間は、最初に 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(); gscatter(1:numObservations,status,statusname,'gyr','*',4,'on',"Observation number","Drift status")
detectdrift
は、複数の観測値を警告ステータスと結論付けてからドリフトと判定しています。
入力引数
DetectionMethod
— インクリメンタルなドリフト検出法
"ddm"
| "hddma"
| "hddmw"
インクリメンタルなドリフト検出法。次のいずれかとして指定します。
検出法 | 定義 |
---|---|
"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 に指定します。
Alternative
— 対立仮説のタイプ
"greater"
(既定値) | "less"
| "unequal"
(HDDMA または HDDMW の場合)
ドリフト ステータスを判定する対立仮説のタイプ。"unequal"
、"greater"
、または "less"
として指定します。2 つの検定統計量が および であるとすると、次のようになります。
"greater"
は、正方向のドリフトの検定であり、 となります。この場合、帰無仮説は です。
"less"
は、負方向のドリフトの検定であり、 となります。この場合、帰無仮説は です。
"unequal"
は、双方向のドリフトの検定であり、 となります。この場合、帰無仮説は です。
"unequal"
は、HDDMA
法とHDDMW
法にのみ該当します。
それぞれのタイプの検定において、detectdrift
は統計量を更新し、WarningThreshold
または DriftThreshold
の有意水準で対立仮説を優先して帰無仮説を棄却できるかどうかをチェックします。WarningThreshold
の有意水準で帰無仮説を棄却すると、DriftStatus
を 'Warning'
に更新します。DriftThreshold
で帰無仮説を棄却すると、DriftStatus
を 'Drift'
に更新します。
例: Alternative="less"
InputType
— ドリフト検出器への入力のタイプ
"binary"
(既定値) | "continuous"
ドリフト検出器への入力のタイプ。"binary"
または "continuous"
のいずれかとして指定します。
例: InputType="continuous"
WarmupPeriod
— ドリフト検出器のウォームアップに使用される観測値の数
30 (既定値) | 非負の整数
ドリフト検出器のウォームアップに使用される観測値の数。非負の整数として指定します。ウォームアップ期間が終了するまで、detectdrift
は入力データを使用してドリフト検出器に学習させ、内部の統計量を更新しますが、ドリフト ステータスはチェックしません。ウォームアップ期間に到達し、ドリフト検出器がウォームになると、ドリフト ステータスの変化のチェックが開始されます。
例: WarmupPeriod=50
データ型: double
| single
DriftThreshold
— ドリフトになるまでの標準偏差の数の制限
3 (既定値) | 非負のスカラー値
ドリフトになるまでの標準偏差の数の制限。非負のスカラー値として指定します。これは、全体の検定統計値が最適な検定統計値から離れていると見なし、ドリフト検出器がドリフト ステータスをドリフトとして設定するまでの許容される標準偏差の数です。既定値の 3 は 99.7% の信頼水準に相当します[1]。
DriftThreshold
の値は WarningThreshold
の値より厳密に大きくなければなりません。
例: DriftThreshold=2.5
データ型: double
| single
WarningThreshold
— 警告になるまでの標準偏差の数の制限
2 (既定値) | 非負のスカラー値
警告になるまでの標準偏差の数の制限。非負のスカラー値として指定します。これは、全体の検定統計値が最適な検定統計値から離れていると見なし、ドリフト検出器がドリフト ステータスを警告として設定するまでの許容される標準偏差の数です。既定値の 2 は 95% の信頼水準に相当します[1]。
WarningThreshold
の値は DriftThreshold
の値より厳密に小さくなければなりません。
例: WarningThreshold=1.75
データ型: double
| single
DriftThreshold
— ドリフトが存在するかどうかを判定するしきい値
0.001 (既定値) | 0 から 1 までの非負のスカラー値
ドリフトが存在するかどうかを判定するしきい値。0 から 1 までの非負のスカラー値として指定します。これは、Hoeffding 不等式と McDiarmid 不等式で確率変数と期待値の間の許容誤差の計算に使用される有意水準です。この水準を超えると、ドリフト検出器はドリフト ステータスをドリフトとして設定します[2]。
DriftThreshold
の値は WarningThreshold
の値より厳密に小さくなければなりません。
例: DriftThreshold=0.003
データ型: double
| single
EstimationPeriod
— 連続データの入力範囲の推定に使用する観測値の数
非負の整数
連続データの入力範囲の推定に使用する観測値の数。非負の整数として指定します。つまり、InputType
が "continuous"
の場合、InputBounds
の値を指定していないと、EstimationPeriod
の観測値の数を使用して入力範囲が推定されます。推定期間の後にウォームアップ期間が始まります。
InputBounds
の値を指定している場合や InputType
が "binary"
の場合、EstimationPeriod
は無視されます。
入力範囲の推定が必要な場合の既定値は 100 です。それ以外の場合の既定値は 0 です。
例: EstimationPeriod=150
データ型: double
| single
InputBounds
— 連続入力データの下限と上限
サイズ 2 の数値ベクトル
連続入力データの下限と上限。サイズ 2 の数値ベクトルとして指定します。
InputType
が "continuous"
の場合、InputBounds
の値が指定されていないと、detectdrift
は推定期間にデータから範囲を推定します。データ入力範囲の推定に使用する観測値の数は EstimationPeriod
を使用して指定します。
InputType
が "binary"
の場合、ドリフト検出器は InputBounds
の値を [0,1] に設定し、名前と値の引数 InputBounds
は無視されます。
HDDM では、ドリフト検出に Hoeffding 不等式と McDiarmid 不等式を使用します。これらの不等式では、制限付き入力が前提になります[2]。
例: InputBounds=[-1 1]
データ型: double
| single
ForgettingFactor
— HDDMW
法の忘却係数
0.05 (既定値) | 0 から 1 までのスカラー値
メモ
このオプションは、指数加重移動平均 (EWMA) 法 (DetectionMethod
の設定値が "hddmw"
の場合に対応) にのみ該当します。
HDDMW 法における忘却係数。0 から 1 までのスカラー値として指定します。忘却係数は、EWMA 統計量 における λ
です[2]。忘却係数により、現在の平均の予測に過去の観測値がどの程度影響するかが決まります。ForgettingFactor
の値が高いほど、現在の観測値の重みが増し、過去の観測値の影響が少なくなります。
例: ForgettingFactor=0.075
データ型: double
| single
WarningThreshold
— 警告かドリフトかを判別するしきい値
0.005 (既定値) | 0 から 1 までの非負のスカラー値
警告かドリフトかを判別するしきい値。0 から 1 までの非負のスカラー値として指定します。これは、Hoeffding 不等式と McDiarmid 不等式で確率変数と期待値の間の許容誤差の計算に使用される有意水準です。この水準を超えると、ドリフト検出器はドリフト ステータスを警告として設定します[2]。
WarningThreshold
の値は DriftThreshold
の値より厳密に大きくなければなりません。
例: WarningThreshold=0.007
データ型: double
| single
出力引数
IncCDDetector
— インクリメンタルな概念ドリフト検出器
DriftDetectionMethod
| HoeffdingDriftDetectionMethod
インクリメンタルな概念ドリフト検出器。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 で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)