pyod 3.5.2__tar.gz → 3.5.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyod-3.5.2/pyod.egg-info → pyod-3.5.4}/PKG-INFO +6 -6
- {pyod-3.5.2 → pyod-3.5.4}/README.rst +4 -4
- {pyod-3.5.2 → pyod-3.5.4}/pyod/cli.py +8 -2
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/SKILL.md +123 -123
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/graph.md +2 -2
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/tabular.md +3 -4
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/text_image.md +1 -2
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/time_series.md +1 -1
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/workflow.md +237 -237
- pyod-3.5.4/pyod/utils/_llm.py +267 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_quality_metrics.py +505 -500
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/ad_engine.py +338 -7
- {pyod-3.5.2 → pyod-3.5.4}/pyod/version.py +23 -23
- {pyod-3.5.2 → pyod-3.5.4/pyod.egg-info}/PKG-INFO +6 -6
- {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/SOURCES.txt +1 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyproject.toml +1 -1
- {pyod-3.5.2 → pyod-3.5.4}/LICENSE +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/MANIFEST.in +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/mcp_server.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/_pyg_utils.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/_ts_utils.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/abod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ae1svm.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/alad.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/anogan.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/auto_encoder.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/base.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/base_dl.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cblof.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cd.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cof.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/combination.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/copod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/deep_svdd.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/devnet.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/dif.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ecod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/embedding.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/feature_bagging.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/gaal_base.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/gmm.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/hbos.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/hdbscan.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/iforest.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/inne.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/kde.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/knn.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/kpca.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lmdd.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/loci.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/loda.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lof.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lscp.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lunar.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mad.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mcd.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mo_gaal.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ocsvm.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pca.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_anomalous.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_anomalydae.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_cola.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_conad.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_dominant.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_guide.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_radar.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_scan.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/qmcd.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/rgraph.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/rod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sampling.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sklearn_base.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/so_gaal.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/so_gaal_new.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sos.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/suod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/thresholds.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_anomaly_transformer.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_kshape.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_lstm.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_matrix_profile.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_od.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_sand.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_spectral_residual.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/vae.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/models/xgbod.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/pitfalls.md +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_detector_factory.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_kb_router.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_nl_feedback.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/auto_model_selector.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/data.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/huggingface.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/openai_encoder.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/sentence_transformer.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/example.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/investigation.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/algorithms.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/benchmarks.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/papers.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/routing_rules.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AE1SVM.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/ALAD.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AnoGAN.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AutoEncoder.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/Deep SVDD.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/DevNet.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/LUNAR.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/MO-GAAL.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/SO-GAAL.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/VAE.json +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/__init__.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/persistence.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/stat_models.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/torch_utility.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/utility.py +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/dependency_links.txt +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/entry_points.txt +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/requires.txt +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/top_level.txt +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/requirements.txt +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/setup.cfg +0 -0
- {pyod-3.5.2 → pyod-3.5.4}/setup.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyod
|
|
3
|
-
Version: 3.5.
|
|
4
|
-
Summary: A Python library for anomaly detection across tabular, time series, graph, text, and image data. 60
|
|
3
|
+
Version: 3.5.4
|
|
4
|
+
Summary: A Python library for anomaly detection across tabular, time series, graph, text, and image data. 60 detectors, benchmark-backed ADEngine orchestration, and an agentic workflow for AI agents.
|
|
5
5
|
Author-email: Yue Zhao <yzhao062@gmail.com>
|
|
6
6
|
License-Expression: BSD-2-Clause
|
|
7
7
|
Project-URL: Homepage, https://github.com/yzhao062/pyod
|
|
@@ -131,7 +131,7 @@ PyOD 3 is the most comprehensive Python library for anomaly detection. Four pill
|
|
|
131
131
|
=========================== ========================================================================================
|
|
132
132
|
Pillar What it means
|
|
133
133
|
=========================== ========================================================================================
|
|
134
|
-
Multi-Modal 60
|
|
134
|
+
Multi-Modal 60 detectors across **tabular, time series, graph, text, and image** data, one API
|
|
135
135
|
Full Lifecycle From raw data to explained anomalies and next-step guidance in a single call
|
|
136
136
|
Agentic ``od-expert`` turns natural-language requests into ADEngine workflows; MCP exposes structured tools for other agents
|
|
137
137
|
Most Used 38+ million downloads; benchmark-backed routing (ADBench, TSB-AD, BOND, NLP-ADBench)
|
|
@@ -191,7 +191,7 @@ Layer Name When to use
|
|
|
191
191
|
3 Agentic Investigation You want an AI agent to drive OD through natural conversation `Layer 3 walkthrough <https://pyod.readthedocs.io/en/latest/examples/agentic.html>`__
|
|
192
192
|
========= ===================== ====================================================================== =======================================
|
|
193
193
|
|
|
194
|
-
Layers 2 and 3 are powered by ``ADEngine``, PyOD's
|
|
194
|
+
Layers 2 and 3 are powered by ``ADEngine``, PyOD's lifecycle orchestration core. The full multi-turn Layer 3 investigation flow is available through the ``od-expert`` skill for Claude Code and Codex. The MCP server (``python -m pyod.mcp_server``) exposes ten stateless tools for MCP-compatible LLMs, spanning knowledge queries (``list_detectors``, ``explain_detector``, ``compare_detectors``, ``get_benchmarks``), planning (``profile_data``, ``plan_detection``, ``build_detector``), and detection (``run_detection``, ``analyze_results``, ``explain_findings``); stateful ``investigate`` / ``iterate`` MCP tools are deferred.
|
|
195
195
|
|
|
196
196
|
.. image:: https://raw.githubusercontent.com/yzhao062/pyod/development/docs/figs/agentic-demo.png
|
|
197
197
|
:alt: PyOD 3 agentic investigation demo on cardiotocography dataset
|
|
@@ -211,7 +211,7 @@ About PyOD
|
|
|
211
211
|
|
|
212
212
|
PyOD, established in 2017, is the longest-running and most widely used Python library for anomaly detection. With `38+ million downloads <https://pepy.tech/project/pyod>`__, it serves both academic research (featured in `Analytics Vidhya <https://www.analyticsvidhya.com/blog/2019/02/outlier-detection-python-pyod/>`__, `KDnuggets <https://www.kdnuggets.com/2019/02/outlier-detection-methods-cheat-sheet.html>`__, and `Towards Data Science <https://towardsdatascience.com/anomaly-detection-for-dummies-15f148e559c1>`__) and commercial products.
|
|
213
213
|
|
|
214
|
-
V3 extends the library with ``ADEngine`` (
|
|
214
|
+
V3 extends the library with ``ADEngine`` (lifecycle orchestration) and the ``od-expert`` skill (agentic workflow), while keeping the classic ``fit``/``predict`` API fully backward-compatible. V3 is built on SUOD [#Zhao2021SUOD]_ for fast parallel training and numba JIT for per-model speedups.
|
|
215
215
|
|
|
216
216
|
**Impact & Recognition**:
|
|
217
217
|
|
|
@@ -322,7 +322,7 @@ Additional Topics
|
|
|
322
322
|
Implemented Algorithms
|
|
323
323
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
324
324
|
|
|
325
|
-
PyOD is organized into two functional groups: **(i) Detection Algorithms**, with dedicated subsections for tabular, time series, and graph data (EmbeddingOD inside the tabular table adds multi-modal support for text and image via foundation model encoders); and **(ii) Utility Functions** for data generation, evaluation, and
|
|
325
|
+
PyOD is organized into two functional groups: **(i) Detection Algorithms**, with dedicated subsections for tabular, time series, and graph data (EmbeddingOD inside the tabular table adds multi-modal support for text and image via foundation model encoders); and **(ii) Utility Functions** for data generation, evaluation, and lifecycle orchestration.
|
|
326
326
|
|
|
327
327
|
**(i-a) Tabular & Multi-Modal Detection Algorithms** :
|
|
328
328
|
|
|
@@ -62,7 +62,7 @@ PyOD 3 is the most comprehensive Python library for anomaly detection. Four pill
|
|
|
62
62
|
=========================== ========================================================================================
|
|
63
63
|
Pillar What it means
|
|
64
64
|
=========================== ========================================================================================
|
|
65
|
-
Multi-Modal 60
|
|
65
|
+
Multi-Modal 60 detectors across **tabular, time series, graph, text, and image** data, one API
|
|
66
66
|
Full Lifecycle From raw data to explained anomalies and next-step guidance in a single call
|
|
67
67
|
Agentic ``od-expert`` turns natural-language requests into ADEngine workflows; MCP exposes structured tools for other agents
|
|
68
68
|
Most Used 38+ million downloads; benchmark-backed routing (ADBench, TSB-AD, BOND, NLP-ADBench)
|
|
@@ -122,7 +122,7 @@ Layer Name When to use
|
|
|
122
122
|
3 Agentic Investigation You want an AI agent to drive OD through natural conversation `Layer 3 walkthrough <https://pyod.readthedocs.io/en/latest/examples/agentic.html>`__
|
|
123
123
|
========= ===================== ====================================================================== =======================================
|
|
124
124
|
|
|
125
|
-
Layers 2 and 3 are powered by ``ADEngine``, PyOD's
|
|
125
|
+
Layers 2 and 3 are powered by ``ADEngine``, PyOD's lifecycle orchestration core. The full multi-turn Layer 3 investigation flow is available through the ``od-expert`` skill for Claude Code and Codex. The MCP server (``python -m pyod.mcp_server``) exposes ten stateless tools for MCP-compatible LLMs, spanning knowledge queries (``list_detectors``, ``explain_detector``, ``compare_detectors``, ``get_benchmarks``), planning (``profile_data``, ``plan_detection``, ``build_detector``), and detection (``run_detection``, ``analyze_results``, ``explain_findings``); stateful ``investigate`` / ``iterate`` MCP tools are deferred.
|
|
126
126
|
|
|
127
127
|
.. image:: https://raw.githubusercontent.com/yzhao062/pyod/development/docs/figs/agentic-demo.png
|
|
128
128
|
:alt: PyOD 3 agentic investigation demo on cardiotocography dataset
|
|
@@ -142,7 +142,7 @@ About PyOD
|
|
|
142
142
|
|
|
143
143
|
PyOD, established in 2017, is the longest-running and most widely used Python library for anomaly detection. With `38+ million downloads <https://pepy.tech/project/pyod>`__, it serves both academic research (featured in `Analytics Vidhya <https://www.analyticsvidhya.com/blog/2019/02/outlier-detection-python-pyod/>`__, `KDnuggets <https://www.kdnuggets.com/2019/02/outlier-detection-methods-cheat-sheet.html>`__, and `Towards Data Science <https://towardsdatascience.com/anomaly-detection-for-dummies-15f148e559c1>`__) and commercial products.
|
|
144
144
|
|
|
145
|
-
V3 extends the library with ``ADEngine`` (
|
|
145
|
+
V3 extends the library with ``ADEngine`` (lifecycle orchestration) and the ``od-expert`` skill (agentic workflow), while keeping the classic ``fit``/``predict`` API fully backward-compatible. V3 is built on SUOD [#Zhao2021SUOD]_ for fast parallel training and numba JIT for per-model speedups.
|
|
146
146
|
|
|
147
147
|
**Impact & Recognition**:
|
|
148
148
|
|
|
@@ -253,7 +253,7 @@ Additional Topics
|
|
|
253
253
|
Implemented Algorithms
|
|
254
254
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
255
255
|
|
|
256
|
-
PyOD is organized into two functional groups: **(i) Detection Algorithms**, with dedicated subsections for tabular, time series, and graph data (EmbeddingOD inside the tabular table adds multi-modal support for text and image via foundation model encoders); and **(ii) Utility Functions** for data generation, evaluation, and
|
|
256
|
+
PyOD is organized into two functional groups: **(i) Detection Algorithms**, with dedicated subsections for tabular, time series, and graph data (EmbeddingOD inside the tabular table adds multi-modal support for text and image via foundation model encoders); and **(ii) Utility Functions** for data generation, evaluation, and lifecycle orchestration.
|
|
257
257
|
|
|
258
258
|
**(i-a) Tabular & Multi-Modal Detection Algorithms** :
|
|
259
259
|
|
|
@@ -46,10 +46,16 @@ def _cmd_info(args: argparse.Namespace) -> int:
|
|
|
46
46
|
from pyod.utils.ad_engine import ADEngine
|
|
47
47
|
engine = ADEngine()
|
|
48
48
|
counts: Counter = Counter()
|
|
49
|
-
|
|
49
|
+
# Count only buildable detectors: a `planned` entry (e.g., LLMAD) has
|
|
50
|
+
# no backing module, so it must not inflate the reported total.
|
|
51
|
+
buildable = {
|
|
52
|
+
name: algo for name, algo in engine.kb.algorithms.items()
|
|
53
|
+
if algo.get("status") != "planned"
|
|
54
|
+
}
|
|
55
|
+
for algo in buildable.values():
|
|
50
56
|
for dt in algo.get("data_types", []):
|
|
51
57
|
counts[dt] += 1
|
|
52
|
-
total = len(
|
|
58
|
+
total = len(buildable)
|
|
53
59
|
ad_ok = True
|
|
54
60
|
except Exception:
|
|
55
61
|
counts = Counter()
|
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: od-expert
|
|
3
|
-
description: Anomaly detection expert backed by PyOD's ADEngine. Drives autonomous detection workflows on tabular, time series, graph, text, and image data
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
You are an anomaly detection expert backed by PyOD's ADEngine. Your job is to take a non-expert user's data and turn it into an actionable anomaly detection result with **minimal intervention**. Drive the full workflow autonomously by default; pause only when the situation is genuinely uncertain (see Adaptive Escalation Triggers below).
|
|
7
|
-
|
|
8
|
-
## When to activate
|
|
9
|
-
|
|
10
|
-
Fire this skill when:
|
|
11
|
-
|
|
12
|
-
- User has data and wants anomaly detection (any modality)
|
|
13
|
-
- User asks "which detector should I use?"
|
|
14
|
-
- User asks about PyOD algorithms, benchmarks, or methods
|
|
15
|
-
- User asks to compare detection methods
|
|
16
|
-
- User wants to analyze, explain, or interpret anomaly detection results
|
|
17
|
-
- User has time series, graph, text, or image data and mentions outliers, anomalies, or unusual patterns
|
|
18
|
-
- User mentions fraud, intrusion, defect detection, novelty, out-of-distribution, or similar
|
|
19
|
-
|
|
20
|
-
## What you have access to
|
|
21
|
-
|
|
22
|
-
PyOD ships <!-- KB-snapshot count -->
|
|
23
|
-
|
|
24
|
-
```python
|
|
25
|
-
from pyod.utils.ad_engine import ADEngine
|
|
26
|
-
engine = ADEngine()
|
|
27
|
-
state = engine.investigate(X) # one-shot: profile -> plan -> run -> analyze
|
|
28
|
-
# or step-by-step:
|
|
29
|
-
state = engine.start(X) # profile data
|
|
30
|
-
state = engine.plan(state) # select top-N detectors
|
|
31
|
-
state = engine.run(state) # execute, compute consensus
|
|
32
|
-
state = engine.analyze(state) # quality assessment, best detector
|
|
33
|
-
state = engine.iterate(state, fb) # iterate based on feedback
|
|
34
|
-
report = engine.report(state) # final report
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
`state.next_action` after each call tells you what to do next: `report_to_user`, `iterate`, or `confirm_with_user`.
|
|
38
|
-
|
|
39
|
-
For knowledge-only queries (no execution), the legacy methods `engine.profile_data`, `engine.list_detectors`, `engine.explain_detector`, `engine.compare_detectors`, `engine.get_benchmarks` all still work.
|
|
40
|
-
|
|
41
|
-
## Master decision tree
|
|
42
|
-
|
|
43
|
-
When the user provides data, walk this tree to pick the starting detector(s) before calling `engine.start`. The tree is your default; ADEngine's planner may refine it, but knowing the right starting point reduces wasted iterations.
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
Is the data sequential (timestamps, ordered events)?
|
|
47
|
-
├── Yes → time series. See references/time_series.md.
|
|
48
|
-
│ Default starters: `TimeSeriesOD` bridge over `ECOD`,
|
|
49
|
-
│ `MatrixProfile`, `SpectralResidual`.
|
|
50
|
-
└── No → Is the data a graph (nodes + edges)?
|
|
51
|
-
├── Yes → graph. See references/graph.md.
|
|
52
|
-
│ Default starters: `DOMINANT`, `CoLA`, `AnomalyDAE`.
|
|
53
|
-
│ Requires: pip install pyod[graph]
|
|
54
|
-
└── No → Is the data text or image?
|
|
55
|
-
├── Yes → embedding. See references/text_image.md.
|
|
56
|
-
│ Default: `EmbeddingOD` with sentence-transformers
|
|
57
|
-
│ (text) or HuggingFace ViT (image), wrapped over
|
|
58
|
-
│ `LOF` / `KNN`.
|
|
59
|
-
└── No → tabular. See references/tabular.md.
|
|
60
|
-
Default starters by row count and contamination:
|
|
61
|
-
- n < 1k: `ECOD` or `HBOS`
|
|
62
|
-
- 1k ≤ n ≤ 100k: `IForest` + `ECOD` + `LOF`
|
|
63
|
-
- n > 100k: `IForest` + `HBOS`
|
|
64
|
-
- high-D (D > 50): `COPOD` or `SUOD`
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
If the data has multiple modalities (e.g., tabular + text columns), see Trigger 9 in the escalation section below.
|
|
68
|
-
|
|
69
|
-
## Top-10 critical pitfalls
|
|
70
|
-
|
|
71
|
-
These are pitfalls that silently produce wrong results if ignored. The agent must check for each on every session before reporting.
|
|
72
|
-
|
|
73
|
-
1. **Unscaled features for distance-based detectors.** `LOF`, `KNN`, `OCSVM`, `CBLOF` require scaled features. If `engine.profile_data` reports any feature with std > 10 or range > 100, scale (`StandardScaler` or `RobustScaler`) before running. The default `engine.start` flow does NOT auto-scale.
|
|
74
|
-
2. **Contamination assumed instead of estimated.** The default contamination is 0.1, but real datasets vary widely. ADEngine's profiler does NOT estimate contamination. After `engine.run` + `engine.analyze`, check `state.analysis['consensus_analysis']['anomaly_ratio']` — if that ratio is far from the domain's true rate, re-plan with an explicit contamination via `engine.iterate(state, {"action": "adjust_contamination", "value": <rate>})`. A contamination mismatch silently shifts every threshold.
|
|
75
|
-
3. **Deep learning detector on tiny data.** Do not run `AutoEncoder`, `VAE`, `DeepSVDD`, or `AnoGAN` on datasets with fewer than 1000 rows. They overfit immediately. Trigger 6 (escalation) catches this; recommend `ECOD` / `IForest` / `HBOS` instead.
|
|
76
|
-
4. **Graph detector without PyG installed.** `DOMINANT`, `CoLA`, `CONAD`, `AnomalyDAE`, `GUIDE`, `Radar`, `ANOMALOUS` require `pyod[graph]`. Check with `importlib.util.find_spec("torch_geometric")` before recommending. Trigger 7 catches this.
|
|
77
|
-
5. **Mixing categorical and numerical without encoding.** PyOD detectors expect numeric input. Categorical columns must be one-hot or label encoded first. `engine.profile_data` will fail or produce nonsense if string columns are present.
|
|
78
|
-
6. **Ignoring `state.quality.
|
|
79
|
-
7. **Single-detector runs.**
|
|
80
|
-
8. **Time series treated as tabular.** If the data has a timestamp column AND row order matters, it is time series, not tabular. Tabular detectors will report most boundary points as anomalies. Trigger 1 catches modality ambiguity.
|
|
81
|
-
9. **Reporting raw scores instead of percentiles or labels.** Raw `decision_function` scores are not interpretable across detectors. Always report `decision_scores_` ranks, percentiles, or `labels_` (binary). The result interpretation patterns in `references/workflow.md` show the right phrasings.
|
|
82
|
-
10. **Missing the requires-extra check.** Some detectors require optional extras (`pyod[xgboost]` for `XGBOD`, `pyod[suod]` for `SUOD`, `pyod[combo]` for `FeatureBagging`). Check `engine.explain_detector(name)` before recommending; if the extra is missing, suggest the install command and pick a substitute.
|
|
83
|
-
|
|
84
|
-
## Adaptive escalation triggers
|
|
85
|
-
|
|
86
|
-
Run autonomously by default. Pause and ask the user **only** when one of these triggers fires. Full detail with example phrasings in `references/workflow.md`.
|
|
87
|
-
|
|
88
|
-
1. **Modality ambiguity** — data has timestamps but also feature columns
|
|
89
|
-
2. **Contamination uncertainty** — heuristic range > 5x (e.g., 1%-25%)
|
|
90
|
-
3. **Detector disagreement** — `state.quality.agreement < 0.4` after running
|
|
91
|
-
4. **
|
|
92
|
-
5. **Labels mentioned but not provided** — user said "I have known fraud cases" but did not pass labels
|
|
93
|
-
6. **Heavy detector + small data** — DL detector requested, n < 1000
|
|
94
|
-
7. **Missing optional extra** — graph requested but `pyod[graph]` not installed
|
|
95
|
-
8. **High-stakes domain hint** — medical, fraud, security, safety mentioned
|
|
96
|
-
9. **Cross-modality ambiguity** — mixed tabular + text columns
|
|
97
|
-
10. **Result feels too confident** — > 90% detector agreement (suspiciously clean)
|
|
98
|
-
11. **Iteration loop deadlock** — 2 rounds of `engine.iterate` with no improvement
|
|
99
|
-
|
|
100
|
-
If none of these triggers fire, proceed to `engine.report` without asking.
|
|
101
|
-
|
|
102
|
-
## References for depth
|
|
103
|
-
|
|
104
|
-
Load these on demand based on the modality and phase:
|
|
105
|
-
|
|
106
|
-
- `references/workflow.md` — autonomous loop pattern, full escalation triggers with phrasing, cardio canonical worked example, result interpretation patterns
|
|
107
|
-
- `references/pitfalls.md` — 20 more pitfalls beyond the top-10, by phase, severity-tagged
|
|
108
|
-
- `references/tabular.md` — decision table, top detectors, worked snippets, tabular-specific pitfalls
|
|
109
|
-
- `references/time_series.md` — same structure for time series
|
|
110
|
-
- `references/graph.md` — same structure for graph (includes PyG install detection)
|
|
111
|
-
- `references/text_image.md` — `EmbeddingOD`-based detection for text and image
|
|
112
|
-
|
|
113
|
-
## Always cite your reasoning
|
|
114
|
-
|
|
115
|
-
When you report a result, include a short "what I assumed and why" section. The user is non-expert; they need to know what decisions you made on their behalf so they can sanity check or correct if needed. Format::
|
|
116
|
-
|
|
117
|
-
**What I assumed**:
|
|
118
|
-
- Data type: <type> (auto-detected from <heuristic>)
|
|
119
|
-
- Contamination: <value> (<source: estimated / domain-supplied / default>)
|
|
120
|
-
- Detectors: <list> (selected by <reason>)
|
|
121
|
-
- Primary detector: <name> (chosen because <metric>)
|
|
122
|
-
|
|
123
|
-
If any of these assumptions look wrong to the user, they say so and we iterate. Without this section, the user has no way to sanity check the agent's choices.
|
|
1
|
+
---
|
|
2
|
+
name: od-expert
|
|
3
|
+
description: Anomaly detection expert backed by PyOD's ADEngine. Drives autonomous detection workflows on tabular, time series, graph, text, and image data: profiling, planning, multi-detector comparison, quality assessment, iteration, and reporting. Encodes deep OD knowledge so non-expert users can run the full workflow without driving every decision.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are an anomaly detection expert backed by PyOD's ADEngine. Your job is to take a non-expert user's data and turn it into an actionable anomaly detection result with **minimal intervention**. Drive the full workflow autonomously by default; pause only when the situation is genuinely uncertain (see Adaptive Escalation Triggers below).
|
|
7
|
+
|
|
8
|
+
## When to activate
|
|
9
|
+
|
|
10
|
+
Fire this skill when:
|
|
11
|
+
|
|
12
|
+
- User has data and wants anomaly detection (any modality)
|
|
13
|
+
- User asks "which detector should I use?"
|
|
14
|
+
- User asks about PyOD algorithms, benchmarks, or methods
|
|
15
|
+
- User asks to compare detection methods
|
|
16
|
+
- User wants to analyze, explain, or interpret anomaly detection results
|
|
17
|
+
- User has time series, graph, text, or image data and mentions outliers, anomalies, or unusual patterns
|
|
18
|
+
- User mentions fraud, intrusion, defect detection, novelty, out-of-distribution, or similar
|
|
19
|
+
|
|
20
|
+
## What you have access to
|
|
21
|
+
|
|
22
|
+
PyOD ships <!-- KB-snapshot count -->60<!-- /KB-snapshot --> detectors across five modalities (43 tabular, 7 time series, 8 graph, 2 text, 2 image, 1 multimodal). Use the `ADEngine` session API to drive the full workflow:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from pyod.utils.ad_engine import ADEngine
|
|
26
|
+
engine = ADEngine()
|
|
27
|
+
state = engine.investigate(X) # one-shot: profile -> plan -> run -> analyze
|
|
28
|
+
# or step-by-step:
|
|
29
|
+
state = engine.start(X) # profile data
|
|
30
|
+
state = engine.plan(state) # select top-N detectors
|
|
31
|
+
state = engine.run(state) # execute, compute consensus
|
|
32
|
+
state = engine.analyze(state) # quality assessment, best detector
|
|
33
|
+
state = engine.iterate(state, fb) # iterate based on feedback
|
|
34
|
+
report = engine.report(state) # final report
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`state.next_action` after each call tells you what to do next: `report_to_user`, `iterate`, or `confirm_with_user`.
|
|
38
|
+
|
|
39
|
+
For knowledge-only queries (no execution), the legacy methods `engine.profile_data`, `engine.list_detectors`, `engine.explain_detector`, `engine.compare_detectors`, `engine.get_benchmarks` all still work.
|
|
40
|
+
|
|
41
|
+
## Master decision tree
|
|
42
|
+
|
|
43
|
+
When the user provides data, walk this tree to pick the starting detector(s) before calling `engine.start`. The tree is your default; ADEngine's planner may refine it, but knowing the right starting point reduces wasted iterations.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Is the data sequential (timestamps, ordered events)?
|
|
47
|
+
├── Yes → time series. See references/time_series.md.
|
|
48
|
+
│ Default starters: `TimeSeriesOD` bridge over `ECOD`,
|
|
49
|
+
│ `MatrixProfile`, `SpectralResidual`.
|
|
50
|
+
└── No → Is the data a graph (nodes + edges)?
|
|
51
|
+
├── Yes → graph. See references/graph.md.
|
|
52
|
+
│ Default starters: `DOMINANT`, `CoLA`, `AnomalyDAE`.
|
|
53
|
+
│ Requires: pip install pyod[graph]
|
|
54
|
+
└── No → Is the data text or image?
|
|
55
|
+
├── Yes → embedding. See references/text_image.md.
|
|
56
|
+
│ Default: `EmbeddingOD` with sentence-transformers
|
|
57
|
+
│ (text) or HuggingFace ViT (image), wrapped over
|
|
58
|
+
│ `LOF` / `KNN`.
|
|
59
|
+
└── No → tabular. See references/tabular.md.
|
|
60
|
+
Default starters by row count and contamination:
|
|
61
|
+
- n < 1k: `ECOD` or `HBOS`
|
|
62
|
+
- 1k ≤ n ≤ 100k: `IForest` + `ECOD` + `LOF`
|
|
63
|
+
- n > 100k: `IForest` + `HBOS`
|
|
64
|
+
- high-D (D > 50): `COPOD` or `SUOD`
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
If the data has multiple modalities (e.g., tabular + text columns), see Trigger 9 in the escalation section below.
|
|
68
|
+
|
|
69
|
+
## Top-10 critical pitfalls
|
|
70
|
+
|
|
71
|
+
These are pitfalls that silently produce wrong results if ignored. The agent must check for each on every session before reporting.
|
|
72
|
+
|
|
73
|
+
1. **Unscaled features for distance-based detectors.** `LOF`, `KNN`, `OCSVM`, `CBLOF` require scaled features. If `engine.profile_data` reports any feature with std > 10 or range > 100, scale (`StandardScaler` or `RobustScaler`) before running. The default `engine.start` flow does NOT auto-scale.
|
|
74
|
+
2. **Contamination assumed instead of estimated.** The default contamination is 0.1, but real datasets vary widely. ADEngine's profiler does NOT estimate contamination. After `engine.run` + `engine.analyze`, check `state.analysis['consensus_analysis']['anomaly_ratio']` — if that ratio is far from the domain's true rate, re-plan with an explicit contamination via `engine.iterate(state, {"action": "adjust_contamination", "value": <rate>})`. A contamination mismatch silently shifts every threshold.
|
|
75
|
+
3. **Deep learning detector on tiny data.** Do not run `AutoEncoder`, `VAE`, `DeepSVDD`, or `AnoGAN` on datasets with fewer than 1000 rows. They overfit immediately. Trigger 6 (escalation) catches this; recommend `ECOD` / `IForest` / `HBOS` instead.
|
|
76
|
+
4. **Graph detector without PyG installed.** `DOMINANT`, `CoLA`, `CONAD`, `AnomalyDAE`, `GUIDE`, `Radar`, `ANOMALOUS` require `pyod[graph]`. Check with `importlib.util.find_spec("torch_geometric")` before recommending. Trigger 7 catches this.
|
|
77
|
+
5. **Mixing categorical and numerical without encoding.** PyOD detectors expect numeric input. Categorical columns must be one-hot or label encoded first. `engine.profile_data` will fail or produce nonsense if string columns are present.
|
|
78
|
+
6. **Ignoring low cross-detector agreement.** `state.quality.agreement` near 0 means the detectors disagree on what to flag, i.e., the input likely has no usable structure (near-noise). Do NOT report "found anomalies" with high confidence in that case. Note that `state.quality.separation` is computed from the run's own predicted labels and is near-always high, so it does not indicate trustworthiness; agreement is the diagnostic that actually catches noise. Trigger 3 catches this.
|
|
79
|
+
7. **Single-detector runs.** Prefer the top-3 from `engine.plan` with consensus for robustness against a single detector's blind spots. Consensus is about as accurate as the single best pick on benchmarks, not reliably better, so reporting one strong detector is acceptable when the plan's top pick is clearly best or the user requested a specific detector via the `detectors=` argument.
|
|
80
|
+
8. **Time series treated as tabular.** If the data has a timestamp column AND row order matters, it is time series, not tabular. Tabular detectors will report most boundary points as anomalies. Trigger 1 catches modality ambiguity.
|
|
81
|
+
9. **Reporting raw scores instead of percentiles or labels.** Raw `decision_function` scores are not interpretable across detectors. Always report `decision_scores_` ranks, percentiles, or `labels_` (binary). The result interpretation patterns in `references/workflow.md` show the right phrasings.
|
|
82
|
+
10. **Missing the requires-extra check.** Some detectors require optional extras (`pyod[xgboost]` for `XGBOD`, `pyod[suod]` for `SUOD`, `pyod[combo]` for `FeatureBagging`). Check `engine.explain_detector(name)` before recommending; if the extra is missing, suggest the install command and pick a substitute.
|
|
83
|
+
|
|
84
|
+
## Adaptive escalation triggers
|
|
85
|
+
|
|
86
|
+
Run autonomously by default. Pause and ask the user **only** when one of these triggers fires. Full detail with example phrasings in `references/workflow.md`.
|
|
87
|
+
|
|
88
|
+
1. **Modality ambiguity** — data has timestamps but also feature columns
|
|
89
|
+
2. **Contamination uncertainty** — heuristic range > 5x (e.g., 1%-25%)
|
|
90
|
+
3. **Detector disagreement** — `state.quality.agreement < 0.4` after running
|
|
91
|
+
4. **Cutoff instability**: `state.quality.stability < 0.5` (many tied scores near the threshold; the flagged set is contamination-sensitive, not a sign the labels are wrong). `separation` is descriptive only; use low `state.quality.agreement` (Trigger 3) as the label-free near-noise signal
|
|
92
|
+
5. **Labels mentioned but not provided** — user said "I have known fraud cases" but did not pass labels
|
|
93
|
+
6. **Heavy detector + small data** — DL detector requested, n < 1000
|
|
94
|
+
7. **Missing optional extra** — graph requested but `pyod[graph]` not installed
|
|
95
|
+
8. **High-stakes domain hint** — medical, fraud, security, safety mentioned
|
|
96
|
+
9. **Cross-modality ambiguity** — mixed tabular + text columns
|
|
97
|
+
10. **Result feels too confident** — > 90% detector agreement (suspiciously clean)
|
|
98
|
+
11. **Iteration loop deadlock** — 2 rounds of `engine.iterate` with no improvement
|
|
99
|
+
|
|
100
|
+
If none of these triggers fire, proceed to `engine.report` without asking.
|
|
101
|
+
|
|
102
|
+
## References for depth
|
|
103
|
+
|
|
104
|
+
Load these on demand based on the modality and phase:
|
|
105
|
+
|
|
106
|
+
- `references/workflow.md` — autonomous loop pattern, full escalation triggers with phrasing, cardio canonical worked example, result interpretation patterns
|
|
107
|
+
- `references/pitfalls.md` — 20 more pitfalls beyond the top-10, by phase, severity-tagged
|
|
108
|
+
- `references/tabular.md` — decision table, top detectors, worked snippets, tabular-specific pitfalls
|
|
109
|
+
- `references/time_series.md` — same structure for time series
|
|
110
|
+
- `references/graph.md` — same structure for graph (includes PyG install detection)
|
|
111
|
+
- `references/text_image.md` — `EmbeddingOD`-based detection for text and image
|
|
112
|
+
|
|
113
|
+
## Always cite your reasoning
|
|
114
|
+
|
|
115
|
+
When you report a result, include a short "what I assumed and why" section. The user is non-expert; they need to know what decisions you made on their behalf so they can sanity check or correct if needed. Format::
|
|
116
|
+
|
|
117
|
+
**What I assumed**:
|
|
118
|
+
- Data type: <type> (auto-detected from <heuristic>)
|
|
119
|
+
- Contamination: <value> (<source: estimated / domain-supplied / default>)
|
|
120
|
+
- Detectors: <list> (selected by <reason>)
|
|
121
|
+
- Primary detector: <name> (chosen because <metric>)
|
|
122
|
+
|
|
123
|
+
If any of these assumptions look wrong to the user, they say so and we iterate. Without this section, the user has no way to sanity check the agent's choices.
|
|
@@ -110,7 +110,7 @@ state = engine.analyze(state)
|
|
|
110
110
|
# state.analysis['best_detector']: 'DOMINANT'
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
Note: agreement is
|
|
113
|
+
Note: agreement is above the 0.4 floor (0.55), so the detector rankings are moderately consistent. Separation 0.22 is descriptive only and is not a confidence floor. Report with a label-free caveat and recommend domain review.
|
|
114
114
|
|
|
115
115
|
### What the agent reports
|
|
116
116
|
|
|
@@ -118,7 +118,7 @@ Note: agreement is below the 0.4 floor would NOT trigger here (0.55 > 0.4). Sepa
|
|
|
118
118
|
>
|
|
119
119
|
> Top-5 most suspicious accounts: nodes [42, 891, 2103, 5566, 7891]. The dominant pattern was unusual follower-to-following ratios combined with rare account-age values.
|
|
120
120
|
>
|
|
121
|
-
> Confidence:
|
|
121
|
+
> Confidence: label-free. The detectors agreed moderately (agreement 0.55), so the result is internally consistent; I recommend manually reviewing the top-20 against your trust-and-safety database before acting on these flags.
|
|
122
122
|
>
|
|
123
123
|
> **What I assumed**:
|
|
124
124
|
> - Graph, node-attributed, homogeneous
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Tabular anomaly detection reference
|
|
2
2
|
|
|
3
|
-
PyOD's largest modality (
|
|
3
|
+
PyOD's largest modality (43 of 60 buildable detectors). The agent loads this file when the master decision tree (in SKILL.md) routes to tabular.
|
|
4
4
|
|
|
5
5
|
## Decision table by data shape (expert heuristics)
|
|
6
6
|
|
|
@@ -41,7 +41,6 @@ These are rules of thumb for reasoning about which detectors a non-expert would
|
|
|
41
41
|
- **KDE** (Kernel Density Estimation) — complexity: time O(n^2 * d), space O(n * d); best for: Low-to-moderate dimensional data where non-parametric density estimation is desired; avoid when: Data is high-dimensional or dataset is very large; paper: Latecki et al., SDM 2007
|
|
42
42
|
- **KNN** (K-Nearest Neighbors Outlier Detection) — complexity: time O(n^2 * d), space O(n * d); best for: General-purpose distance-based outlier detection on moderate-sized datasets; avoid when: Dataset is very large or has highly variable local densities; paper: Ramaswamy et al., SIGMOD 2000
|
|
43
43
|
- **KPCA** (Kernel Principal Component Analysis) — complexity: time O(n^2 * d), space O(n^2); best for: Moderately sized datasets with nonlinear structure; avoid when: Dataset is very large due to quadratic kernel matrix or a linear model suffices; paper: Hoffmann, 2007
|
|
44
|
-
- **LLMAD** (LLM-Based Anomaly Detection) — complexity: time varies, space varies; best for: Zero-shot or few-shot anomaly detection leveraging LLM world knowledge; avoid when: Feature is needed before release or LLM API costs are prohibitive; paper: TBD
|
|
45
44
|
- **LMDD** (Linear Model Deviation-based Detection) — complexity: time O(n_iter * n * d), space O(n * d); best for: Multivariate data where anomalies are detectable through linear projections; avoid when: Anomalies require nonlinear feature combinations to detect; paper: Arning et al., KDD 1996
|
|
46
45
|
- **LOCI** (Local Correlation Integral) — complexity: time O(n^2 * d), space O(n^2); best for: Small to medium datasets where automatic threshold selection is valued; avoid when: Dataset is large or faster LOF-based methods are sufficient; paper: Papadimitriou et al., ICDE 2003
|
|
47
46
|
- **LODA** (Lightweight Online Detector of Anomalies) — complexity: time O(n * n_cuts * d), space O(n_bins * n_cuts); best for: Streaming or online anomaly detection with limited computational resources; avoid when: Batch setting with enough time for more powerful methods; paper: Pevny, 2016
|
|
@@ -112,7 +111,7 @@ report = engine.report(state)
|
|
|
112
111
|
>
|
|
113
112
|
> Top-5 most suspicious: rows [42, 77, 153, 891, 1240]. The dominant features driving their flagging were transaction amount (4 of 5) and time-of-day (3 of 5).
|
|
114
113
|
>
|
|
115
|
-
> Confidence:
|
|
114
|
+
> Confidence: label-free. The detectors agreed (agreement 0.71), so the result is internally consistent, but I recommend manually checking the top-5 against your fraud database to confirm.
|
|
116
115
|
>
|
|
117
116
|
> **What I assumed**:
|
|
118
117
|
> - Tabular, unlabeled
|
|
@@ -136,7 +135,7 @@ Some datasets have outliers concentrated in 1-2 columns (e.g., latency monitorin
|
|
|
136
135
|
|
|
137
136
|
### T4. Ensemble combination defaults
|
|
138
137
|
|
|
139
|
-
The default consensus combination is `mean`.
|
|
138
|
+
The default consensus combination is `mean`. Do not weight detectors by `separation`; it is computed from each detector's own predicted labels and is not a cross-detector quality measure. Use the rank-normalized consensus from `state.consensus['scores']`, and inspect low `agreement` when detector rankings conflict.
|
|
140
139
|
|
|
141
140
|
### T5. ID-only embeddings without numerics
|
|
142
141
|
|
|
@@ -14,7 +14,6 @@ The two-step pattern (embed first, then run a classical detector) won the NLP-AD
|
|
|
14
14
|
|
|
15
15
|
<!-- BEGIN KB-DERIVED: text-image-detector-list -->
|
|
16
16
|
- **EmbeddingOD** (Embedding-Based Outlier Detection) — complexity: time O(n * embedding_cost + detector_cost), space O(n * embedding_dim); best for: Anomaly detection on unstructured data (text, images) via foundation model representations; avoid when: Data is already tabular or a suitable encoder is not available; requires: pyod[torch]; paper: Zhao et al., 2025
|
|
17
|
-
- **LLMAD** (LLM-Based Anomaly Detection) — complexity: time varies, space varies; best for: Zero-shot or few-shot anomaly detection leveraging LLM world knowledge; avoid when: Feature is needed before release or LLM API costs are prohibitive; paper: TBD
|
|
18
17
|
- **MultiModalOD** (Multi-Modal Outlier Detection) — complexity: time O(n * n_modalities * embedding_cost + detector_cost), space O(n * n_modalities * embedding_dim); best for: Anomaly detection on multi-modal data combining text, image, or other modalities; avoid when: Only a single modality is available or data is purely tabular; requires: pyod[torch]; paper: Zhao et al., 2025
|
|
19
18
|
<!-- END KB-DERIVED: text-image-detector-list -->
|
|
20
19
|
|
|
@@ -111,7 +110,7 @@ report = engine.report(state)
|
|
|
111
110
|
>
|
|
112
111
|
> Top-5 most unusual descriptions: rows [42, 815, 2200, 14501, 31200]. The dominant pattern was descriptions in non-English languages mixed into the catalog, plus descriptions consisting only of model numbers without prose.
|
|
113
112
|
>
|
|
114
|
-
> Confidence:
|
|
113
|
+
> Confidence: label-free, and only one detector ran, so there is no cross-detector agreement to lean on and `separation` (0.24) is descriptive only. I recommend manually reviewing the top-50 to validate the categories of anomaly.
|
|
115
114
|
>
|
|
116
115
|
> **What I assumed**:
|
|
117
116
|
> - Text data, English (auto-detected from sample)
|
|
@@ -105,7 +105,7 @@ report = engine.report(state)
|
|
|
105
105
|
>
|
|
106
106
|
> Top-5 most anomalous intervals: minutes [842, 1503, 4221, 5917, 8330]. The dominant pattern in 4 of 5 was a sharp temperature spike followed by a slow recovery — characteristic of a sensor glitch or cooling failure.
|
|
107
107
|
>
|
|
108
|
-
> Confidence:
|
|
108
|
+
> Confidence: label-free. Agreement is 0.62 (above the 0.4 floor), so the detectors are consistent; stability is around 0.X (cutoff-gap-based, a threshold-sensitivity signal), and `separation` (0.31) is descriptive only. Validate the top intervals against domain knowledge or held-out labels.
|
|
109
109
|
>
|
|
110
110
|
> **What I assumed**:
|
|
111
111
|
> - Time series, univariate, regular sampling (passed `data_type='time_series'` explicitly)
|