{ "cells": [ { "cell_type": "markdown", "id": "154b5160-fd11-4ed9-82f3-17b7bf7abf0d", "metadata": {}, "source": [ "# Drift Detection in CapyMOA\n", "\n", "In this tutorial, we show how to conduct drift detection using CapyMOA\n", "\n", "* Usage example of several detectors\n", "* Example using ADWIN\n", "* Evaluating detectors based on known drift locations\n", "* Multivariate drift detection using ABCD\n", "\n", "---\n", "\n", "*More information about CapyMOA can be found in* https://www.capymoa.org\n", "\n", "**last update on 04/07/2025**" ] }, { "cell_type": "code", "execution_count": 1, "id": "78dc8927-1bc3-4ce2-b352-ecf50ab56480", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "import capymoa.drift.detectors as detectors" ] }, { "cell_type": "markdown", "id": "432b8844-6f91-412d-ad36-3a640affc223", "metadata": {}, "source": [ "## Basic example" ] }, { "cell_type": "markdown", "id": "93224151-66bd-4124-ba0f-4ad486d5810a", "metadata": {}, "source": [ "- Creating dummy data" ] }, { "cell_type": "code", "execution_count": 2, "id": "3406740a-f265-4434-aae8-05db48de7e56", "metadata": {}, "outputs": [], "source": [ "data_stream = np.random.randint(2, size=2000)\n", "for i in range(999, 2000):\n", " data_stream[i] = np.random.randint(6, high=12)" ] }, { "cell_type": "markdown", "id": "e6aca673-6eab-42b0-8981-e5c73491243e", "metadata": {}, "source": [ "- Basic drift detection example" ] }, { "cell_type": "code", "execution_count": 3, "id": "bca87b8f-91f3-4eaf-a011-e8b274bda1f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ADWIN 1\n", "CUSUM 2\n", "DDM 1\n", "EWMAChart 1\n", "GeometricMovingAverage 1\n", "HDDMAverage 139\n", "HDDMWeighted 98\n", "PageHinkley 1\n", "RDDM 1\n", "SEED 2\n", "STEPD 1\n", "ABCD 1\n", "STUDD 0\n", "dtype: int64\n" ] } ], "source": [ "all_detectors = detectors.__all__\n", "\n", "n_detections = {k: 0 for k in all_detectors}\n", "for detector_name in all_detectors:\n", " if detector_name == \"STUDD\":\n", " continue\n", "\n", " detector = getattr(detectors, detector_name)()\n", "\n", " for i in range(2000):\n", " detector.add_element(float(data_stream[i]))\n", " if detector.detected_change():\n", " n_detections[detector_name] += 1\n", "\n", "print(pd.Series(n_detections))" ] }, { "cell_type": "markdown", "id": "5ca1d03f-a7a2-421a-b800-ebd6a7918791", "metadata": {}, "source": [ "## Example using ADWIN" ] }, { "cell_type": "code", "execution_count": 4, "id": "5c9ade00-778f-481c-a51c-49dd199cd145", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Change detected in data: 1 - at index: 23\n", "Change detected in data: 10 - at index: 1009\n" ] } ], "source": [ "# detector = ADWIN(delta=0.001)\n", "\n", "for i in range(2000):\n", " detector.add_element(data_stream[i])\n", " if detector.detected_change():\n", " print(\n", " \"Change detected in data: \" + str(data_stream[i]) + \" - at index: \" + str(i)\n", " )" ] }, { "cell_type": "code", "execution_count": 5, "id": "dcf26795-09bb-4508-ab36-878c4f145197", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1010, 2024, 3010]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Detection indices\n", "detector.detection_index" ] }, { "cell_type": "code", "execution_count": 6, "id": "cd7ae6be-17cb-4dec-b630-32e41531b020", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1008, 1009, 2020, 2021, 2022, 2023, 3008, 3009]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Warning indices\n", "detector.warning_index" ] }, { "cell_type": "code", "execution_count": 7, "id": "0b8a45e7-d983-4f69-a0d8-035619da3b11", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4000" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Instance counter\n", "detector.idx" ] }, { "cell_type": "markdown", "id": "71ba1b8b-751c-4ab4-a9a3-331de462b0f9", "metadata": {}, "source": [ "## Evaluating drift detectors\n", "\n", "Assuming the drift locations are known, you can evaluate detectors using **EvaluateDetector** class\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": 8, "id": "598a89e7-8460-415f-8a92-6854509e4697", "metadata": {}, "outputs": [], "source": [ "from capymoa.drift.eval_detector import EvaluateDriftDetector" ] }, { "cell_type": "code", "execution_count": 9, "id": "4a2df820-9314-42e8-bf37-575c837ffabe", "metadata": {}, "outputs": [], "source": [ "drift_eval = EvaluateDriftDetector(max_delay=200)" ] }, { "cell_type": "markdown", "id": "98799472-d6cb-4cc1-912e-49d1004b3c84", "metadata": {}, "source": [ "The EvaluateDetector class takes two arguments for evaluating detectors:\n", "- The locations of the drift\n", "- The locations of the detections" ] }, { "cell_type": "code", "execution_count": 10, "id": "352a52da-71e0-4f7b-bf74-09230086b91a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'fp': 0,\n", " 'tp': 1,\n", " 'fn': 0,\n", " 'precision': 1.0,\n", " 'recall': 1.0,\n", " 'episode_recall': 1.0,\n", " 'f1': 1.0,\n", " 'mdt': np.float64(10.0),\n", " 'far': 0.0,\n", " 'ar': 0.25,\n", " 'n_episodes': 1,\n", " 'n_alarms': 1}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trues = np.array([1000])\n", "preds = detector.detection_index\n", "\n", "drift_eval.calc_performance(trues, preds, tot_n_instances=detector.idx)" ] }, { "cell_type": "markdown", "id": "928328fa-c4bc-41b2-8920-8ee59b1a2818", "metadata": {}, "source": [ "## Multivariate Drift Detection" ] }, { "cell_type": "code", "execution_count": 12, "id": "17658d67-c038-4293-9013-90734fd50b20", "metadata": {}, "outputs": [], "source": [ "from capymoa.drift.detectors import ABCD\n", "from capymoa.datasets import ElectricityTiny\n", "\n", "detector = ABCD()\n", "\n", "## Opening a file as a stream\n", "stream = ElectricityTiny()" ] }, { "cell_type": "code", "execution_count": 13, "id": "e9cb0128-5eb1-421c-ac6b-ed06dd85ad31", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Change detected at index: 2318\n" ] } ], "source": [ "i = 0\n", "loss_values = []\n", "while stream.has_more_instances and i < 5000:\n", " i += 1\n", " instance = stream.next_instance()\n", " detector.add_element(instance)\n", " loss_values.append(detector.loss())\n", " if detector.detected_change():\n", " print(\"Change detected at index: \" + str(i))" ] }, { "cell_type": "code", "execution_count": 14, "id": "aae1b2a8-f45d-4c25-aa10-7ee72acfac04", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A 2-dimensional stream\n" ] } ], "source": [ "import numpy as np\n", "from capymoa.drift.detectors import ABCD\n", "from capymoa.datasets import ElectricityTiny\n", "\n", "detector = ABCD(model_id=\"pca\")\n", "\n", "## Opening a file as a stream\n", "stream_change = np.hstack(\n", " [np.random.uniform(0, 0.5, 3000), np.random.uniform(0.5, 1.0, 3000)]\n", ")\n", "stream_nochange = np.random.uniform(0, 1.0, len(stream_change))\n", "stream = np.vstack([stream_change, stream_nochange]).T\n", "print(f\"A {stream.shape[-1]}-dimensional stream\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "849708ef-0725-43e5-84e8-5c6c34b52430", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Change detected at index: 3056\n" ] } ], "source": [ "i = 0\n", "loss_values = []\n", "while i < len(stream):\n", " instance = stream[i]\n", " i += 1\n", " detector.add_element(instance)\n", " loss_values.append(detector.loss())\n", " if detector.detected_change():\n", " print(\"Change detected at index: \" + str(i))" ] }, { "cell_type": "code", "execution_count": 16, "id": "fd1914b1-0bd0-4d14-b076-1a96ddff305f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Reconstruction loss')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "plt.plot(pd.Series(loss_values).rolling(10).mean())\n", "plt.title(\"ABCD with PCA\")\n", "plt.xlabel(\"# Instances\")\n", "plt.ylabel(\"Reconstruction loss\")" ] }, { "cell_type": "markdown", "id": "b8c75d0d-266f-4c55-a73d-6c23458efb8b", "metadata": {}, "source": [ "We see that a value of 1 as maximum reconstruction error is very conservative. By decreasing the `maximum_absolute_value` parameter, we can make change detection faster as it makes the applied statistical test more sensitive." ] }, { "cell_type": "code", "execution_count": 17, "id": "47940ff5-27a7-4b3f-8467-47803307b031", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Change detected at index: 3023\n" ] } ], "source": [ "detector = ABCD(model_id=\"pca\", maximum_absolute_value=0.3)\n", "\n", "i = 0\n", "loss_values = []\n", "while i < len(stream):\n", " instance = stream[i]\n", " i += 1\n", " detector.add_element(instance)\n", " loss_values.append(detector.loss())\n", " if detector.detected_change():\n", " print(\"Change detected at index: \" + str(i))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.16" } }, "nbformat": 4, "nbformat_minor": 5 }