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.
Files changed (131) hide show
  1. {pyod-3.5.2/pyod.egg-info → pyod-3.5.4}/PKG-INFO +6 -6
  2. {pyod-3.5.2 → pyod-3.5.4}/README.rst +4 -4
  3. {pyod-3.5.2 → pyod-3.5.4}/pyod/cli.py +8 -2
  4. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/SKILL.md +123 -123
  5. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/graph.md +2 -2
  6. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/tabular.md +3 -4
  7. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/text_image.md +1 -2
  8. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/time_series.md +1 -1
  9. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/workflow.md +237 -237
  10. pyod-3.5.4/pyod/utils/_llm.py +267 -0
  11. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_quality_metrics.py +505 -500
  12. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/ad_engine.py +338 -7
  13. {pyod-3.5.2 → pyod-3.5.4}/pyod/version.py +23 -23
  14. {pyod-3.5.2 → pyod-3.5.4/pyod.egg-info}/PKG-INFO +6 -6
  15. {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/SOURCES.txt +1 -0
  16. {pyod-3.5.2 → pyod-3.5.4}/pyproject.toml +1 -1
  17. {pyod-3.5.2 → pyod-3.5.4}/LICENSE +0 -0
  18. {pyod-3.5.2 → pyod-3.5.4}/MANIFEST.in +0 -0
  19. {pyod-3.5.2 → pyod-3.5.4}/pyod/__init__.py +0 -0
  20. {pyod-3.5.2 → pyod-3.5.4}/pyod/mcp_server.py +0 -0
  21. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/__init__.py +0 -0
  22. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/_pyg_utils.py +0 -0
  23. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/_ts_utils.py +0 -0
  24. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/abod.py +0 -0
  25. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ae1svm.py +0 -0
  26. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/alad.py +0 -0
  27. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/anogan.py +0 -0
  28. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/auto_encoder.py +0 -0
  29. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/base.py +0 -0
  30. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/base_dl.py +0 -0
  31. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cblof.py +0 -0
  32. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cd.py +0 -0
  33. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/cof.py +0 -0
  34. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/combination.py +0 -0
  35. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/copod.py +0 -0
  36. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/deep_svdd.py +0 -0
  37. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/devnet.py +0 -0
  38. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/dif.py +0 -0
  39. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ecod.py +0 -0
  40. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/embedding.py +0 -0
  41. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/feature_bagging.py +0 -0
  42. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/gaal_base.py +0 -0
  43. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/gmm.py +0 -0
  44. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/hbos.py +0 -0
  45. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/hdbscan.py +0 -0
  46. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/iforest.py +0 -0
  47. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/inne.py +0 -0
  48. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/kde.py +0 -0
  49. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/knn.py +0 -0
  50. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/kpca.py +0 -0
  51. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lmdd.py +0 -0
  52. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/loci.py +0 -0
  53. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/loda.py +0 -0
  54. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lof.py +0 -0
  55. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lscp.py +0 -0
  56. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/lunar.py +0 -0
  57. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mad.py +0 -0
  58. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mcd.py +0 -0
  59. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/mo_gaal.py +0 -0
  60. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ocsvm.py +0 -0
  61. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pca.py +0 -0
  62. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_anomalous.py +0 -0
  63. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_anomalydae.py +0 -0
  64. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_cola.py +0 -0
  65. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_conad.py +0 -0
  66. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_dominant.py +0 -0
  67. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_guide.py +0 -0
  68. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_radar.py +0 -0
  69. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/pyg_scan.py +0 -0
  70. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/qmcd.py +0 -0
  71. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/rgraph.py +0 -0
  72. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/rod.py +0 -0
  73. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sampling.py +0 -0
  74. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sklearn_base.py +0 -0
  75. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/so_gaal.py +0 -0
  76. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/so_gaal_new.py +0 -0
  77. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sod.py +0 -0
  78. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/sos.py +0 -0
  79. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/suod.py +0 -0
  80. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/thresholds.py +0 -0
  81. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_anomaly_transformer.py +0 -0
  82. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_kshape.py +0 -0
  83. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_lstm.py +0 -0
  84. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_matrix_profile.py +0 -0
  85. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_od.py +0 -0
  86. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_sand.py +0 -0
  87. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/ts_spectral_residual.py +0 -0
  88. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/vae.py +0 -0
  89. {pyod-3.5.2 → pyod-3.5.4}/pyod/models/xgbod.py +0 -0
  90. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/__init__.py +0 -0
  91. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/__init__.py +0 -0
  92. {pyod-3.5.2 → pyod-3.5.4}/pyod/skills/od_expert/references/pitfalls.md +0 -0
  93. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/__init__.py +0 -0
  94. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_detector_factory.py +0 -0
  95. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_kb_router.py +0 -0
  96. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/_nl_feedback.py +0 -0
  97. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/auto_model_selector.py +0 -0
  98. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/data.py +0 -0
  99. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/__init__.py +0 -0
  100. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/huggingface.py +0 -0
  101. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/openai_encoder.py +0 -0
  102. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/encoders/sentence_transformer.py +0 -0
  103. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/example.py +0 -0
  104. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/investigation.py +0 -0
  105. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/__init__.py +0 -0
  106. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/algorithms.json +0 -0
  107. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/benchmarks.json +0 -0
  108. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/papers.json +0 -0
  109. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/knowledge/routing_rules.json +0 -0
  110. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AE1SVM.json +0 -0
  111. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/ALAD.json +0 -0
  112. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AnoGAN.json +0 -0
  113. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/AutoEncoder.json +0 -0
  114. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/Deep SVDD.json +0 -0
  115. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/DevNet.json +0 -0
  116. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/LUNAR.json +0 -0
  117. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/MO-GAAL.json +0 -0
  118. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/SO-GAAL.json +0 -0
  119. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/VAE.json +0 -0
  120. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/model_analysis_jsons/__init__.py +0 -0
  121. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/persistence.py +0 -0
  122. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/stat_models.py +0 -0
  123. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/torch_utility.py +0 -0
  124. {pyod-3.5.2 → pyod-3.5.4}/pyod/utils/utility.py +0 -0
  125. {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/dependency_links.txt +0 -0
  126. {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/entry_points.txt +0 -0
  127. {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/requires.txt +0 -0
  128. {pyod-3.5.2 → pyod-3.5.4}/pyod.egg-info/top_level.txt +0 -0
  129. {pyod-3.5.2 → pyod-3.5.4}/requirements.txt +0 -0
  130. {pyod-3.5.2 → pyod-3.5.4}/setup.cfg +0 -0
  131. {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.2
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.
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+ detectors across **tabular, time series, graph, text, and image** data, one API
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 intelligent 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.
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`` (intelligent 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.
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 intelligent orchestration.
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+ detectors across **tabular, time series, graph, text, and image** data, one API
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 intelligent 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.
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`` (intelligent 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.
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 intelligent orchestration.
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
- for algo in engine.kb.algorithms.values():
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(engine.kb.algorithms)
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 — profiling, planning, multi-detector comparison, quality assessment, iteration, and reporting. Encodes deep OD knowledge so non-expert users get expert-quality results 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 -->61<!-- /KB-snapshot --> detectors across five modalities (44 tabular, 7 time series, 8 graph, 3 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 `state.quality.separation`.** Separation < 0.1 means the consensus is essentially noise. Do NOT report "found anomalies" with high confidence in that case. Trigger 4 catches this.
79
- 7. **Single-detector runs.** Never report from a single detector. Always run the top-3 from `engine.plan` and use consensus. The exception is when the user explicitly 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. **Quality assessment weak** — `state.quality.separation < 0.1` OR `state.quality.stability < 0.5`
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 below the 0.4 floor would NOT trigger here (0.55 > 0.4). Separation 0.22 is just above the 0.1 critical floor — moderate confidence. Report with a hedge.
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: medium. Separation is 0.22 (above the 0.1 floor, but not strong), so I recommend manually reviewing the top-20 against your trust-and-safety database before acting on these flags.
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 (44 of 61 detectors). The agent loads this file when the master decision tree (in SKILL.md) routes to tabular.
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: medium. Separation is moderate (0.28), so I recommend manually checking the top-5 against your fraud database.
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`. For very imbalanced detector quality, `weighted_mean` (weighted by separation) can be better. Mitigation: ADEngine handles this if you use `engine.run` directly. Do not bypass.
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: medium. Separation is 0.24 (above the 0.1 floor, but moderate), so I recommend manually reviewing the top-50 to validate the categories of anomaly.
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: medium-high. Separation is 0.31 (above the 0.2 floor), agreement is 0.62 (above the 0.4 floor), stability is around 0.X (cutoff-gap-based).
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)