理论考虑
本页面详细介绍了与 GDS 中如何执行链接预测相关的一些理论概念。虽然阅读这些内容并非强制要求,但有助于加深理解。
指标 (Metrics)
Neo4j GDS 库中的链接预测管道支持以下指标:
-
AUCPR -
OUT_OF_BAG_ERROR(仅适用于 RandomForest,且仅提供验证分数)
AUCPR 指标是“精确率-召回率曲线下面积”(Area Under the Precision-Recall Curve) 的缩写。对于随机森林 (RandomForest) 模型,还支持 OUT_OF_BAG_ERROR(袋外误差)指标。为了计算精确率和召回率,我们需要一组示例,每个示例都有一个正标签或负标签。对于每个示例,我们还有一个预测标签。有了真实标签和预测标签,我们就可以计算精确率和召回率(参考资料,请参阅例如 维基百科)。
然后,为了计算 AUCPR,我们按以下方式构建精确率-召回率曲线:
-
每个预测都关联有一个预测强度。我们按预测强度的降序对示例进行排序。
-
对于所有出现的预测强度,我们将其用作阈值,并将所有达到该强度或更高的示例视为正标签。
-
现在我们计算精确率
p和召回率r,并将元组(r, p)视为曲线(即精确率-召回率曲线)上的一个点。 -
最后,对曲线进行线性插值,并将面积计算为以这些点为顶点的梯形并集。
曲线的形状大致如下所示:
请注意此处的蓝色区域,它显示了曲线下的一个梯形。
精确率-召回率曲线下的面积也可以解释为平均精确率,其中平均值是针对不同的分类阈值计算得出的。
OUT_OF_BAG_ERROR 仅针对随机森林模型计算,其评估方式为多数投票的准确率,即对于每个示例,仅考虑在训练期间未使用该示例的树。每棵树使用的训练集比例由配置参数 numberOfSamplesRatio 控制。在交叉验证阶段进行评估时,OUT_OF_BAG_ERROR 作为验证分数报告。如果随机森林模型胜出,则将其作为基于在整个训练集上重新训练模型后的测试分数进行报告。
类别不平衡 (Class imbalance)
大多数图中的非邻接节点对远多于邻接节点(例如稀疏图)。因此,我们通常会面临类别不平衡的问题。有多种策略可以处理不平衡数据。在管道训练过程中,使用的是 AUCPR 指标。对于不平衡数据,它被认为比常用的 AUROC(接收者操作特征曲线下面积)指标更合适。为了使该指标能够适当地反映正例(邻接节点对)和负例(非邻接节点对),我们提供了控制类别间采样比例的能力,并通过 negativeClassWeight 控制类别的相对权重。前者在使用 configureSplits 生成训练集和测试集时,通过配置参数 negativeSamplingRatio 进行设置(参见 configureSplits)。调整 negativeClassWeight(下文会有解释)意味着在计算精确率时对假阳性进行加权或减权。
negativeSamplingRatio 的推荐值是图的真实类别比率,换句话说,就是不应用欠采样。然而,该值越大,测试集就越大,因此评估所需的时间也就越长。测试集中负例与正例的总概率质量之比约为 negativeSamplingRatio * negativeClassWeight。因此,这两个参数可以协同调整,以在评估准确性和速度之间进行权衡。
真实类别比率计算为 (q - r) / r,其中 q = n(n-1)/2 是可能的无向关系总数,r 是实际的无向关系数量。请注意,graph list 过程报告的 relationshipCount 是所有现有关系类型的有向关系计数之和。因此,我们建议使用 Cypher 在源 Neo4j 图上获取 r。例如,此查询将统计类型为 T 或 R 的关系数量:
MATCH (a)-[rel:T | R]-(b)
WHERE a < b
RETURN count(rel) AS r
在选择 negativeClassWeight 的值时,应考虑两个因素。首先,测试集中负例与正例的总概率质量的期望比率。其次,测试集中采样负例与正例的比例是多少。为了与传统评估保持一致,应该选择参数使得 negativeSamplingRatio * negativeClassWeight = 1.0,例如将这些值分别设置为真实类别比率及其倒数,或者将两个值都设置为 1.0。
或者,也可以追求使各类别之间的总概率权重比接近真实类别比率。也就是说,确保 negativeSamplingRatio * negativeClassWeight 接近真实类别比率。这样报告的指标 (AUCPR) 就能更好地反映在未见过的高度不平衡数据上的预期精确率。使用这种评估方式时,必须调整预期,因为指标值会变得小得多。