{"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/generative-semi-supervised-graph-anomaly","title":"Generative Semi-supervised Graph Anomaly Detection","arxiv_id":"2402.11887","date":"2024-02-19","proceeding":null,"authors":["Hezhe Qiao","Qingsong Wen","XiaoLi Li","Ee-Peng Lim","Guansong Pang"],"abstract":"This work considers a practical semi-supervised graph anomaly detection (GAD) scenario, where part of the nodes in a graph are known to be normal, contrasting to the extensively explored unsupervised setting with a fully unlabeled graph. We reveal that having access to the normal nodes, even just a small percentage of normal nodes, helps enhance the detection performance of existing unsupervised GAD methods when they are adapted to the semi-supervised setting. However, their utilization of these normal nodes is limited. In this paper, we propose a novel Generative GAD approach (namely GGAD) for the semi-supervised scenario to better exploit the normal nodes. The key idea is to generate pseudo anomaly nodes, referred to as 'outlier nodes', for providing effective negative node samples in training a discriminative one-class classifier. The main challenge here lies in the lack of ground truth information about real anomaly nodes. To address this challenge, GGAD is designed to leverage two important priors about the anomaly nodes -- asymmetric local affinity and egocentric closeness -- to generate reliable outlier nodes that assimilate anomaly nodes in both graph structure and feature representations. Comprehensive experiments on six real-world GAD datasets are performed to establish a benchmark for semi-supervised GAD and show that GGAD substantially outperforms state-of-the-art unsupervised and semi-supervised GAD methods with varying numbers of training normal nodes. Code will be made available at https://github.com/mala-lab/GGAD.","url_abs":"https://arxiv.org/abs/2402.11887v7","url_pdf":"https://arxiv.org/pdf/2402.11887v7.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":"generative-semi-supervised-graph-anomaly","repo_url":"https://github.com/mala-lab/ggad","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":"graph-anomaly-detection","task_name":"Graph Anomaly Detection"},{"task_slug":"one-class-classifier","task_name":"One-class classifier"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2402.11887","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2402.11887"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+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":"deterministic:regex_extraction","url":"https://github.com/pygod-team/pygod","reach":null},{"provenance":"deterministic:regex_extraction","url":"https://github.com/mala-lab/GGAD","reach":{"status":"ok"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/mala-lab/ggad","reach":{"status":"ok"}}],"summary":{"ran":9,"ran_fixture":1,"ran_honours":1,"unverified":8},"by_repo_kind":{"official":{"samples":14,"ran":9,"repositories":1},"found_in_text":{"samples":5,"ran":2,"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":14,"samples":[{"code_sha256_prefix":"97fd9c96e296f10d","entry":"AvgReadout","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"97fd9c96e296f10d"}},{"code_sha256_prefix":"4b7926c71f580f82","entry":"Discriminator","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4b7926c71f580f82"}},{"code_sha256_prefix":"db2224755aa6cbca","entry":"GAANBase","repo":"pygod-team/pygod","repo_kind":"found_in_text","path":"pygod/detector/gaan.py","file_url":"https://github.com/pygod-team/pygod/blob/HEAD/pygod/detector/gaan.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-2-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"db2224755aa6cbca"}},{"code_sha256_prefix":"02c6a5361e2291b2","entry":"GCN","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"02c6a5361e2291b2"}},{"code_sha256_prefix":"52859d7e7894cf5a","entry":"MaxReadout","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"52859d7e7894cf5a"}},{"code_sha256_prefix":"b0574c4dc72c52d7","entry":"MinReadout","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b0574c4dc72c52d7"}},{"code_sha256_prefix":"fdec68da5b0533c4","entry":"Model","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.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":"fdec68da5b0533c4"}},{"code_sha256_prefix":"7d3627fc8e076142","entry":"double_recon_loss","repo":"pygod-team/pygod","repo_kind":"found_in_text","path":"pygod/detector/gaan.py","file_url":"https://github.com/pygod-team/pygod/blob/HEAD/pygod/detector/gaan.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-2-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"7d3627fc8e076142"}},{"code_sha256_prefix":"af0b22bd9efac86b","entry":"min_max_norm","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_tam.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_tam.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"af0b22bd9efac86b"}},{"code_sha256_prefix":"8f1b9d2b492634d4","entry":"neighList_to_edgeList","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_AEGIS.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_AEGIS.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":"8f1b9d2b492634d4"}},{"code_sha256_prefix":"5a685c2a4a645478","entry":"neighList_to_edgeList_train","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_AEGIS.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_AEGIS.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":"5a685c2a4a645478"}},{"code_sha256_prefix":"d8e12c2b23e733b3","entry":"DeepDetector","repo":"pygod-team/pygod","repo_kind":"found_in_text","path":"pygod/detector/gaan.py","file_url":"https://github.com/pygod-team/pygod/blob/HEAD/pygod/detector/gaan.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-2-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"d8e12c2b23e733b3"}},{"code_sha256_prefix":"8275702b147e567e","entry":"Detector","repo":"pygod-team/pygod","repo_kind":"found_in_text","path":"pygod/detector/gaan.py","file_url":"https://github.com/pygod-team/pygod/blob/HEAD/pygod/detector/gaan.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-2-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"8275702b147e567e"}},{"code_sha256_prefix":"31e42a9deeb82cb3","entry":"GAAN","repo":"pygod-team/pygod","repo_kind":"found_in_text","path":"pygod/detector/gaan.py","file_url":"https://github.com/pygod-team/pygod/blob/HEAD/pygod/detector/gaan.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"BSD-2-Clause","inline_ok":true,"mcp_get_code":{"code_sha256":"31e42a9deeb82cb3"}},{"code_sha256_prefix":"83dbc56de1da4882","entry":"WSReadout","repo":"mala-lab/ggad","repo_kind":"official","path":"model.py","file_url":"https://github.com/mala-lab/ggad/blob/HEAD/model.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":"83dbc56de1da4882"}},{"code_sha256_prefix":"57f1891eafdf482a","entry":"get_cos","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_tam.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_tam.py","link_basis":"plan_row","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":"57f1891eafdf482a"}},{"code_sha256_prefix":"7290fd3be1378160","entry":"loss_func","repo":"mala-lab/GGAD","repo_kind":"official","path":"ocgnn.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/ocgnn.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":"7290fd3be1378160"}},{"code_sha256_prefix":"5f69b7946c674637","entry":"neighList_to_edgeList","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_tam.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_tam.py","link_basis":"plan_row","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":"5f69b7946c674637"}},{"code_sha256_prefix":"e5c33eda8d8c16f9","entry":"neighList_to_edgeList","repo":"mala-lab/GGAD","repo_kind":"official","path":"model_AnomalyDAE.py","file_url":"https://github.com/mala-lab/GGAD/blob/HEAD/model_AnomalyDAE.py","link_basis":"plan_row","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":"e5c33eda8d8c16f9"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}