Link prediction sample code data leak
- Dominant language
- Python
- Stars
- 14.3k
- Forks
- 3.1k
- PR merge metrics
- No merged PRs in 30d
Description
## 📚 Documentation
现在的dgl官方示例代码中对于链接预测任务的数据划分有数据泄露的问题。代码请看:https://docs.dgl.ai/en/0.8.x/tutorials/blitz/4_link_predict.html
Prepare training and testing sets小节
具体如下:
```
# 获取链接的源节点和目标节点 这里是edges 是双向的,就是说一个边是在edges 中有两个记录。
u,v = g.edges()
# 获取打乱后的eid 这个eid,这里同样对于同一边有两个eid
eids = np.arange(g.number_of_edges())
eids = np.random.permutation(eids)
# 获取测试集和训练集的长度
test_size = int(len(eids)*ratio)
train_size = g.number_of_edges() - test_size
# 问题在这里:
# 这里将eid的前几个作为测试集,后几个作为训练集,但是在分割时不能保证,一条边的两个eid都在前几个。
# 那么就会出现一条边的一个方向即一个eid出现在test中,而该边的另一个方向出现在训练集中,这就会造成信息泄露,
# 即测试集的边出现在训练集中。而且在链接预测任务中,边的方向不影响边是否存在,这会影响最终结果。
test_pos_u, test_pos_v = u[eids[:test_size]], v[eids[:test_size]]
train_pos_u, train_pos_v = u[eids[test_size:]], v[eids[test_size:]]
```
负采样和正采样相同,都有类似的数据泄露问题。
希望在划分链接预测任务的数据集时,能够考虑到一个边的两个eid只能出现在一个地方,要不在测试集,要么在训练集,要么在验证集。
最好能够提供对于图数据的链接预测任务的数据集划分工具,类似于PyG中的RandomLinkSplit。能够将图的边分为验证集测试集和训练集。并在划分数据集的基础上提供GNAE(https://github.com/SeongJinAhn/VGNAE) 的复现,谢谢。
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.