目录

第六届计图挑战赛 赛道一:基于图学习的动态推荐

A 榜成绩 1.3940(dataset1 与 dataset2 的 MRR 之和)。

方法

两个场景分别建模,计算核心都是图上的加权消息传播,用 Jittor 的 gather 与 jt.scatter(..., reduce='add') 实现。

  • dataset1(非二部图):先按历史正向邻居 / 历史反向邻居 / 其余节点分三层, 层内按最近交互时间排序;其余节点用 Adamic-Adar 加时间衰减流行度打分。
  • dataset2(二部图):把用户已交互过的物品压到最低分,其余用二部图上的两步 质量扩散打分,三处归一化各带一个热度阻尼指数。

超参数由一个不使用任何测试集标签的离线 MRR 评估器搜索得到。评估器利用“99 个负 样本从候选池均匀采样”这一事实,把 MRR 写成只依赖测试集输入与打分函数的无偏 估计,因此可以在提交之前直接算出真实榜单分数。推导见 code/tools/oracle.py, 更完整的说明见提交的技术说明文档。

环境

Ubuntu 22.04 + CUDA 12.4 + Python 3.10 + Jittor 1.3.10。

pip install -r requirements.txt

运行

cd code
python tools/selftest.py                                # 几秒钟的环境自检
python main.py --data-root /path/to/data_A --out ../submission

会在输出目录下为每个场景生成同名 csv 并打包成 result.zip--data-root 下每 个同时含 train.csvtest.csv 的子目录都会自动跑一遍,二部图与非二部图由 数据本身判定,换数据集不需要改命令。

耗时取决于源节点数量,A 榜数据上单个场景在数分钟量级。没有 GPU 时加 --cpu,结果一致。

复现超参数

python tools/oracle.py dataset2 --data-root /path/to/data_A
python tools/tune.py dataset1 --data-root /path/to/data_A --grid w_pop=0.05,0.15,0.3

目录

src/
  main.py          入口
  config.py        超参数
  dataio.py        读数据与写提交
  propagation.py   Jittor 稀疏传播算子
  models.py        两类场景的打分模型
tools/           自检、离线评估器、扫参
requirements.txt

说明

除赛题提供的数据集外未使用任何其他数据,不依赖预训练权重。

关于
56.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号