cs3319-project2 / WORKSPACE_STATUS.md
NLP-beginner's picture
CS3319 Project 2 final deliverable (public F1 = 0.96626)
f28d994
|
Raw
History Blame Contribute Delete
12.6 kB
# WORKSPACE STATUS — CS3319 Project 2 Final Deliverable
> 本文件由代码仓库快速勘察生成,用于帮助后续开发者快速熟悉本目录。
> **最后更新**:2026-06-17
---
## 一、项目简介
### 1.1 项目定位
本项目是 **CS3319 推荐系统课程(Project 2)的最终交付物**
- **业务目标**:构建**学术论文阅读推荐系统**——在学术平台上为学者推荐其可能感兴趣/应阅读的论文。
- **建模方式**:形式化为**异构学术网络中的链路预测(Link Prediction)**问题。
- **网络结构**:
- 节点:作者(author,0–6610)、论文(paper,0–79936)
- 边:作者-论文阅读/引用关系(二部图)、作者-作者合著关系(无向)、论文-论文引用关系(有向)
- **预测任务**:对测试集中的每个 `(author, paper)` 对,输出 `1`(推荐)/`0`(不推荐)。
- **评估指标**:Public Leaderboard **F1**
- **最佳确认成绩**:**Public F1 = 0.96626**
- 方法:rich content + 7 个随机游走块 + 有向高阶引用传播 + LightGBM,rank top 50% 决策。
### 1.2 核心技术栈
- **语言**:Python 3.10
- **数据处理**:`numpy``pandas``scipy`
- **传统机器学习**:`scikit-learn``lightgbm``xgboost`
- **深度学习 / GNN**:`torch``torch-geometric`
- **图嵌入 / 随机游走**:`gensim``node2vec``networkx`
- **核心模型族**:LightGCN 风格异构图卷积推荐器(BPR loss + hard negatives),最终方案为多源特征 + LightGBM 二阶段堆叠。
### 1.3 数据来源
数据由 Acemap group 提供,采集自 GeoScience 领域顶刊:
- **6,611 位作者****79,937 篇论文**及其引用信息。
- 论文节点附带预训练特征 `feature.pkl`
---
## 二、目录结构解析
```
26H1_cs3319_final_deliverable/
├── README.md 项目总览、最佳成绩、复现命令
├── WORKSPACE_STATUS.md 本文件(项目现状日志)
├── code/ 核心:全部训练与提交生成脚本(详见第五节)
├── data_and_docs/ 官方数据 + 课程文档
│ ├── bipartite_train_ann.txt 训练集二部网络(author-paper)
│ ├── bipartite_test_ann.txt 测试集待预测对
│ ├── author_file_ann.txt 作者合著网络(无向)
│ ├── paper_file_ann.txt 论文引用网络(有向)
│ ├── feature.pkl 论文预训练特征(约 156 MB)
│ ├── dataset.md / project_description.md / advice.md 数据/项目说明
│ ├── proposal.md 开题提案
│ ├── references.md 参考文献
│ ├── project_evaluation.md 评估说明
│ ├── project-example-2026-pygver.ipynb 官方示例 Notebook(PyG 版)
│ └── project2_ recmendation systems.pdf 课程项目书
├── checkpoints/ LightGCN 模型权重(⚠️ 当前为空,见第四节)
│ ├── extra_models/
│ └── final_ens6/
├── cached_scores/ 早期缓存的分数/模型
│ ├── lgb_model.pkl / lgb_v2_model.pkl
│ ├── test_bpr_cos.npy / test_bpr_dot.npy
│ ├── test_lgb_scores.npy / test_lgb_v2_scores.npy
│ ├── test_known_mask.npy
│ ├── dot_full/
│ └── large_ensemble/
├── validation_runs/ 验证运行结果
│ ├── dynamic_summary.csv
│ ├── stack_ratio_analysis.csv
│ ├── stack_threshold_summary.csv
│ ├── dynamic_seed202/ (⚠️ 仅目录壳,内容缺失)
│ └── feature_cache/ (⚠️ 仅目录壳,内容缺失)
├── submissions/ 已确认的提交文件
│ ├── sub_ens6_t0.35.csv
│ ├── sub_ens6_t0.36.csv ← 纯 LightGCN 路线最佳(公开 0.93044)
│ └── sub_ens6_t0.37.csv
├── reports/ 报告
│ ├── preliminary_report.md
│ ├── exploration_summary.md
│ └── final_report.md
├── notes/
│ └── experiment_history.md 完整实验历史(10 个阶段)
└── manifests/ 原始传输包的文件清单
├── package_manifest.txt 完整交付包文件+大小清单
├── final_deliverable_filelist.tsv
├── home_artifacts_manifest.txt
└── key_files_sha256.txt
```
---
## 三、运行与配置
### 3.1 环境配置(⚠️ 配置文件当前缺失)
README 引用的环境文件位于 `env/` 目录:
```
env/environment-cs3319.yml
env/requirements-minimal.txt
```
**注意**:本目录下 **`env/` 文件夹不存在**(本副本为精简包,详见第四节)。如需重建环境,可参照 `manifests/package_manifest.txt``manifests/home_artifacts_manifest.txt` 中的 `conda-list-cs3319.txt` 记录,或按以下核心依赖手动安装:
```bash
# Python 3.10
pip install numpy pandas scipy scikit-learn lightgbm xgboost \
torch torch-geometric gensim node2vec networkx
```
### 3.2 快速验证最终结果(只读)
```bash
cd cs3319_final_deliverable
# 查看最终验证指标(注:依赖 validation_runs/dynamic_seed202/,当前缺失)
cat validation_runs/dynamic_seed202/high_order_graph_stack/validation_summary.csv
# 查看最终提交生成摘要(注:同上,当前缺失)
cat validation_runs/dynamic_seed202/high_order_graph_stack/submission_summary.csv
```
预期关键验证行(README 记录):
```
rich_rw7_highorder_directed validation F1 = 0.966873736337297
```
### 3.3 复现最终高阶堆叠方法(⚠️ 依赖缺失,当前可能不可运行)
```bash
python code/high_order_graph_stack.py \
--package-root . \
--split-seed 202 \
--seed 202 \
--n-splits 5 \
--make-submission
```
**依赖前提**:需要 `validation_runs/dynamic_seed202/`(OOF/test 分数、随机游走权重)与 `validation_runs/feature_cache/`(高阶/富内容特征)。当前两者内容均缺失,直接运行大概率会因找不到输入文件而失败。
### 3.4 复现早期 6 模型 LightGCN 集成(⚠️ 权重缺失)
```bash
python code/generate_ens6_submission.py \
--package-root . \
--device cuda:0 # 或 cpu
```
**依赖前提**:需要 `checkpoints/final_ens6/model_lgcn_*.pt`。当前该目录为空,无法直接运行。
---
## 四、当前状态与进度
### 4.1 开发阶段(已完成,据 `notes/experiment_history.md`)
项目经历了 10 个实验阶段,可归为四条主线:
| 阶段 | 方法 | 代表脚本 | 结果 |
|---|---|---|---:|
| A. GNN 基线 | 异构 GNN(SAGEConv/HeteroMeanConv + BCE/BPR) | `run_baseline.py`、`run_improved.py`、`run_v2.py` | 验证 F1 ≈ 0.885–0.92 |
| B. LightGCN 主线 | 原生 LightGCN + BPR + hard negatives + 多 seed 集成 | `run_final.py``run_lgcn_final.py``generate_ens6_submission.py` | 公开 0.93044 |
| C. 特征模型 | LightGBM 结构特征 / BPR-MF / 随机游走 | `run_graph_features.py``extra_score_sources_ablation.py` | 公开 0.95760–0.96252 |
| D. 高阶堆叠(最终) | rich content + 7 RW 块 + 高阶引用传播 + LightGBM | `high_order_graph_stack.py` | **公开 0.96626** |
**最终方法**:LightGBM 二阶段堆叠,特征包括 LightGCN 分数/排名、图与元路径特征、内容余弦相似度、BPR-MF、富作者内容画像、7 个 DeepWalk/Node2Vec 块、随机游走一致性、高阶引用传播(`A-P-P^k``A-A-P-P^k` 等)。决策规则为 **rank top 50%**(而非概率阈值,更鲁棒地应对验证-测试分布偏移)。
### 4.2 ⚠️ 仓库当前状态(重要)
**1) 非 Git 仓库**
- 本目录 **`.git` 不存在**,**无法**查看分支、未提交改动或提交历史。
- 所有版本管理信息不可用,无法通过 git 追溯变更。
**2) 精简/部分副本**
与 README 及 `manifests/package_manifest.txt` 描述的完整交付包相比,本目录缺失多项关键产物:
| 缺失项 | 影响 |
|---|---|
| `env/`(环境配置目录) | 无法直接还原 conda/pip 环境 |
| `checkpoints/extra_models/``checkpoints/final_ens6/`(权重 `.pt`) | 无法复现任何 LightGCN 推理/集成 |
| `validation_runs/dynamic_seed202/`(OOF/test 分数、RW 权重、最终提交) | 无法复现/验证最终高阶堆叠方法 |
| `validation_runs/feature_cache/`(高阶/富内容特征) | 同上 |
| `submissions/``sub_final3_*``sub_noforce_*``sub_forced_*` | 早期对比提交缺失 |
**结论**:当前目录本质是**代码 + 数据 + 文档 + 部分早期缓存**的快照,**不包含最终方法所需的权重与缓存特征**,因此**无法直接复现最终成绩 0.96626**。如需完整复现,需从原始传输包(参见 `manifests/`)重新获取缺失的大体积产物。
### 4.3 未完成 / 受限事项
- [ ] **恢复 `env/` 环境配置文件**,或补全依赖清单以便重建运行环境。
- [ ] **恢复 `checkpoints/` 下的 LightGCN 权重**,以支持推理/集成复现。
- [ ] **恢复 `validation_runs/dynamic_seed202/` 与 `feature_cache/`**,以支持最终高阶方法的复现与验证。
- [ ] (可选)**初始化 Git 仓库**以启用版本管理:`git init`。
---
## 五、核心脚本速查表
### 训练 / 基线类
| 脚本 | 用途 |
|---|---|
| `run_baseline.py` | 官方 Notebook 基线(HeteroMeanConv + cosine + 阈值搜索) |
| `run_improved.py` | 改进异构 GNN(HeteroConv+SAGEConv + 残差/LN + MLP 解码 + hard negatives) |
| `run_v2.py` | SAGEConv + BPR 排序变体 |
| `run_final.py` | 原生 LightGCN 最终版(早期) |
| `run_lgcn_final.py` | 原生 LightGCN(主线稳定版) |
| `run_lgcn_v2.py` | L2 归一化 LightGCN 变体(效果劣于原生) |
| `run_graph_features.py` | 手工图特征 + LightGBM |
| `run_ultimate.py` | Ultimate 综合实验 |
| `compare_gnn.py` | GNN 架构搜索(可学习层权/GAT/SAGE/Deep/Wide LightGCN) |
### 动态验证 / 集成训练类(README 核心)
| 脚本 | 用途 |
|---|---|
| `train_val_lgcn_ensemble.py` | **动态验证 LightGCN 训练与分数生成**(核心) |
| `train_dynamic_feature_fusion.py` | 动态特征融合训练 |
| `train_val_mf_bpr.py` | MF + BPR 训练 |
| `train_val_sage_bpr.py` | SAGE + BPR 训练 |
| `train_val_hgt_bpr.py` | HGT + BPR 训练 |
| `evaluate_val_checkpoints.py` | 验证 checkpoint 评估 |
### 消融 / 特征构建类
| 脚本 | 用途 |
|---|---|
| `extra_score_sources_ablation.py` | Content-mean-cos / BPR-MF / ranker 分数源消融 |
| `node2vec_deepwalk_ablation.py` | DeepWalk / Node2Vec 初始消融 |
| `randomwalk_systematic_ablation.py` | **系统随机游走特征实验**(产出最终 7 块) |
| `randomwalk_ensemble_ablation.py` / `randomwalk_one_ablation.py` | RW 集成/单块消融 |
| `content_rich_ablation.py` | **Rich `feature.pkl` 内容特征构建** |
| `post95_ablation.py` | Post95 消融 |
| `high_order_model_compare.py` | 高阶模型对比 |
### 提交生成类
| 脚本 | 用途 |
|---|---|
| `high_order_graph_stack.py` | **最终:高阶引用传播实验 + 提交生成**(产出 0.96626) |
| `generate_ens6_submission.py` | 6 模型 LightGCN 集成提交 |
| `generate_post95_submission.py` | Post95 LightGCN + 图/内容特征提交 |
| `generate_extra_bprmf_submission.py` | BPR-MF 提交 |
| `generate_node2vec_deepwalk_submission.py` | DeepWalk/Node2Vec 提交 |
| `generate_randomwalk_ensemble_submission.py` | 随机游走集成提交(喂入最终阶段) |
| `generate_randomwalk_single_submission.py` | 单随机游走提交 |
| `generate_content_rich_submission.py` | Content-rich 提交 |
| `generate_dot_submission.py` | Dot 内积提交 |
| `generate_large_ensemble_submission.py` | 大型集成提交 |
| `generate_conservative_rw_blends.py` | 保守随机游走混合 |
### 堆叠 / 校准 / 搜索类
| 脚本 | 用途 |
|---|---|
| `rich_randomwalk_stack.py` | Rich 随机游走堆叠 |
| `score_level_meta_stack.py` | 分数级元堆叠 |
| `stack_rank_calibration.py` | 堆叠排序校准 |
| `error_group_calibration.py` | 错误分析/阈值扫描/分组校准/边界模型 |
| `search_dynamic_fusion.py` / `search_val_fusion.py` | 动态/验证融合搜索 |
| `make_notebook_style_split.py` | Notebook 风格数据划分 |
---
## 六、建议阅读顺序(熟悉项目)
1. `README.md` —— 全局概览与复现命令
2. `data_and_docs/dataset.md` + `project_description.md` —— 任务与数据定义
3. `notes/experiment_history.md` —— 完整方法演进史(强烈推荐)
4. `reports/final_report.md` —— 最终方案与结论
5. `reports/preliminary_report.md` + `exploration_summary.md` —— 早期探索