分割
在转导设置中,我们要求评估期间遇到的所有实体和关系在训练时已经已知,即包含在训练数据集中。 这使得创建评估分割更加困难。
处理这种情况的一种方法是随机选择训练三元组,然后从剩余的三元组中丢弃任何不属于任何训练三元组的实体或关系。
你可以在PyKEEN中通过为训练三元组创建一个TriplesFactory,然后将其实体和关系传递给ID映射来为评估三元组创建一个TriplesFactory。
这将过滤掉任何具有未知ID的三元组(并警告你,所以你会知道)。
PyKEEN 还提供了更高级的方法来创建分割,旨在保留更多用于创建分割的基础三元组。 我们已经实现了多种算法来实现这一目标,这些算法将在下面进行描述。 基于覆盖率的算法是默认的。 所有这些算法都能够配置结果三元组集之间的所需分割比例。 可能并不总是能够找到具有确切比例的合适分割,因此结果可能会略有不同。 在这种情况下,您将看到关于不同比例的警告。
覆盖率
该方法首先为训练部分为每个实体选择一个三元组,然后以调整后的分割比例随机分割剩余的三元组。 在某些情况下,如图非常稀疏或训练比例过小,可能无法选择初始覆盖,分割方法将失败。
清理
三元组首先随机分割,不考虑传导要求。 之后,可能会有仅在评估三元组中出现的实体或关系。 因此,对于每组评估三元组,我们将三元组从评估集移动到训练集,直到所有实体至少出现在一个训练三元组中。 这可能会增加训练三元组的数量,从而使分割比例偏向训练。
我们提供两种不同的清理方法:随机和确定性。
确定性
确定性方法找到所有包含至少一个不属于训练集的实体或关系的三元组,并将它们全部移动到训练集中。 它只需要一次迭代,因此非常快,但可能会将比必要更多的三元组移动到训练集中,导致评估集比预期的小。
随机化
随机方法是迭代的: 它确定所有具有未被训练三元组覆盖的实体或关系的三元组,并随机选择其中一个三元组移动到训练集中。 当所有实体和关系都被覆盖时,过程停止。 通常需要多次迭代,因此比确定性算法慢。 然而,它可能会找到比确定性算法更小的三元组集,从而更接近所需的分割比例。
警告
PyKEEN 目前仅支持创建传导性分割。 其中一个原因是,在归纳设置中,有几种不同的方法来创建归纳分割,而文献中使用了不同的方法,参见 https://arxiv.org/abs/2107.04894。 您仍然可以使用 PyKEEN 进行现有数据集的归纳链接预测,或者使用您创建的新归纳数据集。 有关归纳链接预测的一般讨论,请参见 归纳链接预测。