How pronob29/pl-ncf-comparison works
1. This repository is an offline recommendation-research pipeline, not an application server. Its core loop is: train models on interaction data, extract learned embeddings, score their recommendation and clustering quality, then aggregate results into tables and plots.
2. The source boundary is src/. It contains the model implementations (mf.py, mlp.py, neumf.py), the pseudo-labeling extension (pl.py), and the training/evaluation stack (train_val_test.py, engine.py, metrics.py, data.py, split_utils.py, support_groups_utils.py, config.py, utils.py).
3. There are six model variants in the experiment matrix: MF, MLP, and NeuMF, each with a baseline version and a pseudo-labeling version. The PL variants add a second embedding branch so the model learns both recommendation embeddings and PL-specific embeddings.
4. The pseudo-labeling path is a key architectural boundary. It uses survey-derived user/item alignment features to create pseudo-label targets, typically via cosine similarity. Training combines standard recommendation loss with a PL loss, so semantic structure is learned alongside ranking performance.
5. Two dataset/evaluation regimes drive the pipeline: support_groups_full_164 uses a standard train/validation/test split, while support_groups_full_164_loo uses leave-one-out ranking evaluation. The repository is organized around these two experiment folders under results/.
6. Training is batch-oriented. src/train_val_test.py is the main entry point, and scripts/train_support_groups_only.sh plus scripts/submit_all_jobs.sh indicate SLURM-based orchestration for running many model/seed combinations on GPU nodes. The checked-in models/trained/ directory stores the resulting .model checkpoints.
7. After training, src/extract_embeddings.py reads the saved checkpoints and writes embedding arrays into results/.../embeddings/. Baseline models produce one user and one item embedding set; PL models produce both main embeddings and PL-specific embeddings.
8. The analysis stage is a second pipeline. Shell wrappers in scripts/ run clustering scoring, UMAP generation, metric aggregation, and comparison plotting in sequence. Utilities under scripts/utils/ select optimal cluster counts, compute silhouette scores, aggregate results, and verify plot quality.
9. Clustering evaluation is based on spherical K-means over L2-normalized embeddings, with cosine silhouette scores written to results/.../clustering/. UMAP visualizations are generated from the embeddings and their metadata are saved as JSON alongside the figures in results/.../umap_plots/.
10. Recommendation quality is summarized separately from clustering quality. The pipeline aggregates HR@5, NDCG@5, and AUC across seeds into performance_metrics.csv and performance_metrics_all_seeds.csv, then rolls everything up into results/comprehensive_results/ for cross-experiment comparison.
11. The final outputs are artifacts, not runtime dependencies: trained checkpoints, .npy embeddings, .csv metric tables, .json plot metadata, and comparison figures. This makes the repository suitable for reproducible research and post-hoc analysis, with results/ acting as the main generated-data boundary.
12. In short, the architecture is a two-stage ML workflow: training/inference in src/, and experiment orchestration/analysis in scripts/, with persistent artifacts in models/trained/ and results/ connecting the stages.
Main entry points: engine.py Engine · embeddings Embeddings · support_groups_full_164 support_groups_full_164 · train_val_test.py Train/Test
Components 30
src
Core training, model, and analysis code
- Train/Test · Main training and evaluation loop
src/train_val_test.py - Engine · Batch training, validation, and test execution
src/engine.py - Data Prep · Loads interactions and prepares train/eval data
src/data.py - Splits · Standard and leave-one-out partitioning
src/split_utils.py - Support Groups · Survey-derived alignment and grouping features
src/support_groups_utils.py - Config · Experiment settings and model selection
src/config.py - MF / MLP / NeuMF · Baseline recommender implementations
src/mf.py - Pseudo-labeling · PL loss and second embedding branch
src/pl.py - Metrics · Recommendation and embedding quality measures
src/metrics.py - Extract Emb · Loads checkpoints and exports embeddings
src/extract_embeddings.py - UMAP Plots · Builds embedding visualizations and metadata
src/generate_umap_plots.py - Compare Plots · Creates cross-experiment comparison figures
src/generate_comparison_plots.py
scripts
Batch orchestration and analysis wrappers
- Submit All · Top-level job submission for training runs
scripts/submit_all_jobs.sh - Train Jobs · Launches model and seed combinations on GPU nodes
scripts/train_support_groups_only.sh - Run Analysis · Executes the post-training analysis sequence
scripts/run_all_analysis_optimal.sh - Analysis Utils · Clustering, aggregation, and plot-quality helpers
scripts/utils/compute_silhouette_scores.py - 1 Embeddings · Wrapper for embedding extraction
scripts/1_extract_embeddings.sh - 2 Clustering · Wrapper for clustering evaluation
scripts/2_compute_clustering_metrics.sh - 3 UMAP · Wrapper for UMAP generation over optimal clusters
scripts/3_generate_umap_plots_all_optimal.sh - 4 Metrics · Wrapper for aggregating recommendation metrics
scripts/4_aggregate_performance_metrics.sh - 5 Plots · Wrapper for comparison plotting
scripts/5_generate_comparison_plots.sh - 6 Rollup CSV · Wrapper for comprehensive result table creation
scripts/6_create_comprehensive_csv.sh
artifacts
Generated checkpoints and experiment outputs
- Trained Models · Saved .model checkpoints
models/trained - support_groups_full_164 · Standard split experiment outputs
results/support_groups_full_164 - support_groups_full_164_loo · Leave-one-out experiment outputs
results/support_groups_full_164_loo - Comprehensive · Cross-experiment rollups and summaries
results/comprehensive_results - Embeddings · User/item and PL-specific embedding arrays
results/support_groups_full_164/embeddings - Clustering · Silhouette scoring outputs for main and PL embeddings
results/support_groups_full_164/clustering - UMAP Plots · UMAP figures and JSON metadata
results/support_groups_full_164/umap_plots - Perf Tables · HR@5, NDCG@5, and AUC aggregated across seeds
results/support_groups_full_164/performance_metrics.csv
Connections 31
- Submit All → Train Jobs: launches · Submits the training matrix
- Train Jobs → Train/Test: runs · Invokes the main training entrypoint
- Train/Test → Config: reads · Loads model and dataset configuration
- Train/Test → Data Prep: uses · Builds training and evaluation data
- Data Prep → Splits: splits · Creates standard or leave-one-out partitions
- Data Prep → Support Groups: features · Uses support-group alignment features
- Train/Test → Engine: drives · Delegates batch training and validation
- Engine → MF / MLP / NeuMF: trains · Optimizes MF, MLP, or NeuMF variants
- Engine → Pseudo-labeling: augments · Adds pseudo-label loss and PL embedding branch
- Engine → Metrics: scores · Computes recommendation quality during validation
- Engine → Trained Models: saves · Writes trained checkpoints
- Extract Emb → Trained Models: loads · Reads saved checkpoints for embedding export
- Extract Emb → Embeddings: writes · Stores main and PL-specific embeddings
- 1 Embeddings → Extract Emb: wraps · Batch wrapper for extraction stage
- 2 Clustering → Analysis Utils: uses · Calls clustering utilities
- 3 UMAP → UMAP Plots: wraps · Runs UMAP generation
- 4 Metrics → Analysis Utils: uses · Aggregates recommendation metrics
- 5 Plots → Compare Plots: wraps · Generates comparison figures
- 6 Rollup CSV → Analysis Utils: uses · Builds comprehensive summary CSVs
- UMAP Plots → Embeddings: reads · Consumes exported embeddings
- UMAP Plots → UMAP Plots: writes · Saves figures and plot metadata
- 2 Clustering → Embeddings: reads · Scores main and PL embeddings
- 2 Clustering → Clustering: writes · Stores cosine silhouette results
- 4 Metrics → Perf Tables: writes · Aggregates seed-level recommendation metrics
- Compare Plots → Perf Tables: reads · Compares experiment-level metrics
- Compare Plots → Comprehensive: writes · Produces cross-experiment summaries
- support_groups_full_164 → Embeddings: contains · Standard-split generated embeddings
- support_groups_full_164 → Clustering: contains · Standard-split clustering outputs
- support_groups_full_164 → UMAP Plots: contains · Standard-split UMAP outputs
- support_groups_full_164 → Perf Tables: contains · Standard-split performance tables
- support_groups_full_164_loo → Embeddings: mirrors · Same artifact structure for leave-one-out regime