A model that tells a product team a player is worth a specific figure over the next ninety days sounds precise and is quietly dishonest, because it hides the one thing the team needs in order to act well: how sure are we? A value give-or-take a small margin is a whale worth protecting with real budget; the same value give-or-take an enormous margin is a shrug the team should not spend a cent against. So we ship player lifetime value as a calibrated range, not a bare number. Two ideas make that possible: a model shaped for the way the data is actually generated, and a wrapper that turns any model's output into an honestly-sized interval.
The value distribution fights you
Player value is one of the least cooperative targets in applied machine learning. In most games the distribution is heavy-tailed and mostly zero: a large share of players spend nothing at all, a long tail spend a little, and a small handful spend enormously; in some cohorts the average even nets negative once refunds and costs are counted. Point a single squared-error regressor at that and two bad things happen at once. The whales dominate the loss, because a single large residual outweighs hundreds of small ones, and drag every prediction upward, so the model is systematically miscalibrated in the body of the distribution where the vast majority of players actually live. Meanwhile the wall of zeros pulls the other way. The result is a model that is wrong for the many in order to be slightly less wrong for the few.
So we do not model value directly. We use a hurdle model that factors the problem the way the data is actually generated: expected value is the probability a player is active at all over the horizon multiplied by their expected value given that they are active. A classifier predicts whether the player will spend anything at all, and a separate robust regressor predicts the value conditional on being active, using a loss that behaves like squared error near the centre but like absolute error in the tail, so heavy outliers inform the fit without dominating it.
Two additional quantile heads, a low and a high one, give a first, model-based sense of the spread around that conditional mean. Splitting the "will they spend at all" question from the "how much, if they do" question means each head sees a cleaner, more homogeneous problem, and the composite is calibrated across the whole population rather than only near the whales.
Conformal prediction: honesty as a wrapper
The quantile heads give a spread, but their coverage is only as trustworthy as the model's own assumptions, and heavy-tailed targets are exactly where those assumptions tend to break. For a guaranteed interval we reach for split-conformal prediction, which has a property that sounds too good to be true: it produces intervals with a chosen coverage level, say eighty per cent, regardless of the model underneath, distribution-free, assuming only that the data is exchangeable.
The mechanism is disarmingly simple. Hold out a calibration set the model never trained on. For each calibration point, compute how far the true value fell outside the model's predicted band. Sort those scores across the calibration set and take the quantile corresponding to your target coverage; that single number is the amount by which you must widen, or where the model was pessimistic can tighten, every future prediction's interval to achieve on average the coverage you asked for. New predictions then ship as a point estimate plus a calibrated margin, and empirically the promised fraction of true values land inside the band.
The beauty is that conformal prediction does not care whether the model beneath it is a gradient-boosted tree, a linear model or something exotic; it audits the model's actual mistakes on held-out data and prices the uncertainty accordingly. A model that is genuinely confident on a segment earns a tight band there; one that is guessing on a sparse, unusual segment is forced to admit it with an honestly wide one. Because the guarantee is a property of the wrapper and the calibration set, it survives retraining: re-run the calibration step and the coverage promise holds for the new model too.
Measure the promise you made
We do not simply take the guarantee on faith. The bands are backtested: on a held-out window we check what fraction of true values actually landed inside the predicted intervals, and compare that to the target. If an eighty per cent band is only capturing sixty per cent of outcomes, the exchangeability assumption is being violated somewhere, usually a distribution shift between calibration and serving, and that is a signal to re-calibrate on fresher data, not to quietly widen the band until the number looks acceptable.
Coverage is a measurable promise, so we measure it, and the observed coverage is itself something the product team can see rather than a claim buried in a design doc. Calibrated uncertainty is only meaningful when someone is checking that it stays calibrated.
Why the range is the product
In the console, value shows up as a number with a confidence range drawn behind it. That range is not decoration and it is not a disclaimer bolted on at the end. A tight band says act on this, commit budget; a wide band says this is a hint, gather more signal before you spend against it. It changes the decision, and over time it changes the trust. A product manager who has watched a confident point estimate be wildly wrong learns, correctly, to ignore the model entirely; one who has seen calibrated ranges, narrow when the model has earned it and wide when it has not, learns exactly how much weight to put on each score.
There is a cultural point hiding inside the technical one. Shipping a point estimate is a decision to hide uncertainty; shipping a calibrated interval is a decision to expose it. The second is harder, because it costs you a holdout, a calibration pass and the humility to draw a wide band when the model deserves one, and it is precisely the difference between a demo that impresses in a screenshot and a system a team will actually run against real money.

