应用训练好的模型进行预测

此功能处于 Beta 阶段。有关功能层级的更多信息,请参阅API 层级

在前面的章节中,我们学习了如何构建节点分类训练管道并对其进行训练以生成分类管道。在训练之后,可运行的模型类型为NodeClassification,并位于模型目录中。

可以使用图目录中的图来执行分类模型,以预测以前未见节点的类别。除了每个节点的预测类别外,每个类别的预测概率也可以保留在节点上。概率的顺序与模型中注册的类别顺序一致。

由于模型是在使用特征管道创建的特征上训练的,因此相同的特征管道存储在模型内部并在预测时执行。与训练期间一样,特征管道中节点属性步骤创建的中间节点属性是瞬态的,并且在执行后不可见。

预测图必须包含管道所需的属性,并且所使用的数组属性必须与训练图具有相同的维度。如果预测图和训练图不同,它们具有相似的来源和语义也很有益,这样模型才能很好地泛化。

语法

每种模式的节点分类语法
在命名图上以流模式运行节点分类
CALL gds.beta.pipeline.nodeClassification.predict.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  predictedClass: Integer,
  predictedProbabilities: List of Float
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

存储在目录中的图名称。

配置

映射

{}

算法特定配置和/或图过滤配置。

表 2. 配置
名称 类型 默认值 可选 描述

modelName

字符串

不适用

模型目录中 NodeClassification 模型的名称。

targetNodeLabels

字符串列表

来自 trainConfig

使用给定的 targetNodeLabels 过滤命名图。

relationshipTypes

字符串列表

来自 trainConfig

使用给定的关系类型过滤命名图。

concurrency

整数

4 [1]

用于运行算法的并发线程数。

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

includePredictedProbabilities

布尔值

false

是否返回每个类别的概率。如果为false,则在predictedProbabilites中返回null。类别的顺序可以在分类模型的modelInfo中查看(参阅列出模型)。

1. 在GDS 会话中,默认值为可用处理器数量

表 3. 结果
名称 类型 描述

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
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

存储在目录中的图名称。

配置

映射

{}

算法特定配置和/或图过滤配置。

表 5. 配置
名称 类型 默认值 可选 描述

modelName

字符串

不适用

模型目录中 NodeClassification 模型的名称。

mutateProperty

字符串

不适用

预测属性写入的 GDS 图中的节点属性。

targetNodeLabels

字符串列表

来自 trainConfig

使用给定的 targetNodeLabels 过滤命名图。

relationshipTypes

字符串列表

来自 trainConfig

使用给定的关系类型过滤命名图。

concurrency

整数

4 [2]

用于运行算法的并发线程数。

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

predictedProbabilityProperty

字符串

不适用

存储类别概率列表的节点属性。如果省略,则概率列表将被丢弃。类别的顺序可以在分类模型的modelInfo中查看(参阅列出模型)。

2. 在GDS 会话中,默认值为可用处理器数量

表 6. 结果
名称 类型 描述

preProcessingMillis

整数

图预处理的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算全局指标的毫秒数。

mutateMillis

整数

向内存图添加属性的毫秒数。

nodePropertiesWritten

整数

写入的节点属性数量。

配置

映射

用于运行算法的配置。

在命名图上以写入模式运行节点分类
CALL gds.beta.pipeline.nodeClassification.predict.write(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

存储在目录中的图名称。

配置

映射

{}

算法特定配置和/或图过滤配置。

表 8. 配置
名称 类型 默认值 可选 描述

modelName

字符串

不适用

模型目录中 NodeClassification 模型的名称。

targetNodeLabels

字符串列表

来自 trainConfig

使用给定的 targetNodeLabels 过滤命名图。

relationshipTypes

字符串列表

来自 trainConfig

使用给定的关系类型过滤命名图。

concurrency

整数

4 [3]

用于运行算法的并发线程数。

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

writeConcurrency

整数

'concurrency' 的值

用于将结果写入 Neo4j 的并发线程数。

writeProperty

字符串

不适用

预测属性写入的 Neo4j 数据库中的节点属性。

predictedProbabilityProperty

字符串

不适用

存储类别概率列表的节点属性。如果省略,则概率列表将被丢弃。类别的顺序可以在分类模型的modelInfo中查看(参阅列出模型)。

3. 在GDS 会话中,默认值为可用处理器数量

表 9. 结果
名称 类型 描述

preProcessingMillis

整数

图预处理的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算全局指标的毫秒数。

writeMillis

整数

将结果写回 Neo4j 的毫秒数。

nodePropertiesWritten

整数

写入的节点属性数量。

配置

映射

用于运行算法的配置。

示例

在以下示例中,我们将展示如何使用分类模型来预测内存图中的节点类别。除了预测类别外,我们还将在另一个节点属性中生成每个类别的概率。为此,我们必须首先在模型目录中注册一个已训练的模型。我们将使用在训练示例中训练的模型,该模型名为'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
表 10. 结果
requiredMemory

"792 字节"

如果节点属性步骤未实现估算,则该步骤将在估算中被忽略。

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
表 11. 结果
classifiedHouse predictedClass 置信度

"粉色"

0

96.0

"棕褐色"

1

97.0

"黄色"

2

75.0

如我们所见,模型能够将粉色房屋预测为类别 0,棕褐色房屋预测为类别 1,黄色房屋预测为类别 2。这很合理,因为类别 0 中的所有房屋都有三层,类别 1 有两层,类别 2 有一层,粉色、棕褐色和黄色房屋也分别如此。此外,我们看到模型对这些预测充满信心,因为在所有情况下置信度都 >=79%。

predictedProbabilities中的索引对应于分类模型中类别的顺序。要查看类别的顺序,我们可以查看其modelInfo(参阅列出模型)。

变异

mutate执行模式使用包含该节点预测类别的新节点属性更新命名图。新属性的名称使用强制配置参数mutateProperty指定。结果是单个摘要行,包括时间信息和写入的属性数量。当多个算法结合使用时,mutate模式特别有用。

有关mutate模式的更多详细信息,请参阅变异

CALL gds.beta.pipeline.nodeClassification.predict.mutate('myGraph', {
  targetNodeLabels: ['UnknownHouse'],
  modelName: 'nc-pipeline-model',
  mutateProperty: 'predictedClass',
  predictedProbabilityProperty: 'predictedProbabilities'
}) YIELD nodePropertiesWritten
表 12. 结果
nodePropertiesWritten

6

由于我们还指定了predictedProbabilityProperty,我们正在为 3 个UnknownHouse节点中的每个节点写入两个属性。

写入

write执行模式将每个节点的预测属性作为属性写入 Neo4j 数据库。新属性的名称使用强制配置参数writeProperty指定。结果是单个摘要行,包括时间信息和写入的属性数量。write模式允许直接将结果持久化到数据库。

有关write模式的更多详细信息,请参阅写入

CALL gds.beta.pipeline.nodeClassification.predict.write('myGraph', {
  targetNodeLabels: ['UnknownHouse'],
  modelName: 'nc-pipeline-model',
  writeProperty: 'predictedClass',
  predictedProbabilityProperty: 'predictedProbabilities'
}) YIELD nodePropertiesWritten
表 13. 结果
nodePropertiesWritten

6

由于我们还指定了predictedProbabilityProperty,我们正在为 3 个UnknownHouse节点中的每个节点写入两个属性。

© . All rights reserved.