cs3319-project2 / reports /exploration_summary.md
NLP-beginner's picture
CS3319 Project 2 final deliverable (public F1 = 0.96626)
f28d994
|
Raw
History Blame Contribute Delete
34.9 kB

CS3319 Recommendation Exploration Summary

更新日期:2026-06-15

1. 目标与验证协议

本轮探索目标是保留当前 LightGCN 主模型,同时通过模型融合、显式图结构特征、rank calibration 和提交比例校准,把 Kaggle 分数尽量推高到 0.95 以上。

最重要的调整是放弃只看固定 notebook_seed0 的结果,改为尽量复现示例 notebook 的随机划分方式:

  • 从完整 author-paper 训练边中随机抽取 90% 作为训练边。
  • 剩余 10% 作为 validation positives。
  • 随机采样同数量非训练边作为 validation negatives。
  • validation 是 1:1 构造,因此本地最佳 threshold 不能直接等价于官方 test 最佳正例比例。

相关代码:

  • code/train_val_lgcn_ensemble.py
  • code/search_dynamic_fusion.py
  • code/stack_rank_calibration.py

2. LightGCN 主线

LightGCN 仍然是最强 backbone。当前 LightGCN 并不是只使用 author-paper 边,它还使用:

  • author-paper train edges
  • author-author coauthor edges
  • paper-paper citation edges
  • paper reference degree / citation in degree / citation out degree 等增强特征

动态验证中,最稳定有效的 LightGCN 区间是:

  • 2 layers
  • 512 dim 左右
  • BPR loss
  • dot score
  • neg_per_pos=3
  • train_batch_size=131072
  • 多 seed ensemble

代表性动态验证结果:

split run F1
dynamic_seed202 dyn202_l2d512_bpr_bigbatch_more 0.938576
dynamic_seed203 dyn203_l2d512_bpr_bigbatch_extra 0.938555
dynamic_seed202 dyn202_l2d640_bpr_bigbatch 0.938355
dynamic_seed202 dyn202_l2d512_bpr_xlbatch 0.938273

分数层融合后,dynamic_seed202 上最高约为 0.9395,仍明显低于 0.95。

3. 失败或收益有限的方向

以下方向已经尝试过,但没有稳定超过 LightGCN 主线:

方法 结论
更深 LightGCN 4/5 layers 4 层弱于 2 层,5 层大 batch OOM,midbatch 也只有约 0.934-0.935
更宽 LightGCN 768/896/1024 dim 没有显著超过 512 dim
1-layer LightGCN 明显弱,约 0.927
BCE loss 明显失败,约 0.86
hinge loss 比 BCE 好,但仍低于 BPR
normalized embedding training 明显弱
MF/BPR 约 0.92
SAGE/BPR 约 0.926
HGT / graph attention 128/256d 约 0.920-0.924,384d OOM
standalone handcrafted LightGBM 单独约 0.944-0.945 OOF,高于早期版本但仍不如 hybrid

注意:HGT 是比普通 GAT 更强的 heterogeneous graph attention/Transformer 变体,但在当前全图训练设定下没有追上 LightGCN。

4. 有效突破:Hybrid Stacking / Rank Calibration

最终有效提升来自以下组合:

LightGCN score + rank features + explicit graph/meta-path features -> LightGBM stacking

4.1 输入特征

对每个 author-paper pair 构造:

  • score_lgcn
  • global rank of LightGCN score
  • author-wise rank of LightGCN score
  • author degree
  • paper degree
  • coauthor count
  • coauthors_read_paper_count
  • coauthors_read_paper_ratio
  • paper citation in/out degree
  • overlap between author historical papers and candidate paper references
  • overlap between author historical papers and papers citing candidate paper
  • Jaccard versions of the above overlaps
  • A-A-P count / binary feature
  • A-P-P count
  • A-P-A-P count / ratio

4.2 OOF 训练方式

为了避免在 validation 上训练又在同一批 validation 上评估造成虚高,stacking 使用 5-fold OOF:

  • 每次用 4/5 validation rows 训练 LightGBM。
  • 用剩余 1/5 预测。
  • 拼成完整 validation OOF 分数。
  • 最后搜索 threshold,使 F1 最大。

4.3 动态 split 结果

split LightGCN raw handcrafted only stack LightGCN + handcrafted
dynamic_seed201 0.937696 0.944096 0.955874
dynamic_seed202 0.938576 0.944992 0.955992
dynamic_seed203 0.938555 0.945094 0.955588
dynamic_seed204 0.937888 0.943760 0.955557

结论:显式图结构和 meta-path 特征稳定补上了 LightGCN 的盲区,是目前真正突破 0.95 的关键。

5. Test 正例比例校准

由于 validation 是人工 1:1 构造,直接使用 validation threshold 到 test 不可靠。因此提交阶段采用 rank cutoff:

按 hybrid test score 排序,取 top ratio 为 1,然后强制 known positives 为 1。

本地 4 个 dynamic split 的 OOF 最优 threshold 对应预测正例比例:

split pred_ratio best F1
dynamic_seed201 0.4993 0.955874
dynamic_seed202 0.5013 0.955992
dynamic_seed203 0.4989 0.955588
dynamic_seed204 0.5037 0.955557

固定 ratio sweep 的 4-split 均值:

ratio mean F1
0.500 0.955632
0.502 0.955574
0.498 0.955532
0.504 0.955521
0.505 0.955361
0.506 0.955307
0.521 0.951956
0.530 0.948353

这解释了为什么最初 0.521 偏高,而 public LB 上 0.5000.505 更好。

用户提交反馈:

  • submission_stack_r0.505_fixed.csv: public LB 约 0.95218
  • submission_stack_r0.500_fixed.csv: public LB 约 0.95306
  • submission_post95_ens_r0.500.csv: public LB 约 0.95760
  • submission_post95_content_mf_lgb_score_ge0.500.csv: public LB 约 0.95996

当前最可信的比例区间是:

0.498 - 0.504

如果提交次数有限,优先保留 0.500 附近。

6. 已生成文件

主要代码:

  • code/stack_rank_calibration.py
  • code/train_val_lgcn_ensemble.py
  • code/search_dynamic_fusion.py
  • code/train_val_sage_bpr.py
  • code/train_val_hgt_bpr.py

主要结果:

  • validation_runs/stack_threshold_summary.csv
  • validation_runs/stack_ratio_analysis.csv
  • validation_runs/dynamic_seed202/stack_rank_calibration/result.csv
  • validation_runs/dynamic_seed203/stack_rank_calibration/result.csv
  • validation_runs/dynamic_seed201/stack_rank_calibration/result.csv
  • validation_runs/dynamic_seed204/stack_rank_calibration/result.csv

提交候选:

  • validation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.500_fixed.csv
  • validation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.502_fixed.csv
  • validation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.504_fixed.csv
  • validation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.505_fixed.csv

提交格式已修正为:

Index,Predicted

并检查:

  • 行数正确:2,047,262 条预测。
  • Index 连续。
  • Predicted 只有 0/1。
  • train/test overlap known positives 均强制为 1。

7. 当前结论

当前最有效方案不是单纯放大 GNN,也不是单独依赖 attention,而是:

保留 LightGCN backbone,
显式加入 coauthor / citation / degree / overlap / meta-path 特征,
用 LightGBM 做 OOF stacking,
再加入多 LightGCN 变体分数/rank/mean/std 作为二级特征,
最后基于 OOF ratio 进行 test rank cutoff 校准。

这个方案在 seed202 dynamic split 上达到 0.957070 validation F1,并在 public LB 上达到 0.95760。后续加入 pure content mean-cos 和 BPR-MF score 后,public LB 进一步达到 0.95996。

8. Post-0.95 incremental ablation

按要求保留当前 LightGCN + LightGBM stacking 主流程,只做增量优化。新增脚本:

  • code/post95_ablation.py

seed202 上的逐步消融结果:

stage validation F1 precision recall features
baseline stacking 0.955992 0.954790 0.957196 22
+ group threshold by author_degree 0.956121 0.955925 0.956317 22
+ group threshold by score_lgcn 0.952937 0.938049 0.968304 22
+ author quota by degree 0.816287 0.771479 0.866622 22
+ negative evidence features 0.955757 0.955519 0.955995 30
+ top-k paper similarity features 0.956571 0.953112 0.960054 33
+ ensemble LightGCN score features 0.957070 0.960724 0.953445 76

输出文件:

  • validation_runs/dynamic_seed202/post95_ablation/ablation_table.csv
  • validation_runs/dynamic_seed202/post95_ablation/error_analysis_buckets.csv
  • validation_runs/dynamic_seed202/post95_ablation/*_oof.npy
  • validation_runs/dynamic_seed202/post95_ablation/lgcn_variant_feature_names.txt

错误分析结论:

  • paper_degree < 1paper_degree 1-3 是最明显短板,F1 分别约 0.754 和 0.862。
  • score_lgcn 中间段错误最多,尤其 (2.198, 3.583] F1 约 0.647,(3.583, 4.934] F1 约 0.889。
  • author_internal_rank 前几名并不总可靠,[1,3) F1 约 0.497,[3,5) F1 约 0.602,说明对每个作者内部低排名或边界候选需要额外 rerank。
  • paper_degree、高 score_lgcn、高 author_internal_rank 区间已经非常稳,后处理不应大幅扰动这些样本。

当前新增方法判断:

  • 有效:author_degree 分组阈值、小幅 top-k 相似度特征、多 LightGCN 变体 score/rank/mean/std 特征。
  • 暂时无效:按 score_lgcn 分组阈值、简单 author quota、当前定义的 negative-evidence 特征。
  • 需要继续验证:把 top-k similarity 从 feature.pkl 内容向量换成 LightGCN paper embedding;在 seed201/203/204 上复测 ensemble score 特征;只对 score_lgcn 中间段和低 paper_degree 样本做局部 rerank。

9. Post-0.95 submission generation

新增提交生成脚本:

  • code/generate_post95_submission.py

生成逻辑:

  • 使用 seed202 dynamic validation split 训练二级 LightGBM。
  • 特征集合保持为 seed202 消融最优的 76 维:
    • LightGCN main score/rank/author rank
    • explicit graph/meta-path features
    • negative-evidence features
    • top-k paper content similarity
    • selected multi-LightGCN variant score/rank/mean/std features
  • test 侧显式图特征使用 full train graph。
  • test 侧 LightGCN 变体分数由保存的 checkpoint 前向推理生成,并缓存到 validation_runs/dynamic_seed202/post95_test_scores/
  • 提交文件强制使用 Kaggle 要求的 Index,Predicted 格式,并对 known positive test mask 强制置 1。

生成文件:

  • validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.498.csv
  • validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.500.csv
  • validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.502.csv
  • validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.504.csv
  • validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.505.csv
  • validation_runs/dynamic_seed202/post95_submission/test_post95_ens_pred.npy
  • validation_runs/dynamic_seed202/post95_submission/selected_variant_val_scores.txt

格式检查:

  • 行数:2,047,262 条预测加 1 行 header。
  • 表头:Index,Predicted
  • Index 从 0 到 2,047,261 连续递增。
  • Predicted 只有 0/1。

建议优先提交:

validation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.500.csv

原因:旧版 public LB 最好的比例也是 0.500,且 4 个 dynamic split 的 ratio sweep 均值显示 0.500 附近最稳。

提交反馈:

submission ratio public LB
submission_stack_r0.500_fixed.csv 0.500 0.95306
submission_post95_ens_r0.500.csv 0.500 0.95760
submission_post95_content_mf_lgb_score_ge0.500.csv score >= 0.500 0.95996

submission_post95_content_mf_lgb_score_ge0.500.csv 是目前已验证的最佳版本。相比旧的 hybrid stacking,核心改进是:

  • 继续保留 LightGCN + explicit graph features + LightGBM stacking。
  • 增加 top-k paper content similarity 特征。
  • 增加多个 LightGCN 变体的 score、rank、mean、std 特征,让二级 LightGBM 学习不同 LightGCN 视角下的一致性和分歧。
  • 额外增加 pure content mean-cos score 和 BPR-MF score。
  • 当前最佳提交使用 fixed probability threshold:score >= 0.500

10. XGBoost second-stage trial

在同样的 seed202 dynamic split 和同样的 76 维 post95 特征上,将二级模型从 LightGBM 换成 XGBoost 做 5-fold OOF:

second-stage model validation F1 threshold AUC precision recall
LightGBM 0.957070 0.506129 0.992189 0.960724 0.953445
XGBoost 0.957426 0.452655 0.992390 0.956048 0.958808

XGBoost 在 validation 上比 LightGBM 高约 0.00036,属于小幅增益,值得提交验证。

生成的 XGBoost 提交候选:

  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.498.csv
  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.500.csv
  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.502.csv
  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.504.csv
  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.505.csv
  • validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_score_ge0.500.csv

优先提交:

validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.500.csv

如果想验证 fixed probability threshold,则提交:

validation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_score_ge0.500.csv

11. Extra non-LightGCN score sources

按新增要求,在不替换 post95 主流程的前提下,额外尝试了几类不同来源的分数特征:

  • pure content mean-cos score:作者历史论文内容向量均值与候选论文内容向量的 cosine。
  • BPR-MF score:只基于 author-paper 交互训练的矩阵分解 BPR 模型。
  • LGBMRanker score:使用 post95 76 维特征,按 author_id 分组做 LambdaRank 排序,输出 OOF ranker score。

新增脚本:

  • code/extra_score_sources_ablation.py
  • code/generate_extra_bprmf_submission.py

seed202 validation 消融结果:

stage validation F1 threshold AUC precision recall features
post95_lgbm_baseline 0.957110 0.473307 0.992215 0.957742 0.956478 76
+ content mean-cos 0.957629 0.443363 0.992198 0.954998 0.960274 80
+ BPR-MF 0.959308 0.446104 0.992757 0.957718 0.960904 84
+ LGBMRanker author-group 0.959025 0.478800 0.992529 0.960477 0.957577 88

结论:

  • BPR-MF 是这轮最有效的新分数源,虽然单模型 validation F1 只有约 0.920,但放进 post95 stacking 后带来明显增益。
  • pure content mean-cos 有小幅正收益,说明它和 top-k similarity 不是完全重复。
  • LGBMRanker 本身按 author 分组排序很强,但在已经加入 content + BPR-MF 后没有继续提升;当前不建议优先提交 ranker 叠加版。
  • Node2Vec 依赖已安装并确认可 import,但尚未完成 embedding 训练和提交生成,作为下一轮继续探索。

当前新增推荐提交:

validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_score_ge0.500.csv

备用:

validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_r0.500.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_r0.498.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_r0.502.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_r0.504.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_r0.505.csv

格式检查:

  • 表头:Index,Predicted
  • 行数:2,047,262 条预测加 1 行 header
  • Index 连续递增
  • Predicted 只有 0/1

提交反馈:

submission decision rule public LB
submission_post95_ens_r0.500.csv rank top 50.0% 0.95760
submission_post95_content_mf_lgb_score_ge0.500.csv score >= 0.500 0.95996

因此当前最强方案是:

post95 76维特征
+ pure content mean-cos score
+ BPR-MF score
+ LightGBM 二级模型
+ score >= 0.500

12. Rich feature.pkl content features

进一步加强 feature.pkl 的利用,不再只用 top-k similarity 和 mean-cos,而是加入作者内容画像和候选论文相对作者历史分布的位置。

新增脚本:

  • code/content_rich_ablation.py
  • code/generate_content_rich_submission.py

新增 rich content 特征包括:

  • author content center cosine
  • candidate 到 author content center 的 L2 distance
  • author history embedding variance / dispersion
  • author historical paper pairwise cosine mean
  • candidate 与历史论文的 max / mean / std / median similarity
  • candidate 与历史论文的 top3 / top5 / top10 mean similarity
  • similarity above 0.5 / 0.7 的比例
  • content rank / percentile within the same author's candidate set

seed202 validation 消融:

stage validation F1 threshold AUC precision recall features
content_mf_baseline 0.959285 0.478013 0.992830 0.961013 0.957563 84
rich_content_only_lgb 0.873182 0.437771 0.946715 0.871354 0.875018 18
+ rich_content_features 0.959905 0.452128 0.992864 0.958747 0.961065 102
+ rich_content_model_score 0.959448 0.462284 0.992920 0.959048 0.959849 106

结论:

  • rich content 原始特征有效,把 validation F1 从 0.959285 提升到 0.959905。
  • 只基于 rich content 的模型本身不强,且把它的 OOF score 再融合反而低于直接加入原始 rich content 特征。
  • test 上 score >= 0.500 的正类比例为 0.4950,和当前最高的 content+BPR-MF ge0.5 版本不同;因此 rich content 版本建议先试 rank cutoff。

生成的 rich content 提交候选:

validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.500.csv
validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.498.csv
validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.502.csv
validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.504.csv
validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.505.csv
validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_score_ge0.500.csv

优先验证:

validation_runs/dynamic_seed202/content_rich_submission/submission_content_rich_mf_lgb_r0.500.csv

13. Threshold refinement around current best

当时最高 public LB 来自:

validation_runs/dynamic_seed202/extra_bprmf_submission/submission_post95_content_mf_lgb_score_ge0.500.csv
public LB = 0.95996

该版本使用 score >= 0.500,实际 test 正类比例约 0.49734。围绕 0.500 做了局部阈值微调,并额外生成 rank-ratio 版本:

validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.4850.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.4900.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.4950.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.4975.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.5000.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.5025.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_th0.5050.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_rank_r0.497.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_rank_r0.498.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_rank_r0.499.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_rank_r0.500.csv
validation_runs/dynamic_seed202/extra_bprmf_submission/threshold_refine_ge0500/submission_content_mf_lgb_rank_r0.501.csv

阈值版本对应正类比例:

threshold positive ratio
0.4850 0.49880
0.4900 0.49832
0.4950 0.49782
0.4975 0.49760
0.5000 0.49734
0.5025 0.49711
0.5050 0.49686

建议优先尝试:

submission_content_mf_lgb_th0.4950.csv
submission_content_mf_lgb_th0.4850.csv
submission_content_mf_lgb_rank_r0.499.csv

14. DeepWalk / Node2Vec score sources

继续尝试非 LightGCN 图 embedding 分数源。构图使用混合无向图:

  • author-paper dynamic train edges,权重 3.0
  • author coauthor edges,权重 1.0
  • paper citation edges,权重 1.0

新增脚本:

  • code/node2vec_deepwalk_ablation.py
  • code/generate_node2vec_deepwalk_submission.py

轻量配置:

  • dim = 128
  • walk_length = 24
  • num_walks = 4
  • window = 8
  • Node2Vec p = 1.0, q = 2.0

seed202 validation 消融:

stage validation F1 threshold AUC precision recall features
content_mf_baseline 0.959285 0.478013 0.992830 0.961013 0.957563 84
+ DeepWalk 0.961796 0.466974 0.993513 0.961296 0.962296 92
+ DeepWalk + Node2Vec 0.962115 0.455694 0.993570 0.960752 0.963483 100

结论:

  • DeepWalk/Node2Vec 明显有效,是目前 validation 上最强的增量分数源。
  • Node2Vec 在 DeepWalk 基础上仍有小幅增益。
  • 这类 embedding 与 LightGCN/BPR-MF/content 特征互补,主要提供随机游走意义下的结构接近度。

生成提交:

validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.498.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.499.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.500.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.501.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.502.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_th0.455694.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_th0.480000.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_th0.490000.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_th0.500000.csv

优先提交:

validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_r0.500.csv
validation_runs/dynamic_seed202/node2vec_deepwalk_submission/submission_content_mf_deepwalk_node2vec_lgb_th0.480000.csv

这两个版本的正类比例都约为 0.500。

提交反馈:

submission family decision rule public LB
submission_post95_content_mf_lgb_score_ge0.500.csv score >= 0.500 0.95996
submission_content_mf_deepwalk_node2vec_lgb_th0.480000.csv score >= 0.480000 0.96252

DeepWalk + Node2Vec + content + BPR-MF + post95 LightGBM 是目前已验证的最佳方案。相比 0.95996 版本,主要新增了随机游走图 embedding 分数源:

DeepWalk cosine/dot score + rank features
Node2Vec cosine/dot score + rank features

这说明随机游走结构接近度和已有的 LightGCN、BPR-MF、content features 存在明显互补。

15. Random-walk systematic ablation

在不替换主 pipeline 的前提下,继续专门压榨 DeepWalk / Node2Vec 特征。固定基础特征为:

  • post95 LightGCN stacking 特征
  • explicit graph handcrafted features
  • content mean-cos / top-k content similarity
  • BPR-MF score
  • LightGCN ensemble score/rank features

只新增或替换 random-walk embedding 特征。每个 embedding 版本为 author-paper pair 构造:

dot, cosine, hadamard_mean, absdiff_mean, l2_distance,
dot/cos global rank,
dot/cos author-wise rank,
dot/cos author-wise percentile

新增脚本:

code/randomwalk_systematic_ablation.py
code/randomwalk_one_ablation.py
code/generate_randomwalk_single_submission.py
code/generate_randomwalk_ensemble_submission.py
code/randomwalk_ensemble_ablation.py

关键 validation 结果:

version graph method dim walk_length p/q validation F1 threshold AUC
dw_base_d128_l40 full DeepWalk 128 40 - 0.962734 0.513498 0.993767
dw_long_d128_l80 full DeepWalk 128 80 - 0.963096 0.508277 0.993874
dw_highdim_d256_l40 full DeepWalk 256 40 - 0.963328 0.500688 0.993841
dw_graph_ap_only AP only DeepWalk 128 40 - 0.961057 0.487265 0.993165
dw_graph_ap_aa AP+AA DeepWalk 128 40 - 0.960774 0.514391 0.993194
dw_graph_ap_pp AP+PP DeepWalk 128 40 - 0.962939 0.455344 0.993774
n2v_p0.5_q1 full Node2Vec 128 40 0.5/1 0.962042 0.462000 0.993666
n2v_p2_q1 full Node2Vec 128 40 2/1 0.962576 0.494402 0.993727
5-model rw ensemble mixed ensemble mixed mixed mixed 0.963932 0.500695 0.994246

结论:

  • 提高 DeepWalk 维度到 256 是当前最有效的单点改动,说明 random-walk embedding 容量仍有收益。
  • walk_length 从 40 提到 80 也稳定提升,说明更长路径补充了 LightGCN / handcrafted features 没完全覆盖的结构关系。
  • AP+PP 图优于 AP-only 和 AP+AA,论文引用边对 random-walk embedding 很关键。
  • Node2Vec 单独不超过最强 DeepWalk,但 p=2,q=1 版本和 DeepWalk 有互补性。
  • 5 模型 ensemble 把 full DeepWalk base/long/highdim、AP+PP DeepWalk、Node2Vec p2q1 合并后,本地 F1 达到 0.963932,是当前 validation 最强 random-walk 方案。

当前优先提交:

validation_runs/dynamic_seed202/randomwalk_ensemble_submission/submission_rwens_dw_basel40_dw_longl80_dw_highdim_d256_l40_dw_graph_ap_pp_n2v_p2_q1l40_r0.500.csv
validation_runs/dynamic_seed202/randomwalk_ensemble_submission/submission_dw_highdim_d256_l40_w10_win10_r0.500.csv
validation_runs/dynamic_seed202/randomwalk_ensemble_submission/submission_dw_long_d128_l80_w10_win10_r0.500.csv

注意:这些版本优先使用 top-ratio 规则保持约 50% 正例比例。对应 score threshold 版本在 test 上正例比例漂到 52%-54%,暂不作为首选提交。

16. Public feedback after larger random-walk ensembles

后续继续增加 random-walk 版本:

version validation F1 notes
dw_d256_l80 0.963371 dim=256 + walk_length=80,单模型略高于 highdim
7-model rw ensemble 0.964921 base/long/highdim/d256l80/seed3407/AP+PP/n2v_p2q1

但是 7-model rw ensemble r0.500 public LB 反馈只有约 0.96229,低于已知较好的 0.96252。这说明 seed202 validation 对“更多 random-walk 模型堆叠”偏乐观,继续无约束加模型会过拟合当前动态 split。

因此策略调整为:

  • 不再把 validation F1 最高的大 ensemble 作为默认首选。
  • 以 public 已验证较好的 submission_content_mf_deepwalk_node2vec_lgb_th0.480000.csv / 其 score rank 为锚点。
  • 只用 10%-20% 权重混入 highdim、d256l80、ens5/ens7 rank,控制相对锚点的 prediction changes。
  • 继续使用约 50% positive ratio,避免 score threshold 在 test 上漂到 52%-54%。

保守 blend 文件:

validation_runs/dynamic_seed202/randomwalk_conservative_blends/blend_anchor90_highdim10_r0.500.csv
validation_runs/dynamic_seed202/randomwalk_conservative_blends/blend_anchor85_highdim15_r0.500.csv
validation_runs/dynamic_seed202/randomwalk_conservative_blends/blend_anchor90_d256l80_10_r0.500.csv

这些文件相对 public anchor 只改约 2700-4300 个预测,比 7-model ensemble 直接改约 31900 个预测保守很多,更适合下一轮提交窗口测试。

17. High-order citation propagation breakthrough

在停止继续 random-walk 参数搜索之后,新的有效突破来自显式高阶图传播特征。这个方向不是再训练更多 DeepWalk / Node2Vec embedding,而是把学术推荐中可解释的 citation meta-path 直接作为 pair-level 特征加入二级 LightGBM。

新增脚本:

code/high_order_graph_stack.py
code/rich_randomwalk_stack.py

17.1 方法动机

DeepWalk / Node2Vec 提供的是随机游走意义下的结构接近度,能够捕捉全局图邻近性,但 embedding 会把具体路径类型压缩进向量里,模型无法直接区分信号来自作者历史论文、合作者历史论文、引用前向路径还是引用反向路径。

High-order citation propagation 的核心思想是显式计算:

author -> historical papers -> citation graph -> candidate paper

也就是 meta-path:

A-P-P^k

同时加入合作者版本:

A-A-P-P^k

这类特征直接回答:候选论文是否处在作者本人或合作者历史论文的 citation neighborhood 中。

17.2 数学形式

设:

  • R 为 author-paper 历史交互矩阵。
  • C 为 paper-paper citation 邻接矩阵。
  • S 为 author-author coauthor 邻接矩阵。

所有矩阵做 row normalization 后,作者自身的 k-hop citation propagation 为:

H_k = R_norm C_norm^k

对 validation / test pair (a, p),取:

H_k[a, p]

作为特征。合作者传播为:

G_k = S_norm R_norm C_norm^k

对 pair (a, p),取:

G_k[a, p]

Directed 版本中,C_norm 进一步拆成三类:

C_forward_norm
C_backward_norm
C_undirected_norm

因此模型能区分:

  • 作者历史论文引用过的方向。
  • 引用作者历史论文或其邻域的方向。
  • 不关心方向的 citation neighborhood 接近度。

为了降低热门论文天然容易被多条路径命中的偏置,每个传播分数还加入 popularity-normalized 版本:

propagation_score / log(1 + paper_degree + citation_degree)

17.3 Validation 和 public 结果

post95 + content/BPR-MF + rich content + 7 systematic random-walk blocks 的基础上,加入 high-order propagation 后得到:

stage validation F1 threshold AUC notes
rich_rw7 0.964947 0.490447 0.994555 rich content + 7 random-walk blocks
rich_rw7_highorder 0.966556 0.469339 0.994890 加入无向 citation high-order propagation
rich_rw7_highorder_directed 0.966874 0.461731 0.994918 加入 forward/backward/undirected directed propagation

生成的主要提交:

validation_runs/dynamic_seed202/high_order_graph_stack/submissions/submission_rich_rw7_highorder_directed_r0.500000.csv

提交反馈:

submission decision rule public LB
submission_content_mf_deepwalk_node2vec_lgb_th0.480000.csv score >= 0.480000 0.96252
submission_rich_rw7_highorder_directed_r0.500000.csv rank top 50.0% 0.96626

这是继“加入显式图结构 / content / BPR-MF stacking”和“加入 DeepWalk / Node2Vec random-walk embedding”之后的第三次实质突破。它说明 citation graph 中的显式高阶路径和 random-walk embedding 是互补的:random-walk embedding 提供全局结构接近度,high-order propagation 提供可解释的 typed meta-path 证据。

可以在正式报告中将该点表述为:

We introduce citation-aware high-order propagation features that explicitly model author-paper relevance through typed meta-paths such as A-P-P^k and A-A-P-P^k over directed and undirected citation graphs. These features complement neural graph embeddings by preserving interpretable path semantics and reducing popularity bias through degree-normalized propagation scores.

18. Validation threshold vs test rank cutoff

这轮还暴露出一个重要现象:validation 上最优 probability threshold 不能直接迁移到 test,但 rank cutoff 更稳定。

rich_rw7_highorder_directed 在 validation 上的最优 threshold 是:

0.461730808

用这个 threshold 直接切 test score,生成:

validation_runs/dynamic_seed202/high_order_graph_stack/submissions/submission_rich_rw7_highorder_directed_th0.461731.csv

但是 test 正例比例漂到了:

0.524195

相比之下,public 表现好的 r0.500000 使用的是 rank cutoff:

按 test score 排序,取 top 50% 为 1,再强制 known positives 为 1。

该版本正例比例为:

0.500000

阈值版本和 ratio 版本的对比如下:

rule test positive ratio changed vs previous anchor
th0.461731 0.524195 55,638
th0.480000 0.522134 52,513
th0.500000 0.519917 49,277
r0.500000 0.500000 34,863

这个现象说明二级模型的输出更适合作为排序分数,而不是跨 split 稳定校准的概率。

主要原因:

  • 当前 validation 是人工 1:1 构造:从 train edges 抽 10% 作为 positives,再随机采同数量 negatives。这个分布和 Kaggle test candidate 分布不完全一致。
  • LightGBM / XGBoost 的 predict_proba 并不是经过校准的真实概率,同一个 score threshold 在 validation 和 test 上可能对应不同的正例比例。
  • test 中存在大量 train/test overlap known positives,后处理会强制这些 pair 为 1。固定 threshold 更容易被该后处理推高整体正例比例。
  • F1 对预测正例比例非常敏感。之前多轮 public feedback 表明稳定区间大致在 0.498 - 0.502,而 validation-best threshold 在 test 上会推到约 0.524,很可能引入大量 false positives。

因此,当前更稳的提交策略是:

模型负责学习排序;
test 阶段使用 rank-based cutoff 控制正例比例;
不要直接迁移 validation probability threshold。

可以将这一点总结为:

The second-stage model is a strong ranker but a poorly calibrated probability estimator under validation-test distribution shift. Rank-based cutoff is therefore more robust than transferring the validation-optimal probability threshold to the test set.