- prepare_training_data: bag_size 5→8, street signs fill slots first so
every sample contains the most geographically discriminative texts
- train: HuberLoss replaces MSE (robust to outlier intersections),
ReduceLROnPlateau scheduler added, split logic extracted to data_utils
- eval: reproduce train/val split to report honest per-bag and
per-intersection-aggregated metrics separately for train and val sets
- data_utils: shared split_indices() so train and eval use identical splits
Co-authored-by: Cursor <cursoragent@cursor.com>