This appendix is a working reference for the datasets that recur throughout the book. It is organized by modality and task, and every entry names the pitfall that most often invalidates a result on that dataset. Sensor data has a habit of leaking: a naive random split lets the same subject, the same machine, or the same drive appear in both training and test, and the reported number then measures memorization instead of generalization. Read the Notes column before you read anyone's leaderboard.
How to read the pitfalls
Three failure modes dominate. Subject leakage occurs when windows from one person land on both sides of the split, so the model recognizes the person rather than the activity. Device or machine leakage is the industrial analogue: the same bearing, pump, or building appears in train and test, and the model keys on a serial-number fingerprint. Domain shift is the honest hardness that remains once leakage is removed: a new sensor placement, a new city, a new operating regime. A good benchmark defines the split so that the intended shift is the only thing the test measures. When it does not, you must define it yourself.
Curated datasets by modality and task
| Dataset | Modality | Task | Notes and pitfalls |
|---|---|---|---|
| UCI-HAR | Phone IMU (acc + gyro) | Activity recognition | 30 subjects, 6 activities. Split by subject ID (official train/test does). Pre-windowed and overlapped: reshuffling windows leaks across the overlap. |
| WISDM | Phone/watch accelerometer | Activity recognition | Class-imbalanced (walking dominates). Group by user before splitting; per-window random split is a classic leak here. |
| PAMAP2 | 3 IMUs + heart rate | Activity recognition | 9 subjects, 18 activities. Leave-one-subject-out is standard. Missing HR samples and NaN gaps need explicit handling. |
| Opportunity | Body + object + ambient sensors | Gesture and locomotion | Rich but heavily imbalanced with a large NULL class. Report on the recognized-classes subset and use the official runs as folds. |
| Capture-24 | Wrist accelerometer | Free-living activity | 151 participants, camera-derived labels. Wear-time and non-wear detection matter; split by participant. |
| PhysioNet (family) | Various biosignals | Many (ECG, EEG, PPG) | Umbrella of challenges. Each release has its own split rule; do not pool records across a patient without checking for patient overlap. |
| PTB-XL | 12-lead ECG | Diagnostic classification | 21k records, provides recommended 10-fold stratified splits (folds 9 and 10 for val/test). Multi-label; use the given folds to avoid patient leakage. |
| MIMIC-IV-ECG | 12-lead ECG | Waveform + clinical linkage | Credentialed access. Link to MIMIC-IV outcomes carefully; split by subject_id, and beware label leakage from downstream clinical notes. |
| PPG-DaLiA | Wrist PPG + accelerometer | Heart-rate estimation | 15 subjects, real daily activities with strong motion artifact. Leave-one-subject-out; report MAE in beats per minute. |
| WESAD | Chest + wrist multimodal | Stress/affect detection | 15 subjects. Subject-independent evaluation only; per-window splits inflate accuracy dramatically here. |
| TUH-EEG | Clinical EEG | Seizure, abnormal, events | Largest public clinical EEG corpus. Montage and channel-count variation; split by patient and fix a common montage. |
| Sleep-EDF | PSG (EEG, EOG, EMG) | Sleep staging | Class imbalance across stages (N1 rare). Subject-wise split; the expanded version reduces small-cohort variance. |
| emg2qwerty | Surface EMG (wrist) | Keystroke decoding | Large typing corpus. Generic vs personalized splits differ sharply; report both, and split by user for the generic setting. |
| C-MAPSS / N-CMAPSS | Simulated turbofan sensors | Remaining useful life | Unit-wise trajectories. Never split within a unit; N-CMAPSS adds flight-condition realism and is harder than the original FD00x sets. |
| CWRU | Bearing vibration | Fault diagnosis | Near-saturated accuracy under naive splits: severe leakage risk from overlapping windows and shared operating loads. Split by load/fault-size for a real test. |
| MIMII / MIMII-DG | Machine audio | Anomalous sound detection | Normal-only training. MIMII-DG explicitly targets domain generalization across machine instances; evaluate on unseen sections. |
| DCASE (ASD tasks) | Machine audio | Anomaly detection | Annual task with source/target domain shift. Use the provided development/evaluation split; scoring is AUC and partial-AUC. |
| SWaT / WADI / HAI | ICS process telemetry | Intrusion/anomaly detection | Attacks appear only in test by design. Point-adjust scoring can wildly overstate results; prefer event-level or range-based metrics. |
| KITTI / SemanticKITTI | Camera + LiDAR | Detection, segmentation, odometry | Sequences are correlated; frames from one drive must not straddle the split. SemanticKITTI adds point-wise labels on the odometry sequences. |
| nuScenes | Camera + LiDAR + radar | 3D detection, tracking, prediction | Scene-level split provided. Class imbalance is large; the NDS metric blends detection quality with attribute and velocity errors. |
| Waymo Open | Camera + LiDAR | 3D detection, motion | Large and geographically diverse. Use official segments; do not mix run segments across splits. |
| Argoverse 2 | LiDAR + maps | Motion forecasting, sensor | Map-conditioned. Forecasting split is by scenario; leaking a scenario's future is the common error. |
| Occ3D | Camera-derived occupancy | 3D occupancy prediction | Built on nuScenes/Waymo; inherits their scene splits. Voxelization and visibility masks define the metric, so match the reference config. |
| K-Radar / RADIal / View-of-Delft | 4D radar (+ camera/LiDAR) | Detection in adverse weather | Radar tensor formats differ across sets. Weather and time-of-day are the intended shifts; split by drive to keep them honest. |
| DSEC / Prophesee (GEN1, 1MP) | Event camera | Detection, flow, depth | Asynchronous events need a fixed accumulation window before benchmarking. Split by sequence; frame-aligned ground truth is sparse. |
| Widar3.0 | WiFi CSI | Gesture recognition | Cross-domain by design (room, position, orientation). The BVP feature aims for domain invariance; always test on unseen environments. |
| TacBench / Touch-and-Go | Vision-based tactile | Material, slip, manipulation | Sensor-specific (GelSight-style) imprints. Split by object instance to avoid memorizing a single contact surface. |
| METR-LA / PEMS-BAY | Loop-detector networks | Traffic forecasting | Spatiotemporal graph. Split chronologically (no future in train); the adjacency matrix encodes road topology, not correlation from the test period. |
| Monash TSF | Many time-series archives | Forecasting | Unified archive of 30+ datasets with fixed horizons. Use the provided splits and standard metrics (MASE, sMAPE) for comparability. |
| GIFT-Eval | Heterogeneous time series | Foundation-model forecasting | Designed to probe zero-shot generalization; guard against pretraining contamination by checking that eval series are not in the pretraining corpus. |
A note on leakage-safe splitting
The single rule that prevents most of the failures above is to split on the grouping variable, not on the window. Let \(g(x)\) be the group that a sample belongs to: the subject for HAR and biosignals, the machine or unit for industrial data, the drive or scene for autonomous data, and the calendar boundary for forecasting. A split is leakage-safe when no group straddles the boundary, that is when the train and test group sets are disjoint:
$$ G_{\text{train}} \cap G_{\text{test}} = \varnothing, \qquad G_{\text{train}} = \{\, g(x) : x \in \mathcal{D}_{\text{train}} \,\}. $$In practice you hand the grouping vector to a group-aware splitter and never touch the raw window index. The snippet below shows the pattern for a subject-grouped HAR set; the same call works for machine IDs, scene tokens, or any other group.
from sklearn.model_selection import GroupShuffleSplit
# X: windows, y: labels, groups: subject id per window
splitter = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=0)
train_idx, test_idx = next(splitter.split(X, y, groups=subject_ids))
# Guarantee: no subject appears on both sides
assert set(subject_ids[train_idx]).isdisjoint(subject_ids[test_idx])
Group-aware splitting for HAR. Swap subject_ids for machine, drive, or scene identifiers to reuse the pattern across modalities.
Two boundary cases deserve care. For time series, grouping is not enough on its own: even within a single test series, an evaluation window whose input range overlaps the training range leaks the future, so forecasting splits must be strictly chronological with a gap at least as long as the forecast horizon. For anomaly and intrusion datasets such as SWaT and MIMII, the training set is normal-only by construction, so the risk shifts from split leakage to metric inflation; prefer event-level or range-based scoring over point-adjusted accuracy, which can turn a single lucky detection into a near-perfect number. When a benchmark ships an official split, use it, both because it encodes the intended domain shift and because it is the only way your numbers are comparable to everyone else's.