Skip to content

Commit 7888975

Browse files
Revert "Drift detector evaluation v1 + STUDD + fix HDDM" (#258)
1 parent abb6458 commit 7888975

File tree

6 files changed

+215
-576
lines changed

6 files changed

+215
-576
lines changed

notebooks/drift_detection.ipynb

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@
99
"\n",
1010
"In this tutorial, we show how to conduct drift detection using CapyMOA\n",
1111
"\n",
12-
"* Usage example of several detectors\n",
12+
"* Then test different drift detectors\n",
1313
"* Example using ADWIN\n",
14-
"* Evaluating detectors based on known drift locations\n",
15-
"* Multivariate drift detection using ABCD\n",
14+
"* Evaluating detectors based on known drift location\n",
1615
"\n",
1716
"---\n",
1817
"\n",
1918
"*More information about CapyMOA can be found in* https://www.capymoa.org\n",
2019
"\n",
21-
"**last update on 02/04/2025**"
20+
"**last update on 25/07/2024**"
2221
]
2322
},
2423
{
@@ -80,19 +79,18 @@
8079
"name": "stdout",
8180
"output_type": "stream",
8281
"text": [
83-
"ADWIN 1\n",
84-
"CUSUM 2\n",
82+
"ADWIN 2\n",
83+
"CUSUM 1\n",
8584
"DDM 1\n",
8685
"EWMAChart 1\n",
8786
"GeometricMovingAverage 1\n",
88-
"HDDMAverage 130\n",
89-
"HDDMWeighted 100\n",
90-
"PageHinkley 2\n",
87+
"HDDMAverage 126\n",
88+
"HDDMWeighted 89\n",
89+
"PageHinkley 1\n",
9190
"RDDM 2\n",
9291
"SEED 2\n",
9392
"STEPD 1\n",
9493
"ABCD 1\n",
95-
"STUDD 0\n",
9694
"dtype: int64\n"
9795
]
9896
}
@@ -102,9 +100,6 @@
102100
"\n",
103101
"n_detections = {k: 0 for k in all_detectors}\n",
104102
"for detector_name in all_detectors:\n",
105-
" if detector_name == 'STUDD':\n",
106-
" continue\n",
107-
" \n",
108103
" detector = getattr(detectors, detector_name)()\n",
109104
"\n",
110105
" for i in range(2000):\n",
@@ -133,8 +128,8 @@
133128
"name": "stdout",
134129
"output_type": "stream",
135130
"text": [
136-
"Change detected in data: 1 - at index: 25\n",
137-
"Change detected in data: 11 - at index: 1009\n"
131+
"Change detected in data: 1 - at index: 24\n",
132+
"Change detected in data: 6 - at index: 1010\n"
138133
]
139134
}
140135
],
@@ -158,7 +153,7 @@
158153
{
159154
"data": {
160155
"text/plain": [
161-
"[1010, 2026, 3010]"
156+
"[1011, 2025, 3011]"
162157
]
163158
},
164159
"execution_count": 5,
@@ -180,7 +175,7 @@
180175
{
181176
"data": {
182177
"text/plain": [
183-
"[1009, 2024, 2025, 3009]"
178+
"[1009, 1010, 2022, 2023, 2024, 3009, 3010]"
184179
]
185180
},
186181
"execution_count": 6,
@@ -224,27 +219,27 @@
224219
"\n",
225220
"Assuming the drift locations are known, you can evaluate detectors using **EvaluateDetector** class\n",
226221
"\n",
227-
"This class takes a parameter called **max_delay**, which is the maximum number of instances for which we consider a detector to have detected a change. After **max_delay** instances, we assume that the change is obvious and has been missed by the detector."
222+
"This class takes a parameter called **max_delay**, which is the maximum number of instances for which we consider a detector to have detected a change. After **max_delay** instances, we assume that the change is obvious and have been missed by the detector."
228223
]
229224
},
230225
{
231226
"cell_type": "code",
232-
"execution_count": 5,
227+
"execution_count": 8,
233228
"id": "598a89e7-8460-415f-8a92-6854509e4697",
234229
"metadata": {},
235230
"outputs": [],
236231
"source": [
237-
"from capymoa.drift.eval_detector import EvaluateDriftDetector"
232+
"from capymoa.drift.eval_detector import EvaluateDetector"
238233
]
239234
},
240235
{
241236
"cell_type": "code",
242-
"execution_count": 7,
237+
"execution_count": 9,
243238
"id": "4a2df820-9314-42e8-bf37-575c837ffabe",
244239
"metadata": {},
245240
"outputs": [],
246241
"source": [
247-
"drift_eval = EvaluateDriftDetector(max_delay=200)"
242+
"eval = EvaluateDetector(max_delay=200)"
248243
]
249244
},
250245
{
@@ -259,28 +254,21 @@
259254
},
260255
{
261256
"cell_type": "code",
262-
"execution_count": 9,
257+
"execution_count": 10,
263258
"id": "352a52da-71e0-4f7b-bf74-09230086b91a",
264259
"metadata": {},
265260
"outputs": [
266261
{
267262
"data": {
268263
"text/plain": [
269-
"{'fp': 0,\n",
270-
" 'tp': 1,\n",
271-
" 'fn': 0,\n",
272-
" 'precision': 1.0,\n",
273-
" 'recall': 1.0,\n",
274-
" 'episode_recall': 1.0,\n",
275-
" 'f1': 1.0,\n",
276-
" 'mdt': np.float64(11.0),\n",
277-
" 'far': 0.0,\n",
278-
" 'ar': 0.25,\n",
279-
" 'n_episodes': 1,\n",
280-
" 'n_alarms': 1}"
264+
"mean_time_to_detect 11.0\n",
265+
"missed_detection_ratio 0.0\n",
266+
"mean_time_btw_false_alarms NaN\n",
267+
"no_alarms_per_episode 0.0\n",
268+
"dtype: float64"
281269
]
282270
},
283-
"execution_count": 9,
271+
"execution_count": 10,
284272
"metadata": {},
285273
"output_type": "execute_result"
286274
}
@@ -289,7 +277,7 @@
289277
"trues = np.array([1000])\n",
290278
"preds = detector.detection_index\n",
291279
"\n",
292-
"drift_eval.calc_performance(trues, preds, tot_n_instances=detector.idx)"
280+
"eval.calc_performance(preds, trues)"
293281
]
294282
},
295283
{
@@ -488,7 +476,7 @@
488476
"name": "python",
489477
"nbconvert_exporter": "python",
490478
"pygments_lexer": "ipython3",
491-
"version": "3.10.16"
479+
"version": "3.9.19"
492480
}
493481
},
494482
"nbformat": 4,

src/capymoa/drift/base_detector.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,23 +105,6 @@ def add_element(self, element: float) -> None:
105105

106106
if self.in_concept_change:
107107
self.detection_index.append(self.idx)
108-
self.reset()
109-
110-
def reset(self, clean_history: bool = False) -> None:
111-
"""Reset the drift detector.
112-
113-
:param clean_history: Whether to reset detection history, defaults to False
114-
"""
115-
self.in_concept_change = False
116-
self.in_warning_zone = False
117-
self.moa_detector.prepareForUse()
118-
self.moa_detector.resetLearning()
119-
120-
if clean_history:
121-
self.detection_index = []
122-
self.warning_index = []
123-
self.data = []
124-
self.idx = 0
125108

126109
@override
127110
def get_params(self) -> Dict[str, Any]:

src/capymoa/drift/detectors/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from .seed import SEED
1111
from .stepd import STEPD
1212
from .abcd import ABCD
13-
from .studd import STUDD
1413

1514
__all__ = [
1615
"ADWIN",
@@ -25,5 +24,4 @@
2524
"SEED",
2625
"STEPD",
2726
"ABCD",
28-
"STUDD",
2927
]

src/capymoa/drift/detectors/hddm_w.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,16 @@ def __init__(
6262
self.warning_confidence = warning_confidence
6363
self.lambda_ = lambda_
6464
self.test_type = test_type
65-
self.get_params()
65+
self.get_params()
66+
67+
def add_element(self, element: float):
68+
if not isinstance(element, float):
69+
element = float(element)
70+
71+
self.moa_detector.input(element)
72+
self.data.append(element)
73+
74+
self.estimation = self.moa_detector.getEstimation()
75+
self.delay = self.moa_detector.getDelay()
76+
self.in_concept_change = self.moa_detector.getChange()
77+
self.in_warning_zone = self.moa_detector.getWarningZone()

0 commit comments

Comments
 (0)