Neo4j链路预测ML管道



我正在研究一个不同类型的节点之间的用例预测关系。我有一张类似这样的图。

(:customer)-[:has]->(:session) (:session)-[:contains]->(:order) (:order)-[:has]->(:product) (:order)-[:to]->(:relation)

有许多客户已经下了订单。有些命令规定了命令的目的(关系),即母亲/父亲等,而有些命令则没有。对于这些订单,我的意图是预测订单可能会发送给谁

我已经在neo4j上准备了一个链接预测ML管道。gds.beta.pipeline.linkPrediction.predict.mutate过程有两种预测方式:Exhaustive searchApproximate search。第一个预测所有未连接的节点,第二个应用KNN进行预测。我不想两者都要;相反,我希望模型只预测两个特定节点"顺序"节点和"关系"节点之间的链接。如何在预测过程中指定这一点?

您还可以将这个问题定义为节点分类,并获得您想要的内容。将Relation作为目标变量,它将成为一个多类分类问题。假设Relation是一个有几种类型(母亲/父亲/兄弟姐妹/朋友等)的分类变量,假设基于CustomerOrder节点上的属性,我们可以预测某个阶的关系

Customer节点属性的一些示例是年龄、位置、计费地址等,而Order节点的属性是类别、描述、发货地址、计费地址、位置等。Session节点的属性可能对预测订单或订单的关系没有用处。

为了在Neo4j中运行任何算法,我们必须将图形投影到内存中。Customer和Order节点上的一些属性是字符串,图形投影过程不支持将字符串投影到内存中。因此,字符串必须转换为数值。

例如,Customer年龄可以按原样使用,但订单描述必须使用一些NLP方法转换为单词/短语嵌入。一些创造性的功能工程也有帮助-而不是对账单/发货地址进行编码,一个简单的标志来识别它们是相同还是不同,可以更容易地区分客户是将订单发送到他/她自己的地址还是其他地方。

由于我们使用Relation作为目标变量,因此让我们对关系类型进行标签编码,并将其添加为与Relation节点存在关系的Order节点上的类标签属性(标记示例)。对于所有其他订单,将类标签属性添加为0(或标签编码关系类型以外的任何其他数字)

现在,将一个包含Customer、Session和Order节点以及感兴趣的属性的图投影到内存中。由于我们在预测任务中没有使用Session节点,因此我们可以折叠CustomerOrder节点之间的路径。一个客户可以通过多个会话节点连接到多个订单,并且订单是唯一的。折叠路径过程不会导致客户和订单节点之间存在多个关系,因此不需要聚合。

现在,您可以使用Neo4j GDS库中的Node classification ML管道来生成嵌入,并使用Order节点上的嵌入属性作为特征向量,使用类标签属性作为目标,并训练多类分类模型来预测特定顺序所属的类或特定顺序用于某个关系类型的可能性。

GDS的最新稳定版本(在撰写本文时为2.1.11)不支持此用例。在GDS管道中,我们假设一个同构图,其中训练算法将每个节点视为与任何其他节点相同的类型,并且对于关系也是类似的。

然而,我们目前正在构建支持异构用例的功能。在2.2中,我们将添加所谓的上下文配置,在该配置中,您可以指导训练算法尝试仅学习特定源节点标签和目标节点标签之间的特定关系类型,同时仍然允许生成特征的节点属性步骤使用更丰富的图。

相对于您正在使用的节点功能,这将是有效的——如果您正在使用嵌入,您必须知道这些功能仍然是同质的,并且不太可能区分各种不同的关系类型(GraphSAGE除外)。即使你确实使用了它们,你也只能得到你为训练指定的相关标签类型标签三元组的预测。但我建议您考虑使用哪些功能,以及如何有效地调整您的模型。

您已经可以使用我们的alpha版本试用2.2功能了——通过这个下载链接找到我们最新的alpha。此处提供预览文档。请注意,这是预览软件,API可能会发生很大变化,直到最终的2.2.0发布版本。

最新更新