幸福社区有位干了二十年的安保队长李大伯。他巡逻从不只看“谁长得像坏人”,而是盯着一张巨大的关系网:谁和谁是朋友、谁家半夜常有生客进出、谁突然跟几个陌生社区的人打得火热。在这张网里,大多数人过着规律的生活,形成一种“正常的气息”;而真正的可疑分子,总会留下关系上的破绽——要么往来的对象太杂,要么作息偏离整栋楼太远,要么和一小撮人神秘地互相关联。 图异常检测,就是教机器像李大伯一样“看关系网抓人”。它把现实世界变成一张图:人是节点,往来是边,行为特征是节点的“作息表”。机器先学会“正常社区长什么样”,再挨家挨户地核对:谁偏离得最远,谁就最可疑。这套本事已经用在银行反洗钱、平台揪水军、网络防入侵等实战战场上。
掌握图异常检测,等于给你的模型装上“关系视角”:不再只看单点特征,而是从网络结构中自动揪出异常账户、团伙和攻击行为,这是风控与安全工程师的硬核竞争力。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
基于重构误差的检测:自编码器偏离正常模式 节点重构误差排序编码器\u2192低维表示\u2192解码器\u2192重构,正常节点误差低,异常节点误差高节点重构误差排序节点重构误差排序编码器\u2192低维表示\u2192解码器\u2192重构,正常节点误差低,异常节点误差高节点重构误差排序 节点重构误差排序编码器\u2192低维表示\u2192解码器\u2192重构,正常节点误差低,异常节点误差高节点重构误差排序节点重构误差排序编码器\u2192低维表示\u2192解码器\u21...
图异常概述
李大伯过去巡逻靠的是一本“黑名单”:上面的人都是被确认过问题的老面孔。可真正狡猾的可疑分子从来不会把名字写在名单上,他们混在人群里,表面是个普通住户。直到有一天李大伯发现:社区的交友网络本身就是线索——有些人的“关系图谱”和整栋楼格格不入。他这才明白,抓坏人不能只看人,要看人与人之间的那张网。
图异常检测(Graph Anomaly Detection)要做的,就是从图结构 G=(V,E) 和节点属性 X 中,自动找出偏离普遍模式的节点、边或子图。这就像李大伯巡逻时不按名单,而按“关系模式”来观察:谁的行为模式和网络位置明显不正常,谁就值得重点关注。它和传统异常检测最大的区别,就是多了一个“关系”维度。
异常可以发生在三个层级:节点级异常是某个居民本身可疑,边级异常是某段往来关系异常,群体级异常则是几个人抱团形成的可疑团伙。输入是图结构和节点上的行为特征,输出是每个单元(节点或边)的异常分数。在图异常检测的形式化定义中,我们最终要找到那些分数超过阈值的节点集合。
1. 节点集合 V:图中所有顶点的集合,比喻为社区里的全体居民。
2. 异常子集 V̂:被判定为异常的节点集合,即李大伯最终锁定的“可疑住户名单”。
3. 分数与阈值:score(v) 是每个节点的可疑分,τ 是警戒线;分数超过警戒线就列入异常集合。
所以李大伯的巡逻方式彻底变了:不再是“查户口”,而是“看关系”。他会重点盯住那些关系模式和社区常态明显不同的住户——这正是图异常检测的核心视角。
数据构建准备
李大伯第一件事不是抓人,而是绘制一张完整的社区关系图:谁住在哪、和谁常来往、各自有什么作息特点。没有这张图,再好的眼力也白搭。同样,图异常检测的第一步永远是把原始数据变成“图”——这一步的质量直接决定后续所有模型的上限。
在图的语言里,居民是节点(node),居民之间的往来是边(edge),而“作息规律、收支波动、访客类型”这类属性就是节点的特征向量。一张图通常用两个矩阵来表示:邻接矩阵 A 记录谁和谁有边,特征矩阵 X 记录每个节点的 d 维行为属性。对于无向无权图,A 是一个 n×n 的 0/1 对称矩阵。
1. 矩阵元素 A_ij:邻接矩阵第 i 行第 j 列的值,表示居民 i 和居民 j 之间是否有来往。
2. 边的条件:当节点 v_i 和 v_j 之间存在一条边(即两人有往来)时取 1。
3. 对角与对称:无向图中 A_ij = A_ji,对角线通常为 0,表示自己与自己不相邻。
有了地图,李大伯才能规划巡逻路线。数据构建的关键在于:特征要能反映“行为偏离”,比如转账频率、联系人群的多样性、作息规律程度。只有把这些行为属性刻画好,机器才能从结构之外再多一条判断“可疑”的依据。
重构误差检测
李大伯判断一个居民是否可疑的土办法是:去问他的邻居们“这人平时怎么活动?”把邻居的描述拼成一张“标准画像”,再和这个人的真实行为对一对——差异越大,越可疑。这就是重构误差检测的朴素版本:用周围人的模式去“重构”这个人,如果根本对不上,说明他不在这个社区的正常模式里。
图异常检测中的重构误差方法把这个土办法变成了可训练的模型。核心思想是“学会正常,偏离即异常”:先用自编码器在节点属性或图结构上学习一个“压缩-还原”的管道,让正常样本能被很好地重建,再用重建误差的大小作为异常分数。最简单的一种重构,就是“邻居平均画像”。
1. 节点特征 x_v:节点 v 的行为特征向量,比如作息、收支、联系人数。
2. 邻居特征均值:把 v 的所有邻居特征取平均,得到一张“社区标准画像”。
3. 误差计算:用二范数的平方衡量真实画像与标准画像之间的差距,差距越大越可疑。
画像对不上的人,就被李大伯列入观察名单。但要注意:如果训练数据里混进了异常节点,自编码器可能把异常模式也“背下来”,导致异常点的重构误差变小——就像李大伯见多了夜归的人,慢慢觉得夜归也正常。这在工程上叫“对异常样本过拟合”,是重构误差方法最需要警惕的坑。
对比学习检测
有些可疑分子聪明得很,行为“看起来正常”,李大伯的画像法失效了。于是他换了个思路:不预设“正常长什么样”,而是问“这个住户和整个社区的场景配合度有多高?”一个人再会伪装,也很难和周围几十户人家的生活方式都严丝合缝。配合度越低,就越可疑。
对比学习(Contrastive Learning)正是这个思路的机器版本。它不学“正常 vs 异常”的边界,而是通过自监督的方式学会一种能力:让每个子图和“它自己”(正样本视角)尽量一致,和“随机噪声/无关场景”(负样本)尽量区分开来。在训练中,模型不断拉近正样本对、推开负样本对,从而学到既能描述局部细节又能理解全局语境的表示。
以对比学习检测框架 CoLA 为例:给定图中的一个子图(比如以某节点为中心的 k 跳邻域),模型要判断这个子图“像不像是这个图里真实存在的场景”。异常子图由于与全局模式不一致,在这个判别任务上会得到显著偏低的得分。
1. 正样本对:z_i 是原始子图的表示,z̃_i 是该子图经过扰动增强后的“自己的另一个视角”,二者应尽量相似。
2. 负样本对:z̃_k 来自其他子图或随机扰动,模型要能区分“自己的视角”和“别人的视角”。
3. 温度系数 τ:控制相似度分布的锐利程度,τ 越小,模型对相似与不相似的判断越极端。
4. InfoNCE 结构:整个式子像一个“找自己”的考试,分子越大损失越小,模型越擅长辨认“这个子图是不是本图的场景”。
李大伯的新巡逻法,本质上是让每个居民和整个社区做一次“匹配度测试”:谁和社区整体磨合得最别扭,谁就是最可疑的人。对比学习让机器也能自己学会做这个测试,而不需要事先定义什么叫做“正常”。
异常评分决策
光说“这人可疑”没用,李大伯要给每户人家打一个 0 到 100 的可疑分,还要规定“多少分以上才出动”——否则满社区都是嫌疑人,巡逻就没法干了。异常评分与决策阶段要解决的,正是“如何让模型的输出变成可执行的名单”。
无论用重构误差还是对比学习,模型最终都会给每个节点产出一个异常分数 score(v)。这个分数可以是重构误差、对比得分,或者是多个信号的加权组合。下一步是设定阈值:常用做法是统计全部节点分数的均值 μ 和标准差 σ,然后取 μ + kσ 作为警戒线(k 通常取 2 或 3)。超过警戒线的节点进入可疑名单,也可以用无监督的 Top-K 筛选,直接取出分数最高的 K 个。
1. 异常分数 s_v:每个节点的可疑分,来源可以是重构误差、对比得分等。
2. 均值 μ:全体节点可疑分的平均水平,相当于社区的“平均可疑度”。
3. 标准差 σ:可疑分的波动幅度,波动越大说明居民之间行为差异越大,警戒线也要相应提高。
4. 警戒系数 k:取 2 或 3,表示“比平均高两个标准差才算可疑”,是一种基于分布的统计判据。
李大伯把“可疑分”贴在了值班室墙上,超过警戒线的才上门谈话。评估这套打分水准时,场上常用 AUC 衡量模型把异常排在正常前面的能力,用 Precision@K 只看前 K 个候选的命中率——毕竟实际业务中,人工审核资源有限,谁排在前面,谁就决定效果。
经典模型实战
李大伯把巡逻方法沉淀成了一套标准化装备:输入社区地图,机器自动输出“可疑分榜单”。真正落到代码层面,有两类经典框架代表了两种路线:DOMINANT 走“重构误差”路线,CoLA 走“对比学习”路线。理解它们,等于把前面几节的知识串成了一条完整的流水线。
DOMINANT(Deep Anomaly Detection on Attributed Networks)是图异常检测的标杆模型。它的结构是“GCN 自编码器”:编码器用两层图卷积(GCN)把邻接矩阵 A 和特征矩阵 X 压缩成隐向量 Z;解码器再用 Z 重建出结构矩阵 Â 和属性矩阵 X̂。训练目标是让重建出的图和原图尽量一致,训练完成后,重建误差最大的节点就是异常节点。
1. 结构重构误差:真实边 A 与重建边 Â 的差异,衡量“这张图的连接关系有没有被模型理解”。
2. 属性重构误差:真实属性 X 与重建属性 X̂ 的差异,衡量“节点的行为特征有没有被还原”。
3. 权重系数 α:在 0 到 1 之间调节“结构重要”还是“属性重要”,一般取 0.5 附近让两者均衡。
4. Frobenius 范数:矩阵版本的“误差平方和”,把每个位置的偏差都算进去再求和。
有了这套“巡逻车”,李大伯一个人就能盯住整个社区。CoLA 则把对比学习引入图异常检测,通过“子图-全局场景匹配”的自监督信号训练,在真实数据集上往往有更稳定的表现。工程实现上,用 PyTorch 加 PyTorch Geometric 搭建 DOMINANT 只需几十行核心代码,推理时把每个节点的重构误差排个序,就得到了可疑名单。
行业应用场景
李大伯的方法很快被推广到了三个更大的“社区”:金融网络、社交网络和网络系统。城市越大,可疑分子越会藏在关系网的深处,单点监控根本盯不过来,而图异常检测恰好擅长从“关系”里发现破绽。
第一个战场是金融反欺诈。交易网络里,节点是账户,边是转账行为。洗钱团伙的特征是“深夜高频、整进整出、资金归集”——这些异常会体现在边的属性(金额、频次、时间)和节点的网络位置(资金汇聚点)上。图异常检测可以实时扫描全量交易图,找出偏离正常资金流模式的账户和交易链。第二个战场是社交平台的垃圾信息检测:水军通常互相关注、抱团刷屏,形成高度密集的异常子图,检测这类团伙比单独封禁一个账号有效得多。第三个战场是网络安全:内网主机之间的流量构成一张图,扫描探测、暴力破解、数据外传都会在图上留下“异常边”的痕迹。
现实中最大的挑战是标签稀缺、图规模大、异常形态多变。落地时通常把重构误差、对比分数和业务规则叠加成一个综合风险分,超过阈值才触发人工审核。
1. 多路信号 s_k(v):第 k 路异常信号对节点 v 的打分,比如结构异常分、属性异常分、业务规则分。
2. 权重 λ_k:各路信号的信任权重,业务方可通过历史案件命中率来标定。
3. 综合风险分 S_v:加权求和的最终可疑分,量纲统一后与阈值比较,决定是否进入人工审核队列。
从城中村安保到城市级防线,图异常检测成了一支“看不见的巡逻队”。它不挑领域,只挑关系图中的不和谐音符——凡是有网络的地方,就有可疑分子在等待被发现。
AI 应用场景
金融反欺诈:洗钱团伙挖掘
阶段:模型训练与实时推理
解决的问题:传统反欺诈依赖单账户规则,比如“单笔转账超 5 万”,但洗钱团伙会把大额资金拆成多笔小额,绕开规则。图异常检测把账户当节点、转账当边,能发现“资金从多个散户汇入一个空壳账户”的归集模式——这种结构性的异常,单看每个账户都发现不了。
具体案例:某支付平台每天有数亿条转账记录。系统在转账图上计算每个节点的“资金出入偏差分”,并结合时间特征(深夜交易占比)和频次特征(单日联系账户数),对重构误差高的账户实时打分。上线后,一个涉及 400 多个账户的洗钱团伙在 3 天内被自动锁定。
社交平台垃圾信息检测:水军团伙锁定
阶段:图特征工程与无监督检测
解决的问题:单个水军账号可以伪装得很像真人,但水军不是孤立存在的——他们必须互相关注、互相评论来提升热度,这就形成了密集的“互关子图”。图异常检测通过对关注关系图建模,找出“局部聚类系数异常高、且发帖行为高度同步”的团伙,一锅端掉,而不是删一个号再养一个号。
具体案例:某内容平台发现一批可疑账号集中在同一时段给同一批帖子点赞,且这些账号之间互相关注率超过 90%。用 CoLA 架构的子图-全局对比打分后,系统锁定了 37 个高度抱团的子图,确认后批量封禁,垃圾内容曝光量下降了 62%。
网络安全:内网异常流量检测
阶段:图构建与异常评分
解决的问题:内网攻击往往表现为“一台主机突然和大量从未通信过的主机建立连接”,比如扫描探测或数据外传。传统 IDS 靠特征规则匹配已知攻击,而图异常检测把主机当节点、五元组流量当边,用边的新颖度(是否首次出现)和节点的连接多样性来打分,能发现没有攻击特征库的未知威胁。
具体案例:某企业内网部署了基于重构误差的流量图检测模型。某天模型报告一个财务系统节点的重构误差飙升至阈值的 4.2 倍,排查发现该主机正持续向外部 IP 传输文件——这正是图异常检测发现的“数据外传”阶段,抢在勒索软件触发前完成了隔离。
Python 演示
import math def build_graph(): """构造社区网络:6x4 网格的普通居民 + 4 个带额外暗连的可疑分子""" n = 24 adj = [[0] * n for _ in range(n)] def link(a, b): adj[a][b] = adj[b][a] = 1 for i in range(n): r, c = divmod(i, 6) if c < 5: link(i, i + 1) if r < 3: link(i, i + 6) anoms = [3, 10, 16, 21] for k, a in enumerate(anoms): for b in anoms[k + 1:]: link(a, b) return adj, anoms def node_features(adj): """构造节点行为特征:4 个维度模拟活跃度/夜出率/陌生接触/收支波动""" n = len(adj) feats = [] for i in range(n): v = [0.0] * 4 for j in range(n): if adj[i][j]: v[0] += 1.0 v[1] += 0.2 + (j % 3) * 0.1 v[2] += 0.3 if j >= 18 else 0.1 v[3] += 0.15 * ((i + j) % 5) feats.append(v) return feats def reconstruct(feats, adj): """重构误差:用邻居特征的平均值预测本节点特征,偏差大则可疑""" n = len(feats) errors = [] for i in range(n): neigh = [j for j in range(n) if adj[i][j]] pred = [0.0] * len(feats[0]) for j in neigh: for d in range(len(pred)): pred[d] += feats[j][d] / len(neigh) err = sum((feats[i][d] - pred[d]) ** 2 for d in range(len(pred))) errors.append(err) return errors def detect(adj): feats = node_features(adj) errors = reconstruct(feats, adj) mean = sum(errors) / len(errors) std = math.sqrt(sum((e - mean) ** 2 for e in errors) / len(errors)) threshold = mean + 1.5 * std suspects = [i for i, e in enumerate(errors) if e > threshold] ranking = sorted(range(len(errors)), key=lambda i: errors[i], reverse=True) return suspects, ranking if __name__ == "__main__": adj, true_anoms = build_graph() suspects, ranking = detect(adj) print("真实可疑分子:", true_anoms) print("检测锁定名单:", suspects) print("异常程度排名:", ranking) hit = len(set(suspects) & set(true_anoms)) print("命中率: {}/{}".format(hit, len(true_anoms)))
adj[a][b] = adj[b][a] = 1建立一条无向边:两位居民之间有往来,矩阵里对称位置都置 1。for b in anoms[k + 1:]让所有可疑分子两两之间建立“暗连”,制造结构上的异常。v[0] += 1.0统计邻居数量,对应“活跃度”这一维行为特征。pred[d] += feats[j][d] / len(neigh)邻居特征取平均,得到这个人的“标准画像”。err = sum((feats[i][d] - pred[d]) ** 2 for d in range(len(pred)))计算真实行为与标准画像的偏差平方和,即重构误差。threshold = mean + 1.5 * std用“平均分 + 1.5 倍标准差”动态设定警戒线,而不是拍脑袋定常数。suspects = [i for i, e in enumerate(errors) if e > threshold]把超过警戒线的节点加入可疑名单。
常见误区
误区很多初学者以为图异常检测和普通分类一样,先标注一批“正常/异常”样本,然后训练一个二分类器就行。但实际业务中异常的标注极其稀缺,而且异常形态千变万化,根本标不全。
正解图异常检测的主流范式是“无监督或自监督”:模型先学习正常模式,再通过偏离程度判断异常。就像李大伯并不认识每一个坏人的长相,他只需知道大多数好人的生活方式,就能发现“和大家都对不上”的人。标注数据最多用于验证和调阈值,而不是训练主模型。
为何常见:因为入门教材都从分类任务讲起,初学者自然把“检测”等价为“分类”,忽略了图异常检测“无标签、学常态、找偏离”的本质。
误区有人认为给每个节点配上一堆行为特征,用传统的孤立森林、DBSCAN 就能做异常检测,何必引入图和 GNN?甚至觉得“图”只是添乱的。
正解图异常检测的价值恰恰在“关系”上。很多异常是结构性的:一个人单独看作息规律、行为正常,但如果他和一群水军账号高度互关、或者和多个空壳公司频繁资金往来,他在图上的位置就异常了。没有邻居信息,这些“关系型异常”完全无法被发现。李大伯的经验是:最可疑的人往往不是长得怪,而是“站在怪的网络位置上”。
为何常见:因为单表数据分析是大多数人的第一经验,图结构需要额外建模成本,容易被当作“锦上添花”而非“核心信息”。
误区有人觉得重构误差方法训练好之后,直接按误差从大到小取前几名就是答案,不需要再考虑阈值、归一化或过拟合问题。
正解直接排序忽略了三件事:一是阈值需要根据误差分布设定(如 μ+kσ),否则无法回答“多高算高”;二是误差尺度在不同图上差异很大,要做归一化;三是如果训练数据里混入异常,模型可能把异常也“学会”,导致误差失效。李大伯的做法是:先看全社区的平均水平,再决定“多反常才算反常”,而不是看到一个有点怪的住户就冲上去。
为何常见:因为重构误差听起来直观——“误差大就异常”——让人误以为不需要再做统计决策,低估了训练数据质量的影响。
误区提到图异常检测,很多人的第一反应是反欺诈、防入侵、揪水军,认为它和“负面场景”强绑定,只和坏蛋有关。
正解异常的本质是“偏离普遍模式”,这既可能是恶意的,也可能是值得关注的正面事件。比如某个帖子在图谱上被异常大量转发,可能是营销水军,也可能是真实热点爆发;某个账户突然连接大量陌生节点,可能是盗号,也可能是权威媒体入驻。企业同时用它做预警和机会发现。李大伯后来也学聪明了:先看“为什么反常”,而不是一上来就抓人。
为何常见:因为教程最爱用“反欺诈”“入侵检测”这类抓坏人案例来吸引人,导致学习者把方法和“恶意场景”画上等号。
面试题
Q1. 在“社区网络”的比喻中,“边”最恰当的对应是什么?
- A.居民的个人兴趣爱好
- B.居民之间的往来关系← 正确答案
- C.居民家的门牌号码
- D.社区监控摄像数量
答案:B。图的边是关系的载体,对应居民之间的往来、转账、关注等联系。个人爱好、门牌号、摄像头都是单个节点自身的属性,无法承载“两个节点之间的联系”这一语义。
Q2. 重构误差法检测异常的核心逻辑是什么?
- A.学习异常样本的特征分布
- B.用邻居特征重建本节点,偏差大则异常← 正确答案
- C.直接比较所有节点的度
- D.随机挑选若干节点做标注
答案:B。重构误差法先学会“正常”:用邻居特征均值拼出标准画像,本人行为与画像偏差越大越可疑。它不依赖异常标签,学的是正常模式,而不是直接比较度这种单一指标。
Q3. 为什么重构误差类方法容易“放过”异常点?
- A.因为异常点数据量太少
- B.因为模型在含异常的训练集上过拟合,把异常也“学会”了← 正确答案
- C.因为异常点和正常点特征完全相同
- D.因为图结构无法输入神经网络
答案:B。自编码器是学着“压缩还原”数据的,如果训练集里混入了异常样本,模型会把这些异常也背下来,导致异常点的重构误差被低估。就像李大伯见多了夜归的人,慢慢觉得夜归也正常。异常点本身数量少并不是问题根源。
Q4. 下列哪些信息可以作为图异常检测中的“节点特征”?
- A.居民日常作息规律程度← 正确答案
- B.居民社交网络的局部聚类系数← 正确答案
- C.社区总人口
- D.居民的联系人身份多样性← 正确答案
答案:ABD。节点特征应反映个体行为及其局部网络属性,作息规律、聚类系数、联系人多样性都能刻画“行为偏离”。社区总人口是全局常量,对每个节点都一样,没有判别力。
Q5. 对比学习检测中,“正样本”通常指的是什么?
- A.被标注为异常的真实样本
- B.原始图与其自身增强视角下的一致性← 正确答案
- C.随机生成的噪声图
- D.邻居数量最多的节点
答案:B。对比学习的正样本是同一对象的不同视角,比如原始子图和它的增强版本。模型要拉近“自己和自己”的距离,推开与噪声图的距离。异常样本没有被标注,随机噪声是负样本,节点度也不是正样本的来源。
Q6. 设定异常判定阈值 τ = μ + kσ 属于哪种思路?
- A.根据正常样本误差分布设定警戒线← 正确答案
- B.根据异常样本误差均值设定
- C.随机打乱后取中位数
- D.让模型自己输出类别标签
答案:A。μ 和 σ 来自全体分数的均值和标准差,k 通常取 2 或 3,意思是“比平均水平高两三个标准差才算可疑”。这就像李大伯统计全社区的平均夜归时间后,再决定几点钟之后才值得上门。
Q7. 关于图异常检测的评估,下列说法正确的是?
- A.可用 AUC 衡量异常排名的质量← 正确答案
- B.Precision@K 适合标注稀疏的场景← 正确答案
- C.准确率越高一定越好
- D.只需要看训练损失下降快慢
答案:AB。AUC 衡量模型把异常排在正常前面的能力,Precision@K 只看前 K 个候选的命中率,两者都适合“异常稀疏、标注不完整”的图场景。准确率在极端不平衡数据下会失真,训练损失更不能代表检测效果。
Q8. DOMINANT 模型的核心思想是什么?
- A.联合重构图结构与节点属性,用误差打分← 正确答案
- B.通过聚类将节点分簇后取孤立簇
- C.利用节点度的对数做回归
- D.用 PageRank 计算节点重要性
答案:A。DOMINANT 是 GCN 自编码器,编码器把 A 和 X 压缩成隐向量,解码器重建结构和属性,联合重构误差大的节点判为异常。它把“邻居画像”从简单均值升级成了可学习的 GCN 编码。
Q9. 金融反欺诈场景中,“边上的异常”最典型的表现是什么?
- A.两个账户在短时间内高频、大额互转← 正确答案
- B.账户头像上传频率高
- C.用户登录时段均集中在白天
- D.账户余额恒定不变
答案:A。交易图中边的异常表现为资金关系反常:高频、大额、整进整出,甚至形成闭环。头像、登录时段、余额都是单点特征,无法体现资金链路上的结构异常。
Q10. 现实中图异常检测缺乏异常标签,常用对策包括?
- A.用无监督重构误差方法← 正确答案
- B.用对比学习构造自监督信号← 正确答案
- C.只用规则匹配黑名单
- D.对异常样本做 SMOTE 过采样
答案:AB。无监督重构与对比学习都不需要异常标签,是主流方案。黑名单只能命中已知手法,无法发现未知异常;SMOTE 需要异常样本才能合成新样本,在“完全没有标签”的场景下无法直接使用。