Theory · For the skeptic
How We Reconstruct Hands Nobody Showed
Most hands end without a showdown. Here is how a model of the field can still know what people were holding.
In a large database of hands, the cards are known for only a small fraction of them: the ones that reached showdown. Everything else is actions without cards. A model of how the field plays has to be built mostly from hands where nobody knows what anyone had. This article is about how that is possible, at the level of principle. The specific construction of the model is not described.
The problem with showdowns
The obvious approach is to use only the hands that were shown. You have the actions and the cards, so you can count: with this hand, in this spot, how often did the player bet?
The trouble is that the shown hands are not a fair sample of all hands. A hand reaches showdown because of what happened along the way: someone called, nobody folded, the pot went to the end. Bluffs that worked are never shown. Value hands that got folded to are never shown. Marginal hands that gave up on the turn are never shown. What you see at showdown is biased toward the hands that had a reason to be there, and a model built on that sample inherits the bias. It will think the field bluffs less than it does and value-bets more than it does, because that is what the showdowns say.
Any serious attempt to model the field has to account for the hands that were never shown. Not by guessing them individually, which is impossible, but by treating them correctly as unknowns.
A hospital, not a card room
The problem is not unique to poker, and it helps to see it somewhere else first.
A hospital has records of patients who came in and were diagnosed. For each of them, the diagnosis is known, and so is the trail that led there: the symptoms they reported, the tests they took, the things they did before arriving. From those records you can learn what the trail of a given illness looks like.
Now consider everyone who had the same illness but never came to the hospital. Their diagnosis is unknown. But their trail is not: the same symptoms, the same early steps, visible in other records. Because you learned what the trail looks like from the confirmed cases, you can look at an unconfirmed trail and say how likely each diagnosis is. Not which one it is; how likely each one is.
Doing this carefully removes the bias that comes from only counting the people who showed up. The people who showed up are not representative, but they teach you what to look for in everyone else. And the test of whether you have learned it right is simple: take a new patient, look only at their trail, predict the diagnosis, then check against what the hospital finds. If the predictions hold up on patients you have never seen, the model has learned something real.
Replace diagnosis with cards, trail with actions, and hospital with showdown. That is the method.
Every hidden hand is a distribution
In the model, a player's unknown hand is never a single guess. It is a probability spread over every hand they could possibly hold, given the cards that are visible. Before anything happens, that spread is wide. Then each action narrows it. A player who raised before the flop is less likely to have some hands and more likely to have others; a player who then called a re-raise rather than folding or raising again is narrower still; a player who checked the flop and called a bet narrows further. By the river, the spread is much tighter than it was at the start, and it was shaped entirely by what the player did.
For a hand that reaches showdown, the spread collapses to a single point: the cards are known. Those hands are the anchors. They are the confirmed diagnoses, the places where the model can check its estimate against the truth.
Learning in a loop
The model needs two things at once, and each depends on the other. It needs to know how the field plays each hand in each spot, so that it can narrow the spread for an unknown hand. And it needs the narrowed spreads for unknown hands, so that it can learn how the field plays each hand from hands where the cards were never shown.
This is solved the way such problems are usually solved: in turns. Start with a rough idea of how the field plays. Use it to estimate the hidden hands across the whole database. Use those estimates to build a better idea of how the field plays. Estimate the hidden hands again, now more accurately. Repeat until the picture stops changing.
The showdowns keep this honest. At every turn, the hands with known cards pull the estimates back toward reality; without them, the loop could drift toward a self-consistent picture that has nothing to do with the actual pool. With them, each pass through the data is checked against the cases where the answer is known.
Nothing from a solver enters at any point. The starting picture is not an equilibrium, and the loop is not pulled toward one. If the field does something no solver would do, the model learns the field's version, because that is what the data supports.
Only what is visible at the table
The model is trained on exactly the information a player at the table would have had: everyone's actions, the board, and the cards that were turned over at showdown. Nothing else.
This is a rule, not a limitation of the data. Some sources of hand histories include the cards of players who folded, or of players who mucked at showdown. The model does not use them, even when they are there. The reason is portability. A model that needs hidden cards can only be built where hidden cards are available, which is almost nowhere. A model that needs only what was visible can be built from any room, any format, and eventually any game, from the histories an ordinary player can obtain.
It is also the reason the reconstruction has to be done properly. With hidden cards available, one could simply count. Without them, the only way to know what the field holds is to infer it, and the inference is the whole method.
What this is not
It is not a database lookup. The model does not store hands and retrieve them; it stores a picture of how the field behaves, and that picture is what answers your query. You cannot get a hand history back out of it.
It is not a language model, and it does not generate plausible-looking ranges from a description of the spot. Every number in the chart is a probability estimated from the data by the loop above and checked against showdowns. Where the data is thin, the estimate is uncertain, and that is visible in the model's behavior rather than papered over.
And it is not guessing. The word "reconstruct" is used deliberately. The hands that were never shown are not invented; they are inferred from what the player did, using what the model has learned about the pool, and the quality of that inference is measured on hands the model never saw. How it is measured is the subject of the next article.
Next: How the Model Is Tested