Use this while the experimental plan is still cheap to change. A KDD empirical section answers four questions in order: does the method win, at what scale, at what computational price, and because of which mechanism? Papers that answer only the first question read as ML-flagship rejects retargeted at KDD — a pattern this venue's reviewers name openly.
| Axis | Minimum credible evidence | Upgrade that wins reviews |
|---|---|---|
| Quality | Headline metric vs tuned baselines on named datasets with stated sizes | Multiple data regimes (sparse/dense, small/large, static/drifting) showing where the method does and does not help |
| Scale | Largest-dataset run with hardware stated | Scaling curve (time and memory vs data size) with the complexity claim overlaid |
| Efficiency | Wall-clock and memory vs baselines, same hardware | Throughput per component, so the O(·) claim is checkable per stage |
| Mechanism | One ablation removing the claimed contribution | Full mechanism matrix: each named design decision toggled independently |
A missing axis should be a stated limitation, never a silent hole.
kdd-reproducibility); a grid of 200
configs for yours vs defaults for theirs is a soundness objection, not a detail.# ablations.py - one row per (variant, dataset, seed); the paper's ablation
# table is a groupby over this log, never hand-assembled.
VARIANTS = {
"full": dict(drift_weighting=True, sketch_family=True),
"-drift_weight": dict(drift_weighting=False, sketch_family=True),
"-sketch_family": dict(drift_weighting=True, sketch_family=False),
"base": dict(drift_weighting=False, sketch_family=False),
}
for name, flags in VARIANTS.items():
for ds in DATASETS: # each with row/edge counts in its metadata
for seed in SEEDS: # repeats where scale permits
m = run(config(**flags), dataset=ds, seed=seed)
log_row(variant=name, dataset=ds.name, seed=seed,
auprc=m.auprc, mem_mb=m.peak_mem, evps=m.throughput)
The point of the matrix: the paper's central claim ("the gain comes from the drift weighting") must be attributable from the log alone. Report efficiency columns in the ablation table too — a component that adds +0.4 quality for 3x memory is a different result from +0.4 for free.
Post-launch quantification is a desk-check item on the 2026 ADS CFP, so design the measurement, don't just harvest it:
A draft claims a new sequential recommender beats five neural baselines on three datasets. The four-axis audit finds: quality covered; scale absent (largest dataset is 1M interactions — small for the claim "industrial-scale"); efficiency absent (training time never reported); mechanism partial (one ablation, but it removes two components at once). The hygiene audit finds random splits on timestamped data and no popularity stratification. Repair plan, ordered by review impact:
Steps 3-5 are a week of compute; step 1 can invalidate the paper. Run it first.
[Axis coverage] quality/scale/efficiency/mechanism: <present-missing per axis>
[Split integrity] temporal-safe: yes/no; leakage audit: done/open items
[Baseline symmetry] tuning budgets equal + disclosed: yes/no
[Ablation matrix] mechanisms isolated: <list>; efficiency logged alongside: yes/no
[ADS measurement] design: A-B / pre-post / blocked-exception / N-A
[Decision-critical missing run] <the one experiment to do next>