Outfit Recommender β trained checkpoints
COMP9727 (Recommender Systems) team project. Four approaches trained on the POG / Alibaba iFashion dataset (Chen et al., KDD 2019), evaluated on a frequency-controlled fill-in-the-blank (FITB) and compatibility-prediction (CP) benchmark. Source: https://github.com/QuangMinhPhan23/outfit-recommender
Every model here is scored against a no-model frequency control β picking the training-most-frequent candidate scores 0.6672 FITB / 0.5722 CP AUC. Clearing chance (0.25 / 0.50) means nothing on this benchmark; clearing the control is the bar.
Results (V2 test set)
| Method | FITB acc | CP AUC | cold-item FITB | vs. control |
|---|---|---|---|---|
| Frequency control (no model) | 0.6672 | 0.5722 | β | β |
| Approach 1 β Item2Vec | 0.7729 | 0.7857 | 0.4841 | β |
| Approach 2 β GAT | 0.8418 | 0.7644 | 0.6280 | β |
| Approach 3 β Type-Aware | 0.8310 | 0.7683 | 0.6382 | β |
| Method | HR@10 | NDCG@10 |
|---|---|---|
| Approach 4 β BPR-MF (popularity-matched negatives) | 0.5202 | 0.2960 |
cold-item FITB = accuracy on answers appearing β€5 times in training. Approach 3
is the only method with content features, so it degrades least on rare items.
Files
approach1/word2vec.model gensim Word2Vec, 128-d, skip-gram
approach1/word2vec.model.wv.vectors.npy input matrix (required alongside)
approach1/word2vec.model.syn1neg.npy output matrix (required alongside)
approach2/best.pt GAT state_dict, {"model", "epoch", "val"}
approach3/best.pt Type-Aware state_dict
approach3/text_emb.npy frozen sentence-encoder item embeddings
(required alongside best.pt β the text
buffer is registered persistent=False,
so it is not inside best.pt itself)
approach4/factors.npz BPR-MF factors, {"U": user, "V": item}
Loading
# Approach 1 β Item2Vec
from gensim.models import Word2Vec
model = Word2Vec.load("approach1/word2vec.model") # keep all 3 files together
# Approach 2 / 3 β see SampledGAT / TypeAware in src/run_approach{2,3}.py
import torch
state = torch.load("approach2/best.pt", map_location="cpu", weights_only=False)
model.load_state_dict(state["model"])
# Approach 4 β BPR-MF
import numpy as np
z = np.load("approach4/factors.npz")
U, V = z["U"], z["V"]
Full training/eval code: src/run_approach{1,2,3,4}.py in the repo above.
Not included here: optimizer state (last.pt), cached intermediates rebuildable
in seconds (categories.pkl, item_freq.pkl, embeddings.npy), and raw
dataset-derived caches (titles.pkl, interactions.pkl) β those stay out of a
model-weights repo by design.