应用训练好的模型进行预测
此功能处于 Beta 测试阶段。有关功能分级的更多信息,请参阅 API 分级。
在前面的章节中,我们已经了解了如何构建节点分类(Node Classification)训练流水线并对其进行训练以生成分类流水线。经过训练后,可运行的模型类型为 NodeClassification,并存储在模型目录中。
分类模型可以与图目录中的图一起执行,以预测以前未见过的节点的类别。除了每个节点的预测类别外,还可以将每个类别的预测概率保留在节点上。概率的顺序与模型中注册的类别顺序相匹配。
由于模型是基于使用特征流水线创建的特征进行训练的,因此相同的特征流水线会被存储在模型中,并在预测时执行。与训练期间一样,特征流水线中节点属性步骤所创建的中间节点属性是瞬态的,在执行后不可见。
预测图必须包含流水线所需的属性,且所使用的数组属性必须与训练图具有相同的维度。如果预测图和训练图不同,最好使它们具有相似的来源和语义,以便模型能够良好地泛化。
语法
CALL gds.beta.pipeline.nodeClassification.predict.stream(
graphName: String,
configuration: Map
)
YIELD
nodeId: Integer,
predictedClass: Integer,
predictedProbabilities: List of Float
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
modelName |
字符串 |
|
否 |
模型目录中节点分类模型的名称。 |
targetNodeLabels(目标节点标签) |
字符串列表 |
|
是 |
使用给定的 targetNodeLabels 过滤指定图。 |
relationshipTypes |
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
includePredictedProbabilities |
布尔值 |
|
是 |
是否返回每个类别的概率。如果为 |
| 名称 | 类型 | 描述 |
|---|---|---|
nodeId |
整数 |
节点 ID。 |
predictedClass |
整数 |
该节点的预测类别。 |
predictedProbabilities |
浮点数列表 |
该节点所有类别的概率。 |
CALL gds.beta.pipeline.nodeClassification.predict.mutate(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
mutateMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
modelName |
字符串 |
|
否 |
模型目录中节点分类模型的名称。 |
mutateProperty |
字符串 |
|
否 |
GDS 图中写入预测属性的节点属性。 |
targetNodeLabels(目标节点标签) |
字符串列表 |
|
是 |
使用给定的 targetNodeLabels 过滤指定图。 |
relationshipTypes |
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
predictedProbabilityProperty |
字符串 |
|
是 |
存储类别概率列表的节点属性。如果省略,概率列表将被丢弃。可以通过分类模型的 |
| 名称 | 类型 | 描述 |
|---|---|---|
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算全局指标所耗费的毫秒数。 |
mutateMillis |
整数 |
向内存中图添加属性的毫秒数。 |
nodePropertiesWritten |
整数 |
已写入的节点属性数量。 |
配置 |
Map |
运行算法所使用的配置。 |
CALL gds.beta.pipeline.nodeClassification.predict.write(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
writeMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
modelName |
字符串 |
|
否 |
模型目录中节点分类模型的名称。 |
targetNodeLabels(目标节点标签) |
字符串列表 |
|
是 |
使用给定的 targetNodeLabels 过滤指定图。 |
relationshipTypes |
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
整数 |
|
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
|
否 |
Neo4j 数据库中写入预测属性的节点属性。 |
|
predictedProbabilityProperty |
字符串 |
|
是 |
存储类别概率列表的节点属性。如果省略,概率列表将被丢弃。可以通过分类模型的 |
| 名称 | 类型 | 描述 |
|---|---|---|
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算全局指标所耗费的毫秒数。 |
writeMillis |
整数 |
将结果写回 Neo4j 所用的毫秒数。 |
nodePropertiesWritten |
整数 |
已写入的节点属性数量。 |
配置 |
Map |
运行算法所使用的配置。 |
示例
在以下示例中,我们将展示如何使用分类模型来预测内存图中节点的类别。除了预测类别外,我们还将在另一个节点属性中生成每个类别的概率。为此,我们首先需要一个已训练并在模型目录中注册的模型。我们将使用在训练示例中训练过的模型,我们将其命名为 'nc-pipeline-model'。
内存估算
首先,我们将使用 estimate 过程来估算运行算法的成本。这可以在任何执行模式下完成。在本例中,我们将使用 stream 模式。估算算法有助于了解在图上运行算法对内存的影响。当你随后在某种执行模式下实际运行算法时,系统将执行一次估算。如果估算结果显示执行超出内存限制的可能性非常高,则会禁止执行。欲了解更多信息,请参阅自动估算与执行阻塞。
有关 estimate 的更多详细信息,请参阅 内存估算。
CALL gds.beta.pipeline.nodeClassification.predict.stream.estimate('myGraph', {
modelName: 'nc-pipeline-model',
includePredictedProbabilities: true,
targetNodeLabels: ['UnknownHouse']
})
YIELD requiredMemory
| requiredMemory |
|---|
"792 字节" |
| 如果某个节点属性步骤未实现估算,则该步骤在估算中会被忽略。 |
流(Stream)
CALL gds.beta.pipeline.nodeClassification.predict.stream('myGraph', {
modelName: 'nc-pipeline-model',
includePredictedProbabilities: true,
targetNodeLabels: ['UnknownHouse']
})
YIELD nodeId, predictedClass, predictedProbabilities
WITH gds.util.asNode(nodeId) AS houseNode, predictedClass, predictedProbabilities
RETURN
houseNode.color AS classifiedHouse,
predictedClass,
floor(predictedProbabilities[predictedClass] * 100) AS confidence
ORDER BY classifiedHouse
| classifiedHouse | predictedClass | confidence(置信度) |
|---|---|---|
|
|
|
|
|
|
|
|
|
我们可以看到,模型能够将粉色房子预测为类别 0,棕褐色房子预测为类别 1,黄色房子预测为类别 2。这是合理的,因为类别 0 中的所有房子都有三层,类别 1 有两层,类别 2 有一层,这与粉色、棕褐色和黄色房子的情况分别吻合。此外,我们可以看到模型对这些预测非常有信心,所有情况下的置信度均 >= 79%。
predictedProbabilities 中的索引对应于分类模型中类别的顺序。要查看类别的顺序,我们可以查看其 modelInfo(参见列出模型)。 |
变异(Mutate)
mutate 执行模式会使用包含该节点预测类别的新节点属性来更新指定图。新属性的名称通过强制配置参数 mutateProperty 指定。结果是一个包含计时信息和写入属性数量的单一摘要行。当多个算法协同使用时,mutate 模式特别有用。
有关 mutate 模式的更多详细信息,请参阅变异 (Mutate)。
CALL gds.beta.pipeline.nodeClassification.predict.mutate('myGraph', {
targetNodeLabels: ['UnknownHouse'],
modelName: 'nc-pipeline-model',
mutateProperty: 'predictedClass',
predictedProbabilityProperty: 'predictedProbabilities'
}) YIELD nodePropertiesWritten
| nodePropertiesWritten |
|---|
6 |
由于我们还指定了 predictedProbabilityProperty,因此我们为 3 个 UnknownHouse 节点中的每一个写入了两个属性。
写入(Write)
write 执行模式将每个节点的预测属性作为属性写入 Neo4j 数据库。新属性的名称通过强制配置参数 writeProperty 指定。结果是一个包含计时信息和写入属性数量的单一摘要行。write 模式允许将结果直接持久化到数据库中。
有关 write 模式的更多详细信息,请参阅写入 (Write)。
CALL gds.beta.pipeline.nodeClassification.predict.write('myGraph', {
targetNodeLabels: ['UnknownHouse'],
modelName: 'nc-pipeline-model',
writeProperty: 'predictedClass',
predictedProbabilityProperty: 'predictedProbabilities'
}) YIELD nodePropertiesWritten
| nodePropertiesWritten |
|---|
6 |
由于我们还指定了 predictedProbabilityProperty,因此我们为 3 个 UnknownHouse 节点中的每一个写入了两个属性。