Predicting cycle phase from wrist biosensor data is not a binary classification problem. The LSTM model we use outputs a probability distribution over phase states for each time step, and collapsing that distribution to a single label before presenting it to users throws away information that is genuinely useful. A prediction with 91 percent probability of luteal phase means something meaningfully different from a prediction with 56 percent probability, and communicating only the winning label treats both as equivalent. This post describes why we preserve uncertainty at the output layer, how we transform LSTM probability outputs into interpretable confidence intervals, and what those intervals actually represent when a clinician or user reads them.
Why Softmax Outputs Are Not Reliable Probability Estimates
The standard approach to multi-class sequence classification is a softmax activation at the output layer. Softmax produces values that sum to 1.0 and are often treated as probabilities. The problem is that vanilla neural networks, including LSTMs with softmax outputs, tend to be overconfident. The model can assign 99 percent probability to a class even when the input pattern is ambiguous or sits near a decision boundary in the learned feature space. This happens because softmax is calibrated to minimize cross-entropy loss during training, which rewards placing probability mass on the correct class, but does not directly penalize overconfidence when the correct class does in fact win.
In practice, this means taking the raw softmax vector from the output layer and treating those numbers as probabilities is valid for predicting the most likely class but unreliable for characterizing how certain the model is about that prediction. A 94 percent softmax output for follicular phase does not mean the model would be correct 94 percent of the time on inputs that look like this one.
Monte Carlo Dropout for Uncertainty Estimation
We use Monte Carlo dropout to approximate Bayesian uncertainty in the predictions. During inference, we apply dropout at the LSTM hidden layers with a fixed rate and run the model forward multiple times (we use 100 passes in production) with different dropout masks. Each forward pass stochastically disables a subset of units, producing a slightly different output probability vector. The distribution of those 100 output vectors gives us an approximation of the model's posterior uncertainty over its predictions.
The mean of the 100 outputs becomes the point estimate for each phase probability. The variance across passes reflects epistemic uncertainty: how much the model's prediction changes when parts of its learned representation are masked. A tight distribution of outputs across passes, even with moderate mean probability, indicates the model is consistent in its assessment. A wide distribution indicates that the model's answer depends heavily on which features are active, which usually means the input sequence is near a phase transition or contains a data pattern the model has not seen frequently.
The phase transition periods are the most informative application. Cycles do not flip between follicular and luteal states instantaneously. There is a peri-ovulatory window of several days during which temperature and HRV signals are shifting but have not yet settled into luteal patterns. During this window, MC dropout variance is typically highest, which is exactly correct: the model genuinely is uncertain at phase transitions, and the uncertainty estimate should reflect that.
From Variance to Confidence Intervals on Phase Day Estimates
Reporting variance in the output probability vector is not immediately useful to a person who wants to know what day of their cycle they are on or when their next period is expected. We translate the MC dropout outputs into two types of intervals that appear in the product.
The first is a phase probability range, shown in the cycle timeline view. Rather than displaying a single probability for each phase, the display shows a shaded band reflecting the 10th to 90th percentile range of the MC dropout distribution. A narrow band means the 100 forward passes agree closely. A wide band means the model is seeing something ambiguous in the current signal window. Users can visually see when the model is confident versus uncertain without needing to understand what percentile intervals mean.
The second is a date range for predicted events, particularly cycle onset and ovulation timing. We derive these by propagating the phase probability uncertainty through the calendar-day conversion. If the expected next period onset is somewhere between day 26 and day 32 of the current cycle (based on the distribution of luteal lengths inferred from the current cycle and prior cycles for this individual), the product shows a five-to-seven day window rather than a single date. The midpoint of that range is presented as the central estimate, with the window edges labeled as the lower and upper confidence bounds.
Calibration: Do the Intervals Actually Contain the True Value at the Right Rate?
Generating confidence intervals is worthless if they are systematically too narrow or too wide. Calibration measures whether stated intervals actually contain the ground truth at approximately the stated rate. A 90 percent interval should contain the true value roughly 90 percent of the time when evaluated across many instances. We evaluate interval calibration on held-out cycle data, comparing the stated confidence windows for phase day estimates against the actual cycle days derived from the ground-truth cycle onset labels in our internal pilot dataset.
Calibration was worse than we expected in early versions, particularly for the cycle onset date prediction. The intervals were too narrow during cycles with atypical signal patterns, meaning they were overconfident. We addressed this through two changes: temperature scaling of the pre-interval probability distributions, and widening the prior over luteal phase length to better reflect the population-level variability we observe. The post-correction calibration is substantially better, though it is not perfect and we continue to monitor it as the model is updated.
We want to be direct about what we do not yet have: large-scale prospective data against which to validate interval calibration across diverse populations. The calibration work described above uses our internal pilot dataset, which has demographic constraints. We expect calibration performance to shift as we build broader longitudinal data, and the model will need ongoing recalibration rather than a one-time validation.
Presenting Uncertainty to Clinical Users
A fertile window estimate labeled "days 11 through 16, high confidence" reads differently than "days 10 through 17, moderate confidence." The clinical user of our API, who might be a care coordinator or clinic nurse reviewing wearable-generated summaries before a patient appointment, needs both pieces of information. Suppressing uncertainty creates false precision. Including it without context creates noise.
In the clinical API output, we expose three fields alongside any date-ranged estimate: the point estimate, the interval bounds, and a calibration confidence label (high, moderate, or insufficient data). The insufficient data label triggers when data coverage during the prediction window falls below the thresholds described in other posts: fewer than five consecutive overnight segments with adequate coverage. In that case, we report that no reliable estimate is available for this cycle window rather than providing a wide interval that looks informative but reflects mainly data absence.
The distinction between wide-interval uncertainty and missing data uncertainty matters. Wide intervals are a statement about the model's genuine distributional uncertainty given available data. Missing data gaps are a different category, a failure of data collection rather than a property of the model, and they should not be compressed into a single confidence label that obscures the root cause.
The Practical Argument for Uncertainty Quantification
We could simplify the product by suppressing uncertainty outputs entirely and presenting only point estimates. This would make the display cleaner and remove several UI complexity decisions. The reason we do not: any system that helps inform health decisions carries an implicit promise that its output can be trusted at the level of precision it claims. A point estimate that says "day 14" does not signal that the true value might be day 11 or day 18. A well-calibrated interval that says "day 12 to day 16" does. Users who act on point estimates and find them frequently wrong lose trust in the product entirely. Users who understand that the model is reporting its genuine confidence, including the cases where that confidence is low, tend to engage with the product differently and report higher trust in the periods when confidence is high.
That is the practical argument for building uncertainty quantification into the core output layer rather than treating it as an optional display feature: it changes how users calibrate their own trust in the predictions, which makes the predictions more useful not less.