我试图理解如何使用Stellargraph的EdgeSplitter
类。特别地,用于训练基于Node2Vec的链路预测模型的文档上的examples将图拆分为以下部分:
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
类的正确方法是什么李>提前感谢您的帮助
为什么不相交集: 这可能重要,也可能不重要,取决于嵌入算法。 将嵌入算法和分类器都视为目标的边缘作为目标的风险在于嵌入算法可能会对不可概括的特征进行编码
例如,理论上,嵌入的一个特征可以是节点id,然后可以有其他特征编码节点的整个邻域。当以奇怪的方式将两个节点的嵌入组合到链接向量中时,或者当使用多层模型时,可以创建一个二进制特征,如果两个节点在嵌入训练期间连接,则为1,否则为0。 在这种情况下,当您转到测试数据时,分类器可能只是学习使用这个不存在(即值为0)的琐碎特征
上述情况在真实场景中不会发生,但更细微的特征可能会在较小程度上产生相同的效果。 最后,这只会使模型选择变得糟糕。 也就是说,第一步是使测试可靠。第二步是改进模型选择。因此,如果愿意,可以省略第二个拆分
为什么测试集这么大: 火车越大,你的分数越高。只要以不同的分段重复试验,并且方差在控制范围内,就可以增加列车尺寸
使用EdgeSplitt的正确方法是什么: 我不知道这里“正确”是什么意思。我认为图分裂仍然是一个活跃的研究领域
相关问题 更多 >
编程相关推荐