feat: add HuggingFace Spaces deployment (Dockerfile, artifact scripts, CORS fix)
yash-b18
5978ef2
feat: add side-by-side model comparison UI and fix missing frontend modules
Kattine
821c624
feat: wire explain_from_items for picker flow; fix nan author guardβ
yash-b18
de2efef
- explain_from_items() derives explanation signals (author, keyword,
rating, price) from the liked_item_idxs passed by the cold-start
picker flow instead of a user_idx
- Guards item_author not in ("nan", "Unknown") prevent "you selected
a book by nan" from appearing in explanations
- recommender.py now calls explain_from_items() for liked-item
cold-start path instead of the generic fallback string
fix: liked_items now uses deep model via mean-pooled embedding; remove raw score display
yash-b18
d439004
feat: rewrite language explainer β author, rating, price, keyword signals
Two-Tower model:
- Switch from BCE to BPR loss with per-user negative pairing
- Remove weight decay from embedding parameters (sparse gradient fix)
- Collapse linear architecture (hidden_dims=[]) β MLP with ReLU collapsed
all inputs to same hypersphere direction on sparse book data
- Add BPRDataset with per-user negative sampling to dataset.py
- All 3 models now produce non-zero Recall@10 (was 0.000 for Two-Tower)
Evaluation results (5k sampled users, leave-last-out):
- Naive: Recall@10=0.0046, NDCG@10=0.0022, MRR=0.0020
- LightGBM: Recall@10=0.0026, NDCG@10=0.0012, MRR=0.0010
- Two-Tower: Recall@10=0.0024, NDCG@10=0.0014, MRR=0.0012
API / inference:
- Filter untitled items (42% of catalog) from all recommendation paths
- Use numpy fancy indexing for exclusion (was O(n) loop)
- Expand LightGBM candidate pool to 500 (was 100)
Frontend redesign:
- Single model UX β always use Two-Tower, remove ModelSelector/CompareView
- New MetricsTable component with real evaluation numbers
- pageβ¦
fix: resolve SIGSEGV and OpenMP deadlock for LightGBM + PyTorch coexistenceβ
yash-b18
09fcfe1
- downloader.py: rewrite to use HfFileSystem streaming JSONL (datasets 4.x compat)
- user_features.py: fix .mode().iat[0] IndexError on empty Series
- deep.py: add weights_only=True to torch.load to prevent interactive hang in PyTorch 2.11
- serve_utils.py: lazy-import torch after LightGBM pickle load to prevent SIGSEGV;
call torch.set_num_threads(1) immediately after import to prevent OpenMP deadlock
when LightGBM and PyTorch share a process on Apple Silicon macOS
- app.py: fix personas endpoint to use rating column (not label); add detailed
model-loading logs to aid future debugging
- recommender.py: fix feat[item_idx] KeyError in classical recommendations;
fix nan title/category/brand display
feat: FastAPI backend β recommend, compare, items, personas endpoints with full explainability
yash-b18
6d9c101
feat: explainability β SHAP for LightGBM and metadata-grounded language explanations for Two-Tower
yash-b18
fbc171a
feat: evaluation metrics, model evaluator, ablation experiment, error analysis
yash-b18
dd33d52
feat: all three models β naive popularity, LightGBM reranker, Two-Tower neural
yash-b18
fa98c11
feat: data pipeline β download, preprocess, split, and feature engineering
Sets up the complete project skeleton for the Explainable Multi-Stage
Recommendation System. Includes directory layout, central config module,
pipeline orchestrator, Makefile, report outline, and all package __init__
files. No model or data code yet β that comes in subsequent branches.