机器学习管道

此示例是《机器学习》部分中描述的链接预测管道的简化版本。

创建图

以下 Cypher 查询在 Neo4j 数据库中创建了一个小型社交网络的图。

CREATE
  (alice:Person {name: 'Alice', age: 38}),
  (michael:Person {name: 'Michael', age: 67}),
  (karin:Person {name: 'Karin', age: 30}),
  (chris:Person {name: 'Chris', age: 52}),
  (will:Person {name: 'Will', age: 6}),
  (mark:Person {name: 'Mark', age: 32}),
  (greg:Person {name: 'Greg', age: 29}),
  (veselin:Person {name: 'Veselin', age: 3}),

  (alice)-[:KNOWS]->(michael),
  (michael)-[:KNOWS]->(karin),
  (michael)-[:KNOWS]->(chris),
  (michael)-[:KNOWS]->(greg),
  (will)-[:KNOWS]->(michael),
  (will)-[:KNOWS]->(chris),
  (mark)-[:KNOWS]->(michael),
  (mark)-[:KNOWS]->(will),
  (greg)-[:KNOWS]->(chris),
  (veselin)-[:KNOWS]->(chris),
  (karin)-[:KNOWS]->(veselin),
  (chris)-[:KNOWS]->(karin)

该图如下所示

LP example data.

下一个查询从 Neo4j 图中创建了一个名为 friends 的内存图。由于链接预测模型要求图是无向的,因此 :KNOWS 关系的方向被丢弃。

MATCH (source:Person)-[r:KNOWS]->(target:Person)
RETURN gds.graph.project(
  'friends',
  source,
  target,
  {
    sourceNodeProperties: source { .age },
    targetNodeProperties: target { .age },
    relationshipType: 'KNOWS'
  },
  { undirectedRelationshipTypes: ['KNOWS'] }
)

配置管道

您可以使用一系列 Cypher 查询配置机器学习管道。

  • 创建管道并将其添加到管道目录

    CALL gds.beta.pipeline.linkPrediction.create('pipe')
  • 添加链接特征(此处仅为 age)和特征类型(此处为 l2

    CALL gds.beta.pipeline.linkPrediction.addFeature(
      'pipe',
      'l2',
      { nodeProperties: ['age'] }
    )
  • 配置训练-测试分割和交叉验证的折叠次数

    CALL gds.beta.pipeline.linkPrediction.configureSplit(
      'pipe',
      {
        testFraction: 0.25,
        trainFraction: 0.6,
        validationFolds: 3
      }
    )
  • 添加模型候选(此处为未进一步配置的逻辑回归)

    CALL gds.beta.pipeline.linkPrediction.addLogisticRegression('pipe')

训练模型

配置完成后,管道就可以训练模型了。训练过程将返回使用指定评估指标的性能最佳的模型。

上一节中显示的管道配置为了方便起见进行了简化;因此,模型性能预计不会是最佳的。有关详细演练,请参阅链接预测管道页面。

CALL gds.beta.pipeline.linkPrediction.train(
  'friends',  (1)
  {
    pipeline: 'pipe',  (2)
    modelName: 'lp-pipeline-model',  (3)
    targetRelationshipType: 'KNOWS',  (4)
    metrics: ['AUCPR'],  (5)
    randomSeed: 42  (6)
  }
)
YIELD modelInfo
RETURN
  modelInfo.bestParameters AS winningModel,  (7)
  modelInfo.metrics.AUCPR.train.avg AS avgTrainScore,  (8)
  modelInfo.metrics.AUCPR.validation.avg AS avgValidationScore,
  modelInfo.metrics.AUCPR.outerTrain AS outerTrainScore,
  modelInfo.metrics.AUCPR.test AS testScore
1 用于训练的投影图的名称。
2 已配置管道的名称。
3 要训练的模型的名称。
4 要对其训练模型的关系的名称。
5 用于评估模型的指标(此处为 AUCPR)。
6 随机种子仅在需要跨运行获得相同结果时才需要。
7 训练过程返回的性能最佳模型的参数。
8 训练过程返回的性能最佳模型的评估指标(此处为 AUCPR)。
表 1. 结果
winningModel avgTrainScore avgValidationScore outerTrainScore testScore

{batchSize=100, classWeights=[], focusWeight=0.0, learningRate=0.001, maxEpochs=100, methodName="LogisticRegression", minEpochs=1, patience=1, penalty=0.0, tolerance=0.001}

0.5740740741

0.3611111111

0.3784126984

0.3444444444

使用模型进行预测

您可以使用训练好的模型来预测投影图中两个节点之间是否存在链接的概率。

CALL gds.beta.pipeline.linkPrediction.predict.stream(  (1)
  'friends',  (2)
  {
    modelName: 'lp-pipeline-model',  (3)
    topN: 5  (4)
  }
)
YIELD node1, node2, probability
RETURN
  gds.util.asNode(node1).name AS person1,
  gds.util.asNode(node2).name AS person2,
  probability
ORDER BY probability DESC, person1
1 stream 模式运行预测(将预测的链接作为查询结果返回)。
2 要对其运行预测的投影图的名称。
3 要用于预测的模型的名称。
4 要输出的预测关系的最大数量。
表 2. 结果
person1 person2 probability

"Karin"

"Greg"

0.4991379664

"Mark"

"Karin"

0.4989714183

"Mark"

"Greg"

0.4986938388

"Will"

"Veselin"

0.4986938388

"Mark"

"Alice"

0.4971949275

后续步骤

尝试通过使用不同的模型候选、将节点属性添加到特征或配置自动调整来提高训练的性能。