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.pycode/search_dynamic_fusion.pycode/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=3train_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.500 和 0.505 更好。
用户提交反馈:
submission_stack_r0.505_fixed.csv: public LB 约 0.95218submission_stack_r0.500_fixed.csv: public LB 约 0.95306submission_post95_ens_r0.500.csv: public LB 约 0.95760submission_post95_content_mf_lgb_score_ge0.500.csv: public LB 约 0.95996
当前最可信的比例区间是:
0.498 - 0.504
如果提交次数有限,优先保留 0.500 附近。
6. 已生成文件
主要代码:
code/stack_rank_calibration.pycode/train_val_lgcn_ensemble.pycode/search_dynamic_fusion.pycode/train_val_sage_bpr.pycode/train_val_hgt_bpr.py
主要结果:
validation_runs/stack_threshold_summary.csvvalidation_runs/stack_ratio_analysis.csvvalidation_runs/dynamic_seed202/stack_rank_calibration/result.csvvalidation_runs/dynamic_seed203/stack_rank_calibration/result.csvvalidation_runs/dynamic_seed201/stack_rank_calibration/result.csvvalidation_runs/dynamic_seed204/stack_rank_calibration/result.csv
提交候选:
validation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.500_fixed.csvvalidation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.502_fixed.csvvalidation_runs/dynamic_seed202/stack_rank_calibration/ratio_refine_around_0505/submission_stack_r0.504_fixed.csvvalidation_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.csvvalidation_runs/dynamic_seed202/post95_ablation/error_analysis_buckets.csvvalidation_runs/dynamic_seed202/post95_ablation/*_oof.npyvalidation_runs/dynamic_seed202/post95_ablation/lgcn_variant_feature_names.txt
错误分析结论:
paper_degree < 1和paper_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.csvvalidation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.500.csvvalidation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.502.csvvalidation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.504.csvvalidation_runs/dynamic_seed202/post95_submission/submission_post95_ens_r0.505.csvvalidation_runs/dynamic_seed202/post95_submission/test_post95_ens_pred.npyvalidation_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.csvvalidation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.500.csvvalidation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.502.csvvalidation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.504.csvvalidation_runs/dynamic_seed202/post95_xgboost_submission/submission_post95_xgb_r0.505.csvvalidation_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.pycode/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.pycode/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.pycode/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.