{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/unraveling-the-anomaly-in-time-series-anomaly","title":"Unraveling the \"Anomaly\" in Time Series Anomaly Detection: A Self-supervised Tri-domain Solution","arxiv_id":"2311.11235","date":"2023-11-19","proceeding":null,"authors":["Yuting Sun","Guansong Pang","Guanhua Ye","Tong Chen","Xia Hu","Hongzhi Yin"],"abstract":"The ongoing challenges in time series anomaly detection (TSAD), notably the scarcity of anomaly labels and the variability in anomaly lengths and shapes, have led to the need for a more efficient solution. As limited anomaly labels hinder traditional supervised models in TSAD, various SOTA deep learning techniques, such as self-supervised learning, have been introduced to tackle this issue. However, they encounter difficulties handling variations in anomaly lengths and shapes, limiting their adaptability to diverse anomalies. Additionally, many benchmark datasets suffer from the problem of having explicit anomalies that even random functions can detect. This problem is exacerbated by ill-posed evaluation metrics, known as point adjustment (PA), which can result in inflated model performance. In this context, we propose a novel self-supervised learning based Tri-domain Anomaly Detector (TriAD), which addresses these challenges by modeling features across three data domains - temporal, frequency, and residual domains - without relying on anomaly labels. Unlike traditional contrastive learning methods, TriAD employs both inter-domain and intra-domain contrastive loss to learn common attributes among normal data and differentiate them from anomalies. Additionally, our approach can detect anomalies of varying lengths by integrating with a discord discovery algorithm. It is worth noting that this study is the first to reevaluate the deep learning potential in TSAD, utilizing both rigorously designed datasets (i.e., UCR Archive) and evaluation metrics (i.e., PA%K and affiliation). Through experimental results on the UCR dataset, TriAD achieves an impressive three-fold increase in PA%K based F1 scores over SOTA deep learning models, and 50% increase of accuracy as compared to SOTA discord discovery algorithms.","url_abs":"https://arxiv.org/abs/2311.11235v2","url_pdf":"https://arxiv.org/pdf/2311.11235v2.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"unraveling-the-anomaly-in-time-series-anomaly","repo_url":"https://github.com/pseudo-skye/triad","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok"}}],"tasks":[{"task_slug":"anomaly-detection","task_name":"Anomaly Detection"},{"task_slug":"contrastive-learning","task_name":"Contrastive Learning"},{"task_slug":"self-supervised-learning","task_name":"Self-Supervised Learning"},{"task_slug":"time-series-1","task_name":"Time Series"},{"task_slug":"time-series-anomaly-detection","task_name":"Time Series Anomaly Detection"}],"methods":[{"method_slug":"contrastive-learning","method_name":"Contrastive Learning"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2311.11235","atlas_url":"https://app.syntology.ai/?focus=2311.11235","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2311.11235"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/pseudo-skye/triad","reach":{"status":"ok"}}],"summary":{"ran":8,"ran_draft_wrong":1,"unverified":1},"by_repo_kind":{"official":{"samples":10,"ran":9,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":10,"samples":[{"code_sha256_prefix":"b5de254351f61821","entry":"cross_domain_loss","repo":"pseudo-skye/triad","repo_kind":"official","path":"model/losses.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/model/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b5de254351f61821"}},{"code_sha256_prefix":"4f7a3224619523af","entry":"f1_prec_recall_PA","repo":"pseudo-skye/triad","repo_kind":"official","path":"utils/eval_metrics.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/utils/eval_metrics.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4f7a3224619523af"}},{"code_sha256_prefix":"aaf5063a393e9d69","entry":"gen_jitering","repo":"pseudo-skye/triad","repo_kind":"official","path":"utils/transformation.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/utils/transformation.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"aaf5063a393e9d69"}},{"code_sha256_prefix":"c399a92b8c91b514","entry":"gen_warping","repo":"pseudo-skye/triad","repo_kind":"official","path":"utils/transformation.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/utils/transformation.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"c399a92b8c91b514"}},{"code_sha256_prefix":"39dbd58aa1415db2","entry":"intra_domain_loss","repo":"pseudo-skye/triad","repo_kind":"official","path":"model/losses.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/model/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"39dbd58aa1415db2"}},{"code_sha256_prefix":"594207c490bbfb28","entry":"load_anomaly","repo":"pseudo-skye/triad","repo_kind":"official","path":"preprocess_data.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/preprocess_data.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"594207c490bbfb28"}},{"code_sha256_prefix":"645d1fdb1dc0e80c","entry":"pkl_load","repo":"pseudo-skye/triad","repo_kind":"official","path":"preprocess_data.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/preprocess_data.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"645d1fdb1dc0e80c"}},{"code_sha256_prefix":"8a470edda0be82fc","entry":"timedelta_to_seconds","repo":"pseudo-skye/triad","repo_kind":"official","path":"shortest_62.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/shortest_62.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8a470edda0be82fc"}},{"code_sha256_prefix":"6d4da255605157eb","entry":"ts_loss","repo":"pseudo-skye/triad","repo_kind":"official","path":"model/losses.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/model/losses.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"6d4da255605157eb"}},{"code_sha256_prefix":"4cac904d3f127d83","entry":"f1_prec_recall_K","repo":"pseudo-skye/triad","repo_kind":"official","path":"utils/eval_metrics.py","file_url":"https://github.com/pseudo-skye/triad/blob/HEAD/utils/eval_metrics.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4cac904d3f127d83"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}