【问题标题】:Splitting train test sets for Node2vec link prediction in Stellargraph在 Stellargraph 中拆分用于 Node2vec 链路预测的训练测试集
【发布时间】:2020-12-16 05:16:48
【问题描述】:

我正在尝试了解如何使用 Stellargraph 的 EdgeSplitter 类。特别是,文档中的examples,用于训练基于 Node2Vec 的链接预测模型,将图拆分为以下部分:

Distrution of samples across train, val and test set

按照文档中的examples,首先对全图链接的10%进行采样以获得测试集:

# Define an edge splitter on the original graph:
edge_splitter_test = EdgeSplitter(graph)

# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from graph, and obtain the
# reduced graph graph_test with the sampled links removed:
graph_test, examples_test, labels_test = edge_splitter_test.train_test_split(
    p=0.1, method="global"
)

据我从文档中了解到,graph_test 是原始图表,但删除了测试链接。然后你对训练集执行同样的操作,

# Do the same process to compute a training subset from within the test graph
edge_splitter_train = EdgeSplitter(graph_test)
graph_train, examples, labels = edge_splitter_train.train_test_split(
    p=0.1, method="global"
)

按照前面的逻辑,graph_train 对应于graph_test,去掉了训练链接。

进一步深入代码,我的理解是我们使用graph_train 来训练嵌入和训练样本(示例、标签)来训练分类器。所以我在这里有几个问题:

  • 我们为什么要使用不相交集的训练数据来训练模型的不同部分?我们不应该使用完整的链接训练集来训练嵌入和分类器吗?
  • 为什么测试集这么大?在训练集中包含大多数样本不是更好吗?
  • EdgeSplitter 类的正确使用方法是什么?

提前感谢您的帮助!

【问题讨论】:

    标签: python machine-learning graph embedding train-test-split


    【解决方案1】:

    为什么不相交集: 根据嵌入算法,这可能会或可能不会重要。 嵌入算法和分类器都将边缘视为目标的风险在于嵌入算法可能会编码不可泛化的特征。

    例如,理论上嵌入的一个特征可以是节点 id,然后您可以使用其他特征对节点的整个邻域进行编码。当以一种奇怪的方式将两个节点的嵌入组合成一个链接向量时,或者当使用多层模型时,可以创建一个二进制特征,如果两个节点在嵌入训练期间连接,则为 1,否则为 0。 在这种情况下,分类器可能会在您查看测试数据时学会使用这个不存在的琐碎特征(即值为 0)。

    上述情况不会在真实场景中发生,但更微妙的功能可能会在较小程度上产生相同的效果。 最后,这只会使模型选择变得糟糕。 也就是说,第一次拆分是为了使测试可靠。第二个拆分是改进模型选择。因此,如果您愿意,可以省略第二次拆分。

    为什么测试集这么大: 使用更大的火车组,您可能会获得更高的分数。只要用不同的分割重复实验并且控制方差,增加训练大小应该没问题。

    EdgeSplitter的正确使用方法是什么: 我不知道这里的“正确”是什么意思。我认为图分裂仍然是一个活跃的研究领域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2021-06-28
      • 2017-06-16
      相关资源
      最近更新 更多