2. 图与链路预测基础

在进入 GNN 链路预测与隐蔽欺诈关系识别之前,必须先把“图”这门语言说清楚。图不是画出来的网络图,而是一种严格的数学结构:它由节点集合与边集合构成,用来描述对象之间的关联。欺诈识别之所以适合用图建模,是因为欺诈行为往往不体现在单个账户的属性上,而体现在账户之间的资金流、设备共用、IP 聚集、担保关系等连接模式中。链路预测则进一步回答:在当前已知连接的基础上,哪些尚未观察到的连接最可能存在,或者最应该被重点关注。

一、图的基本定义与邻接矩阵

一个图通常记为 G = (V, E)。其中 V 是节点集合,E 是边集合。若边有方向,称为有向图;若边带权重,称为加权图;若节点和边还带有类型,则称为异构图。在欺诈场景中,账户、设备、商户、身份证、银行卡都可以作为节点,转账、登录、绑定、共用等行为可以作为边。图的结构信息最终要被算法读取,最基础的表示方式就是邻接矩阵。

对于包含 n 个节点的图,邻接矩阵 A 是一个 n × n 的矩阵。若节点 i 与节点 j 之间存在边,则 A[i][j] = 1,否则为 0;若为加权图,则填入权重。无向图的邻接矩阵是对称的,有向图则不一定对称。邻接矩阵的缺点是稀疏且维度高,因此实际系统中常使用稀疏矩阵、边列表或邻接表来存储。

# 以 NetworkX 为例,构建一个简单无向图
import networkx as nx

G = nx.Graph()
G.add_nodes_from(["A", "B", "C", "D"])
G.add_edges_from([("A", "B"), ("B", "C"), ("C", "D")])

# 转为邻接矩阵
A = nx.to_numpy_array(G)
print(A)
# [[0. 1. 0. 0.]
#  [1. 0. 1. 0.]
#  [0. 1. 0. 1.]
#  [0. 0. 1. 0.]]

除了邻接矩阵,图还可以用度矩阵 D、拉普拉斯矩阵 L = D - A、归一化邻接矩阵等形式表示。GNN 的消息传递过程,本质上就是不断用邻接关系聚合邻居信息,因此理解邻接矩阵是理解 GNN 的第一步。

二、链路预测任务定义

链路预测的目标是:给定图的一部分边,预测哪些尚未出现的节点对之间可能存在边。形式化地说,对于节点对 (u, v),模型需要输出一个分数 s(u, v),表示该边存在的概率或置信度。训练时通常把已知边作为正样本,从未连接节点对中采样负样本,然后学习一个打分函数。

链路预测与欺诈关系识别的关系非常直接:在欺诈场景中,很多隐蔽关系并未被直接记录,例如两个账户之间没有显式转账,但可能通过共同设备、共同收款人、相似行为序列形成潜在关联。链路预测可以把这些“缺失但高风险”的关系补全出来,为后续风险传播和团伙发现提供依据。

核心流程:构图 → 划分训练边/验证边/测试边 → 负采样 → 提取结构或 GNN 特征 → 训练打分模型 → 按分数排序 → 人工或规则复核。

需要特别注意的是,链路预测不是简单的二分类。真实图中正样本远少于负样本,且负样本的构造方式会显著影响模型效果。如果负样本全部随机采样,模型可能只学会区分“有边”和“完全无关”,而无法识别“看似无关但实际高风险”的隐蔽关系。因此,在欺诈场景中,负采样往往要结合业务规则,例如选择同设备、同地区、同时间窗口内但未发生交易的节点对作为困难负样本。

三、评价指标与清单

链路预测常用的评价指标包括 AUC、AP、Precision@K、Recall@K、MRR 和 Hits@K。AUC 衡量模型对正负样本的整体排序能力;AP 更适合正负样本极不平衡的场景;Precision@K 和 Recall@K 关注 Top-K 推荐结果的质量;MRR 和 Hits@K 则常用于知识图谱链路预测。欺诈场景中,业务方通常更关心 Top-K 名单的准确率,因为人工审核资源有限。

指标 含义 适用场景
AUC 正样本得分高于负样本的概率 整体排序能力评估
AP Precision-Recall 曲线下面积 正负样本极不平衡
Precision@K Top-K 中正样本比例 人工审核名单质量
Recall@K Top-K 覆盖的真实边比例 风险召回评估
MRR 第一个正确结果的排名倒数均值 知识图谱链路预测
Hits@K 正确结果出现在 Top-K 的比例 候选关系排序

下面是一个使用 scikit-learn 计算 AUC 与 AP 的简单示例:

from sklearn.metrics import roc_auc_score, average_precision_score

y_true = [1, 1, 0, 0, 1, 0]
y_score = [0.9, 0.8, 0.4, 0.3, 0.7, 0.2]

print("AUC:", roc_auc_score(y_true, y_score))
print("AP:", average_precision_score(y_true, y_score))

四、案例场景与常见误区

假设我们有一张支付网络图:节点是账户,边是转账关系。已知部分账户被确认为欺诈账户,我们希望预测哪些未连接的账户对之间可能存在隐蔽资金往来。做法是:先构造账户-账户图,再构造账户-设备图、账户-IP 图,形成异构图;然后在账户-账户层做链路预测,在账户-设备层做关联补全;最后把高分边交给风控人员复核。这个流程中,链路预测不是终点,而是风险线索生成器。

实践建议:在欺诈链路预测中,优先使用时间切分而不是随机切分。因为随机切分会让未来信息泄漏到训练集,导致离线指标虚高,上线后效果骤降。

常见误区:第一,把链路预测当成普通二分类,忽略图结构;第二,负采样过于简单,导致模型只学到“有没有边”而不是“像不像欺诈边”;第三,只看 AUC,不看 Top-K 业务指标;第四,忽略时间泄漏和标签泄漏;第五,把预测出的边直接当作欺诈结论,而不是风险线索。

总结来说,图的基本定义提供了建模语言,邻接矩阵提供了可计算的表示,链路预测定义了任务目标,评价指标决定了我们如何判断模型好坏。只有把这四件事同时做对,后续的 GNN 模型才有意义。否则,再复杂的网络结构也只是在错误的问题上做优化。