Palate

The Instrument Room

Which ingredients decide the dish

Put a flour tortilla on the counter and the question of what you are making is mostly settled. Put down an onion and you have said nothing at all. That difference is real and it is measurable — and it turns out to be one of the more useful things an ingredient can tell you.

We labelled every recipe in the corpus — 3,018 of them — with the form of dish it is: 22 forms, from soup and stir-fry to taco/wrap and an honest main (other). Then, for each of the 400 most common ingredients, we asked how much knowing it is in the pot narrows down what the pot is. The answer is the entropy of that distribution, and it splits the pantry cleanly: spaghetti scores 0.81 on a 0–1 scale where 1 means fully decisive; water scores 0.09. The median ingredient sits at 0.30.

In one paragraph

Over 3,018 recipes labelled with 22 dish forms, the entropy of P(dish form | ingredient) separates the pantry into ingredients that decide the dish and ingredients that decide nothing: spaghetti scores 0.81 on a 0–1 commitment scale (1 = fully decisive) against water at 0.09, with a median of 0.30 across the 212 ingredients appearing in at least 25 recipes. How strongly an ingredient tastes is essentially unrelated to how much it decides — Spearman ρ = -0.02 between measured flavor carry and commitment, across 209 ingredients. A Naive Bayes over ingredient presence names the form at 45.9% top-1 / 73.1% top-3 (5-fold, n=3,018, 22 classes, majority baseline 13.5%), and its errors concentrate in pairs of forms that share a shopping list and differ only in what the cook does: soup and stew trade places 16.6% of the time.

2026-08-05T23:34:55.271252 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 structure lock — 1 − normalised entropy of P(dish form | ingredient) spaghetti flour tortilla vanilla extract powdered sugar rice noodle condensed milk ricotta corn tortilla orange zest salmon onion powder long grain basmati rice water salt egg lime juice pork lard oil garlic flour shrimp vegetable oil sunflower oil 0.81 · pasta 86% of its dishes 0.79 · taco/wrap 86% of its dishes 0.75 · dessert 83% of its dishes 0.74 · dessert 77% of its dishes 0.68 · noodles 55% of its dishes 0.67 · dessert 66% of its dishes 0.66 · pasta 73% of its dishes 0.64 · taco/wrap 72% of its dishes 0.62 · dessert 67% of its dishes 0.62 · hearty main 67% of its dishes 0.62 · hearty main 69% of its dishes 0.62 · rice dish 59% of its dishes 0.09 · soup 12% of its dishes 0.09 · hearty main 16% of its dishes 0.10 · main (other) 9% of its dishes 0.13 · taco/wrap 12% of its dishes 0.13 · soup 19% of its dishes 0.15 · snack 12% of its dishes 0.15 · curry 10% of its dishes 0.16 · hearty main 19% of its dishes 0.16 · dessert 16% of its dishes 0.16 · noodles 11% of its dishes 0.16 · stir-fry 13% of its dishes 0.16 · casserole/bake 9% of its dishes Twelve ingredients that decide the dish, and twelve that decide nothing
Structure lock = 1 − normalised entropy of P(dish form | ingredient), over 3,018 recipes and 22 forms. Only ingredients appearing in at least 25 recipes are published (212 qualify). Beside each bar: that ingredient's most over-represented form.

Brittle and flexible are not opinions

The top of the ladder holds no surprises, and that is the point — the statistic recovers what a cook already knows without being told any of it. Nobody had to write down that a tortilla means tacos. What the measurement adds is an ordering for the enormous middle, where intuition goes vague. Half the pantry scores below 0.30: knowing it is present leaves most of the question open.

Notice what the deciding ingredients have in common. They are almost all structural — the thing the dish is built on or served in. The ingredients that decide nothing are the ones a recipe can always reach for: water, salt, garlic, oil, an egg. Those appear in hundreds or thousands of recipes precisely because they belong everywhere.

The twelve most decisive ingredients above the n ≥ 25 floor.
decides the dishlockin n recipesits most over-represented form
spaghetti0.8136pasta — 86% of its dishes, 16.8× the base rate
flour tortilla0.7935taco/wrap — 86% of its dishes, 24.2× the base rate
vanilla extract0.7581dessert — 83% of its dishes, 11.6× the base rate
powdered sugar0.7447dessert — 77% of its dishes, 10.7× the base rate
rice noodle0.6833noodles — 55% of its dishes, 22.6× the base rate
condensed milk0.6729dessert — 66% of its dishes, 9.2× the base rate
ricotta0.6626pasta — 73% of its dishes, 14.2× the base rate
corn tortilla0.6461taco/wrap — 72% of its dishes, 20.3× the base rate
orange zest0.6227dessert — 67% of its dishes, 9.3× the base rate
salmon0.6255hearty main — 67% of its dishes, 5.0× the base rate
onion powder0.6235hearty main — 69% of its dishes, 5.1× the base rate
long grain basmati rice0.6232rice dish — 59% of its dishes, 10.5× the base rate
The twelve least decisive. Their 'most over-represented form' barely beats the base rate — which is the finding, not a footnote.
decides nothinglockin n recipesits most over-represented form
water0.09777soup — 12% of its dishes, 1.2× the base rate
salt0.091879hearty main — 17% of its dishes, 1.2× the base rate
egg0.10587main (other) — 9% of its dishes, 3.1× the base rate
lime juice0.13181taco/wrap — 12% of its dishes, 3.3× the base rate
pork0.1389soup — 19% of its dishes, 1.9× the base rate
lard0.1559snack — 12% of its dishes, 3.9× the base rate
oil0.15192curry — 10% of its dishes, 2.6× the base rate
garlic0.161679hearty main — 19% of its dishes, 1.4× the base rate
flour0.16438dessert — 16% of its dishes, 2.2× the base rate
shrimp0.16169noodles — 11% of its dishes, 4.4× the base rate
vegetable oil0.16539stir-fry — 13% of its dishes, 3.7× the base rate
sunflower oil0.1669casserole/bake — 9% of its dishes, 3.5× the base rate

Loud is not the same as decisive

Palate already measures how strongly each ingredient speaks: potency times the magnitude of its 18-note flavor profile, the same arithmetic the engine uses to build a dish’s X-ray. It would be reasonable to assume the loud ingredients are also the deciding ones. They are not. Across the 209 ingredients where both numbers exist, the rank correlation between flavor carry and structure lock is ρ = -0.02 — no relationship at all.

Structure and cuisine are more related — ρ = 0.47 across 212 ingredients — but still far from the same measurement. Fish sauce will tell you which half of the world you are cooking in and nothing whatsoever about what you are cooking.

Top-quintile flavor carry, bottom of the commitment ladder. These are the seasonings — they change how a dish tastes without changing what it is.
loud, decides nothingflavor carry (percentile)structure lock
lime juice98%0.13
lemon juice97%0.22
soy sauce96%0.22
fish sauce100%0.23
tomato sauce89%0.25
sesame oil83%0.27
Bottom-third flavor carry, top of the commitment ladder. Spaghetti barely registers on the palate and settles the entire question.
quiet, decides the dishflavor carry (percentile)structure lock
spaghetti2%0.81
flour tortilla11%0.79
rice noodle2%0.68
ricotta30%0.66
corn tortilla20%0.64
onion powder20%0.62
2026-08-05T23:34:56.084912 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0.0 0.2 0.4 0.6 0.8 1.0 1.2 held-out recall (5-fold) pizza dumpling sauce/condiment main (other) side snack appetizer casserole/bake rice dish soup sandwich salad hearty main stew drink bread noodles curry stir-fry pasta taco/wrap dessert 0% (n=6) 0% (n=29) 12% (n=65) 14% (n=91) 15% (n=169) 20% (n=93) 24% (n=169) 25% (n=75) 29% (n=171) 32% (n=298) 34% (n=47) 38% (n=129) 45% (n=407) 46% (n=327) 52% (n=80) 54% (n=83) 67% (n=73) 76% (n=122) 76% (n=106) 78% (n=155) 78% (n=107) 94% (n=216) overall 46% Every form the model was asked to name, and how often it got it right 46% top-1 / 73% top-3 over 22 forms, n=3,018, majority baseline 13%
Held-out recall per form, 5-fold over n=3,018. Bars below the overall rate are shown in the muted tone. Two forms — pizza (n=6) and dumpling (n=29) — are never predicted correctly at all; they are small classes competing against much larger neighbours, and we publish that rather than hiding them.

Reading the whole plate

Taking all of a recipe’s ingredients at once, a Naive Bayes gets the form right 45.9% of the time and has it in its top three 73.1% of the time — 22 classes, held out, n=3,018, against a majority baseline of 13.5%. That is a real signal from an arithmetic you could do on paper.

It is also weaker than the same model reading the corpus’s own ten coarse categories — 63.4% top-1 / 87.8% top-3, majority baseline 58.9% — which is the honest price of asking a harder question. Ten categories are mostly “is this dinner or is it pudding”. Twenty-two forms ask what kind of dinner.

The easy forms are the ones with a structural ingredient you can buy: dessert, taco/wrap, pasta, curry, stir-fry. The hard ones are the ones defined by serving context or by cooking method — side, snack, appetizer, main (other) — where no purchase betrays the answer.

2026-08-05T23:34:56.545430 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 0% 5% 10% 15% 20% 25% swap rate — recipes of either form the model gave to the other appetizer ↔ snack noodles ↔ soup dessert ↔ drink noodles ↔ stir-fry rice dish ↔ stir-fry hearty main ↔ stir-fry bread ↔ dessert soup ↔ stew 8.0% (21 of 262) 8.9% (33 of 371) 9.8% (29 of 296) 10.1% (18 of 179) 10.1% (28 of 277) 10.1% (52 of 513) 10.7% (32 of 299) 16.6% (104 of 625) The pairs that trade places are the pairs that share a shopping list
Symmetric swap rate: for each pair of forms, the share of their combined held-out recipes that the model handed to the other one. Only pairs with at least 60 combined examples and 10 swaps are shown.

What a shopping list cannot see

The errors are not scattered. They collect into a handful of specific pairs, and the pairs are legible: soup and stew trade places 16.6% of the time — 104 of 625 recipes. hearty main and stir-fry swap 10.1% of the time. Bread and dessert. Appetizer and snack.

Every one of those pairs is two dishes with the same shopping list. A soup and a stew are the same chicken, the same carrot, the same stock — what separates them is how much liquid stayed in the pot and how long it stayed on the heat. A roast and a stir-fry are the same chicken and the same pepper; what separates them is whether the pan was hot and the pieces were small. Nothing in an ingredient list records what the cook did. A model that reads only what you bought is blind to it by construction — and technique is precisely what Palate’s recipe stategraphs carry and this model does not read. That is not a flaw to apologise for; it is a measurement of where the next model has to look.

Every form, in recall order. Published in full — including the two the model never gets right.
formheld-out recalln
dessert94%216
taco/wrap79%107
pasta78%155
stir-fry76%106
curry76%122
noodles67%73
bread54%83
drink53%80
stew46%327
hearty main45%407
salad38%129
sandwich34%47
soup32%298
rice dish29%171
casserole/bake25%75
appetizer24%169
snack20%93
side15%169
main (other)14%91
sauce/condiment12%65
dumpling0%29
pizza0%6

How few ingredients is enough?

Guessing from a finished recipe is not how cooking works. A cook has two or three things on the counter and has not decided yet. Scoring held-out recipes on only their first few listed ingredients shows how quickly the picture resolves — and it resolves faster than the full-recipe number suggests you should expect. With 3 ingredients down, the right form is the model’s first guess 35% of the time and in its top three 60% of the time.

This measurement is also why the shipped model counts only what is present rather than also counting what is absent. On complete recipes the two versions are a coin toss (46.1% against 45.9%), but a count-the-absences model reads the 397 unused ingredients on a three-item board as genuinely absent rather than not-yet-added, and its accuracy at that point collapses to 20%. Both curves are published.

Held-out accuracy from a partial plate: the first n ingredients in the recipe's own listed order, 5-fold, shipped model.
ingredients on the boardtop-1top-3n
124%47%3,018
230%55%3,018
335%60%3,018
540%65%3,018
843%70%3,018

Honest limitations

  • The dish-form labels were written by a language model, once, and frozen. Every non-main recipe keeps the corpus’s own category; the 1,778 main courses were read by Claude subagents against a fixed 15-form rubric with an explicit precedence order, and their verbatim output is committed alongside the sidecar. It is a careful reading, not a ground truth. A human taxonomist would disagree at the boundaries — is a fricassee a stew or a plated chicken? is a wonton soup a soup or a dumpling? — and those boundaries are exactly where the model’s errors sit. A deterministic title-mining cross-check reaches 990 of the mains and agrees with the labels 84% of the time; every class of disagreement is published with the sidecar.
  • Commitment measures convention, not necessity. A high structure lock says recipe authors mostly use this ingredient in one kind of dish. It does not say the ingredient belongs only there, and it is a fact about this corpus — which is Western-skewed — rather than about cooking. Rice noodles score 0.68 here; against a corpus written in Hanoi they would score far lower, because there would be far more kinds of dish to put them in.
  • Entropy is normalised, so the number depends on the label set. Every lock is 1 − H/log(22). Split curry into six regional forms and every curry ingredient would score lower without a single recipe changing. Comparisons within this page are sound; comparisons across taxonomies are not.
  • Two forms are too small to learn. Pizza has 6 held-out examples and dumpling has 29; both score zero recall. With classes that small, a model that never predicts them loses almost nothing, so it never predicts them. They are printed rather than quietly dropped from the average.
  • Flavor carry does not resolve for every ingredient. 394 of 400 vocabulary ingredients (99%) link to a rated registry entry; the rest carry a null rather than an estimate and are excluded from the correlation.
  • The model is deliberately the simplest thing that works. Naive Bayes assumes ingredients are independent given the dish, which is plainly false — that is why it is here. It is the floor a better model has to clear, published with its number so the comparison is possible. It reads only presence: never quantity, never order, never technique.
  • This piece reads a different corpus cut than its neighbours. 3,018 recipes (v18), where the rest of the Instrument Room publishes the 2,345-recipe v17. The labels are keyed to v18 recipe ids; mixing the two would silently drop 673 recipes.

The data

Every number on this page is a deterministic measurement over the same recipe corpus — nothing here was estimated or embellished. Want to check the work, or run your own analysis? A 250-dish sample of the corpus — ingredients, 18-note flavor profiles, timing, macros — is free to download.

Get the dataset

Cite this

Palate, “Which ingredients decide the dish,” https://palate.kitchen/instrument/which-ingredients-decide-the-dish — include the date you accessed it.

The measurements on this page are free to quote with attribution to Palate. The downloadable 250-dish sample dataset on /data is licensed CC BY-NC 4.0.