在Stellargraph中为Node2vec链路预测拆分列车测试集



我正在努力了解如何使用Stellargraph的EdgeSplitter类。特别是,基于Node2Vec训练链路预测模型的文档中的示例将图分为以下部分:

样本在列车、val和测试集上的分布

根据文档中的示例,首先对完整图形的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类的正确方法是什么

提前感谢您的帮助!

为什么不相交集:这可能很重要,也可能无关紧要,具体取决于嵌入算法。嵌入算法和分类器都将边缘视为目标的风险在于,嵌入算法可能对不可推广的特征进行编码。

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

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

为什么测试集这么大:使用更大的训练集,你可能会获得更高的分数。只要用不同的分裂重复实验,并且方差在控制范围内,增加训练规模应该是可以的。

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

最新更新