Part VII: Health, Biosignals, and Wearable AI
Chapter 28: Biosignal Foundations

Clinical labels and reference standards

"Everyone kept telling me to learn the ground truth. Nobody warned me the ground was two cardiologists disagreeing at 3 a.m."

A Recently Humbled AI Agent

The big picture

Section 28.4 showed how to detect events in a biosignal. This section asks the harder question that comes before any training run: what do we compare the detector against? In physiological AI the target label is almost never handed down by nature. It is manufactured by a clinician reading a strip, a reference instrument recording in parallel, or an outcome that arrives weeks later. Every one of those sources carries its own noise, its own bias, and its own definition of the event. Get the reference standard wrong and every downstream number, sensitivity, specificity, the ROC curve you proudly report, is measuring agreement with a flawed oracle rather than truth. This section teaches how clinical labels are made, how much they disagree, and why the reference standard sets a hard ceiling on how good any model can credibly claim to be.

Formally, we want to estimate a hidden clinical state \(s\) (this beat is a ventricular ectopic; this 30-second epoch is REM sleep; this patient has atrial fibrillation) from a biosignal window. Supervised learning needs a label \(y\) that stands in for \(s\). The reference standard is the procedure that produces \(y\). It is a measurement in its own right, subject to the same \(y = s + \text{error}\) logic as the sensor itself (Chapter 4). Treating the label as if it were \(s\) exactly is the single most common self-inflicted wound in clinical machine learning.

A hierarchy of reference standards

Not all labels are created equal, and the field has a rough hierarchy. A gold standard is the most definitive practical measurement of the state: polysomnography (PSG) scored under the AASM manual for sleep stage, a synchronized 12-lead ECG read for arrhythmia, an arterial line for blood pressure, a laboratory assay for a biomarker. A silver standard is a defensible proxy: a single-lead patch instead of 12 leads, an oscillometric cuff instead of an arterial line. A weak or surrogate label is cheaper still: a billing code (ICD diagnosis) in the electronic health record, a self-reported symptom, or the output of an older algorithm you are trying to replace. Each step down the hierarchy trades fidelity for volume, and the trade is the central design decision of a biosignal dataset. Why does volume tempt us? Because deep models are hungry, and a million EHR-coded records look more attractive than ten thousand adjudicated strips until you notice that the coding error rate swamps the effect you are trying to learn.

Key insight

The reference standard is a ceiling, not a floor. A model evaluated against a noisy label can never score higher than the label's own agreement with truth, and it will often be penalized for being right when the label is wrong. If two expert scorers agree only 82% of the time, a model that perfectly reproduces the true state would still post roughly 82% agreement with any single scorer. Reporting 95% "accuracy" against such a reference is not excellence; it is evidence that the model has learned the annotators' shared mistakes.

Labels are noisy: quantify the disagreement

Because a human (or a proxy device) makes the label, the first thing to measure is not model accuracy but label reliability: how much do independent annotators agree? Raw percent agreement is misleading because some agreement happens by chance, especially under class imbalance. Cohen's kappa corrects for chance:

\[ \kappa = \frac{p_o - p_e}{1 - p_e} \]

where \(p_o\) is the observed agreement and \(p_e\) is the agreement expected if both raters labeled independently at their observed base rates. \(\kappa = 1\) is perfect agreement, \(\kappa = 0\) is chance-level, and negative values mean systematic disagreement. For more than two raters, Fleiss' kappa generalizes the same idea. The short program below computes Cohen's kappa for two clinicians scoring the same set of ECG strips as normal, ectopic, or noise, and contrasts it with the raw percent agreement that a naive report would quote.

import numpy as np
from sklearn.metrics import cohen_kappa_score

# Two clinicians label the same 12 ECG strips: N=normal, V=ectopic, X=noise
rater_a = np.array(list("NNNNNNNNVVNX"))
rater_b = np.array(list("NNNNNNNNVNNX"))

percent_agree = np.mean(rater_a == rater_b)
kappa = cohen_kappa_score(rater_a, rater_b)

print(f"raw percent agreement: {percent_agree:.2f}")
print(f"Cohen's kappa:         {kappa:.2f}")
raw percent agreement: 0.92 Cohen's kappa: 0.63
Listing 28.5.1. Raw agreement of 0.92 looks stellar, but because "normal" dominates the strips, chance alone explains most of it; the chance-corrected kappa of 0.63 (only "substantial" on the usual Landis-Koch scale) reveals the raters genuinely diverge on the rare ectopic and noise classes that a detector most needs to get right.

The gap between 0.92 and 0.63 in Listing 28.5.1 is the whole lesson: on imbalanced clinical classes, the metric your model will eventually be judged by is dominated by the majority class, so you must report a chance-corrected agreement for the labels themselves before you trust any model number built on them. When agreement is low, the standard remedy is adjudication: multiple annotators score independently, disagreements go to a senior reviewer or a consensus panel, and the resolved label becomes the reference. Alternatively, keep the disagreement as information by training on soft labels (the fraction of raters who chose each class), which pairs naturally with the calibration methods of Chapter 18.

In practice: a hospital sleep-staging model that "beat the doctors"

A clinical team trained a neural network to score sleep stages from a wearable EEG headband against PSG epochs labeled by their in-house sleep technologist. On the internal test set it hit 88% epoch agreement, and someone wrote "super-human" in the slide deck. Then they sent the same 200 recordings to two external accredited scorers. The two humans agreed with each other only 83% of the time, and their disagreements clustered exactly on the N1-to-N2 transition and on REM onset, the very epochs the model also got "wrong". The model had not exceeded human performance; it had memorized one technologist's idiosyncratic scoring of ambiguous transitions. The fix was to relabel with a three-scorer consensus and re-evaluate against the consensus, at which point the honest agreement dropped to 81% and, crucially, generalized to a new hospital. The reference standard, not the architecture, had been the bottleneck all along.

Granularity, timing, and matching conventions

A clinical label also has a shape. Is it attached to a single heartbeat, to a variable-length event (an apnea, a seizure, an AFib episode), or to an entire record ("this patient has paroxysmal AFib")? The granularity you evaluate at must match the granularity of the label, and mismatches are a quiet source of inflated scores. Beat-level and record-level classification are genuinely different problems, a distinction Chapter 29 (ECG and Cardiac AI) develops in depth.

For event and beat labels, agreement also depends on timing tolerance: a detected beat at 412 ms and a reference beat at 430 ms should count as a match, not a miss plus a false alarm. The field standardized this. The ANSI/AAMI EC57 standard defines how to score arrhythmia detectors, including a 150 ms matching window around each reference beat, and databases such as MIT-BIH ship their labels in the WFDB annotation format with a documented symbol set (N for normal, V for ventricular ectopic, and so on). Using these conventions is not bureaucracy; it is what makes your reported sensitivity comparable to a published baseline instead of an artifact of your own matching rule. This is the same leakage-and-comparability discipline that Chapter 5 and Chapter 65 insist on for benchmarking.

Right tool: don't hand-roll beat matching

Aligning detected beats to a reference within a tolerance window, then tallying true positives, false negatives, and false positives per the EC57 rules, is about 30 lines of careful interval bookkeeping (sort both series, sweep, handle double-matches, avoid off-by-one at the window edge). The WFDB toolkit does it in one call that also reads the standard annotation files:

import wfdb.processing as wp

# ref_samples / test_samples: beat locations in samples; fs = sampling rate
comparator = wp.compare_annotations(ref_samples, test_samples,
                                    window_width=int(0.15 * fs))  # 150 ms EC57 window
print(comparator.sensitivity, comparator.positive_predictivity)
Listing 28.5.2. One wfdb.processing.compare_annotations call applies the 150 ms EC57 tolerance window and returns EC57-consistent sensitivity and positive predictivity, replacing roughly 30 lines of interval-matching code and, more importantly, guaranteeing your numbers are comparable to the published literature.

That single call replaces about 30 lines and removes an entire category of silent scoring bugs, because the matching semantics match the standard the baselines were reported under.

The reference contaminates: leakage and prevalence traps

Two failure modes recur often enough to name. The first is reference leakage. When the label comes from a co-recorded gold-standard device, its signal can bleed into the very features you train on: a chest-belt reference for respiration leaves a synchronization artifact in the wearable's accelerometer, or the reference ECG shares a common ground with the PPG amplifier. The model then learns to detect the presence of the reference wire rather than the physiology, and posts beautiful numbers that collapse the instant the reference is unplugged in deployment. Guard against it by asking, for every feature, whether it could exist only because the reference was attached.

The second is prevalence dependence. Sensitivity and specificity are properties of the detector, but positive predictive value (PPV), the metric a clinician actually experiences as "how often is an alarm real", depends on how common the condition is:

\[ \text{PPV} = \frac{\text{sens}\cdot \pi}{\text{sens}\cdot \pi + (1-\text{spec})(1-\pi)} \]

where \(\pi\) is prevalence. A 99%-specific AFib screener sounds excellent until you deploy it on a healthy 40-year-old population where \(\pi\) is well under 1%, and the majority of its alarms become false. This is why the consumer-wearable screening studies of Chapter 30 (PPG and Wearable Cardiovascular Sensing) are engineered around low-prevalence populations, and why the clinical-validation designs of Chapter 34 (Clinical Validation, Regulation, and Biometric Privacy) report PPV at the intended-use prevalence rather than at the enriched prevalence of the training set. The reference standard defined your labels; the deployment prevalence redefines what those labels are worth.

Exercise

You have an arrhythmia detector with 95% sensitivity and 98% specificity, validated against an adjudicated 12-lead reference. (a) Compute PPV at a hospital-ward prevalence of \(\pi = 0.20\) and again at a consumer-screening prevalence of \(\pi = 0.005\), using the PPV formula above. (b) Your two adjudicators scored the validation set with Cohen's kappa of 0.71; argue in two sentences why claiming "97% accuracy" against their consensus is potentially misleading. (c) Propose one concrete check that would catch reference leakage from the 12-lead ECG into your single-lead patch features.

Self-check

  1. Why can raw percent agreement look excellent while Cohen's kappa reveals poor reliability, and which situation makes the gap largest?
  2. A model reaches 90% agreement with a single sleep technologist, but two technologists agree only 82% with each other. What is the most honest interpretation of the 90% number?
  3. Give one example of reference leakage and one property of the deployment population that can turn a high-specificity detector into an alarm nuisance.

What's Next

In Section 28.6, we turn from how labels are made to how records are split. Even a perfect reference standard is wasted if beats from the same patient land in both the training and test sets, so we build patient-level splits and hunt down the subtle physiological leakage that lets a model recognize the person instead of the pathology.