Configuration: configs/evaluation.yaml. Implementation: src/artifex/splits.py, src/artifex/evaluate.py, src/artifex/metrics.py, src/artifex/uncertainty.py.

1. Leakage control

Closely related works must never be split between training and test. Records are connected (union-find) when they share:

Link Rationale
Artist — normalised name (accents, punctuation and parenthetical qualifiers removed), across both museums; only creators recorded in a painter role (artist, painter, illuminator, draftsman, workshop director) Prevents learning an artist's hand rather than a tradition. Followers/workshops recorded under the master's name are grouped with the master. Authors of a manuscript's text, calligraphers, poets and patrons are not used: an earlier build linked every page whose text was by, e.g., Firdausi, chaining 712 pages of unrelated Persian and Indian manuscripts into one group, of which the per-group cap then kept 25.
Accession lot (e.g. 1962.279.*) for anonymous works, and for any record whose title marks it as a folio, leaf, page or album/series part Folios of one manuscript or leaves of one album share hands, materials and photography.
Near-duplicate image — DINOv2 cosine ≥ 0.95 Catches different records showing the same or a nearly identical image (details, replicas, re-photographs).

Exact duplicates (same image URL or identical bytes) are removed earlier, at dataset build time.

Group cap. At most 25 works per group (chosen deterministically by hashing the artwork id with the seed) enter the modelling subset used for training and evaluation; the rest remain in the collection and the retrieval index. Without the cap a single 600-folio manuscript would dominate its class.

The split code asserts that no group spans two splits, and the retrieval evaluation reports the share of retrieved training works from the query's own group (same_group@k, expected 0).

2. Splits

Split assignments (data/splits/splits.parquet, .csv), the seed and the configuration hash are saved; each evaluation run copies them into its run directory.

Supported classes. A label becomes a classifier target when the modelling subset contains at least min_records_per_class (60) works with that label (40 for narrower traditions). This is a dataset-design decision made from label counts only — no model output is involved — and it is applied identically to every model compared. Test works whose label is not supported are reported separately (section 4).

3. Models compared

Model Description
Majority class Predicts the most frequent training class.
Logistic regression (deployed) Multinomial, balanced class weights, C chosen on validation macro-F1.
Linear SVM Same standardised features, balanced class weights, C ∈ {0.0003, 0.001, 0.003} chosen on validation macro-F1 (no probabilities; classification metrics only). Main split only — it is a comparison baseline and liblinear is slow on 1,536-dimensional features.
k-NN retrieval vote Similarity-weighted vote of the 10 nearest training works. Represents "retrieval only".
Logistic regression + k-NN Mean of calibrated classifier scores and k-NN vote shares ("combined presentation").

4. Metrics

Region (and narrower traditions)

Macro-F1 (primary — classes are imbalanced), balanced accuracy, accuracy, per-class precision/recall/F1 with support, confusion matrix. Narrower-tradition heads are evaluated on test works whose documented broad region is the parent ("oracle" broad region).

Period

All of the above on bin labels, plus: - Within-tolerance accuracy: predicted bin within ±1 position of the labelled bin (bins in chronological order). - Range-compatible accuracy: the predicted bin overlaps the documented date range at all. - Absolute error (years): distance from the predicted bin's midpoint to the documented range, zero if inside; mean and median reported. - Imprecisely dated works: test works whose range spans several bins (no label) are scored with range-compatible accuracy and absolute error only.

These are complementary: exact-bin accuracy penalises a 1549/1550 boundary miss as heavily as a 500-year error; error in years does not.

Calibration and selective prediction

Expected calibration error (10 equal-width bins on the top-class score) and negative log-likelihood, before and after temperature scaling; reliability diagrams; risk–coverage curves (selective accuracy as a function of coverage); test coverage and selective accuracy at the validation-chosen abstention threshold.

Unsupported categories

Test works whose label is not a supported class are reported separately: their count, the abstention rate, and what the head predicted for them. This is a partial out-of-scope probe; no dedicated out-of-distribution benchmark (e.g. photographs, sculpture) is included in v0.1.

Retrieval

Test works are queries; training works are the reference set. Relevance uses documented metadata only: - region_hit@k — at least one of the top k shares the query's broad region; - region_precision@k, period_precision@k — share of the top k with the same label (unlabelled never matches); - temporal_close@k — share of the top k whose documented range lies within 50 years of the query's range; - top1_median_gap_years; - the same metrics computed on random rankings give the chance level.

Retrieval is not judged only by label identity: two works can be visually and historically related across regions. These metrics measure agreement with catalogue metadata, nothing more.

Uncertainty of the metrics

For the main experiment, test-split macro-F1, balanced accuracy and accuracy of every model carry 95% percentile intervals from 1,000 bootstrap resamples of whole leakage groups (works within a group are correlated, so resampling individual works would understate the uncertainty).

Classifier–retrieval agreement

Agreement rate between the deployed classifier and the k-NN vote, and accuracy when they agree vs. disagree.

5. Ablations

Same works, same split, same classifiers; only the representation changes:

Variant Purpose
DINOv2-B, letterbox, colour (default) reference
DINOv2-B, centre crop Does cropping away borders/format change performance?
DINOv2-B, greyscale How much depends on colour (palette, varnish, paper tone)?
DINOv2-S Does a smaller encoder suffice?
Colour/texture statistics A non-learned low-level baseline (HSV histogram, gradient-orientation histograms, global statistics).

These comparisons are diagnostic, not causal explanations of model behaviour.

6. Artefacts

artifacts/evaluation/runs/<UTC timestamp>_<model hash>/: metrics.json (all numbers), predictions.csv (per-example predictions for validation and test), failures.json (confident mistakes), report.md (generated from metrics.json), configs/ (snapshot), splits.csv, model_card.json. artifacts/evaluation/latest.json points to the newest run; the website reads only these files.

7. What is not claimed

No single number summarises the model. Results apply to the two source collections, their photography and their cataloguing conventions. Calibration and abstention thresholds are validated on data from the same distribution and do not transfer automatically to arbitrary user photographs.