learn-model-evaluation-with-phoebe / Leader session 2 of 6
Learn Model Evaluation with Phoebe · Leader track · Session 2 of 6

Precision, recall, and money

Last session you learned to distrust one number. Tonight you learn where the real decision hides: the threshold - the dial that trades marketing's pain against finance's pain, usually set to a default by whoever shipped the model. You will press two buttons on Lumen's live evaluator and watch them disagree by $704: the threshold that maximizes the team's favorite metric costs $704 MORE than the one that maximizes money, and the money-optimal point has the ugliest metrics on the card. By the end you can ask any team quoting F1 three questions they should be able to answer - and you will know that the cost matrix, not the metric, is the actual decision.

🟢 Leader track Executives · PMs · report readers No code, decisions only 45 min
0-3 · Welcome back 3-18 · The threshold nobody owns 18-42 · Live: the $704 button 42-45 · Q&A
Part 0

Welcome back: what a1 installed

Quick recap of the equipment you arrived with. Every yes/no model makes four kinds of outcome, and at Lumen the two mistakes carry different prices: a wasted outreach costs ~$2 (marketing's pain), a missed buyer costs ~$74 (finance's pain) - a 37x asymmetry. You learned the one question that exposes any single number ("which mistakes does this hide?") and you dragged the threshold yourself, watching precision and recall trade against each other while accuracy stayed serene. Tonight we finish that thought: WHO should set the dial, WHAT should be optimized, and what it costs - in exact dollars, on the live evaluator - when a team optimizes the wrong thing.

Live - presented in session Self-study - read after class ▶ Live evaluator - real math on real scores Official sources covered
★ What you walk out with today The threshold reframed as a business decision with a named owner, Elkan's one-sentence rule (the cost ratio picks the point), Ng's satisficing-vs-optimizing split as a governance mandate, the $704 Goodhart gap pressed with your own finger, and three questions for any team quoting F1.
Part 1 · covers sklearn threshold-tuning guide + Elkan 2001

The threshold nobody owns 15 min live

The threshold is a business decision wearing a math costume. A model does not decide who gets flagged - it outputs a score, and the threshold decides which scores count as "yes." Set it low and you flag more people: recall rises, precision falls, marketing pays. Set it high and the reverse: finance pays. A model therefore does not HAVE one precision and one recall - it has a curve of operating points, and someone picks the point. In most organizations that someone is a data scientist accepting the default of 0.5, a value scikit-learn's own documentation calls "most certainly not ideal for most use cases."

WHO OWNS THIS DIAL? 0 · flag everyone 1 · flag nobody the threshold MISSED BUYERS finance's pain ~$74 per miss drag right: WASTED OUTREACH marketing's pain ~$2 per false alarm drag right: One dial, two pains, moving in opposite directions. Someone is choosing. The default setting of 0.5 is also a choice - made by nobody, in favor of nobody, reviewed by nobody.
🔍 Click to zoom - the dial that trades finance's pain against marketing's pain
LiveA curve of operating points, one silent default7 min▶

When a team reports "precision 21.5%, recall 63.6%," they are reporting one point on a curve - the point their threshold happens to sit on. Move the threshold and both numbers move, in opposite directions. So the honest questions are never "what is the precision?" but:

  • What does the whole curve look like? The curve is the model's actual capability; any single P/R pair is one chosen point on it.
  • Which point are we operating at, and who chose it? If the answer is "0.5, the default," then the trade between finance's pain and marketing's pain was made by a library setting.
  • What would it take to move? Nothing - no retraining, one number. The threshold is the cheapest model improvement that exists, which is why leaving it at the default is so expensive.

scikit-learn is blunt about this in its threshold-tuning guide: the 0.5 cutoff is "most certainly not ideal for most use cases," and the library now ships a tool that tunes the threshold against a business scorer instead. The toolmakers have already conceded the point; most org charts have not caught up.

LiveElkan's rule: the cost ratio picks the point5 min▶

So where SHOULD the dial sit? A 2001 paper by Charles Elkan, "The Foundations of Cost-Sensitive Learning," settled it, and the leader version is one sentence: the right threshold follows from the cost ratio of the two mistakes. Price a missed buyer and a false alarm, and the optimal operating point is determined - it stops being a matter of taste.

  • At Lumen the ratio is roughly 37 to 1 ($74 miss vs $2 false alarm), which pushes the optimal threshold far LOWER than 0.5: when misses are 37x dearer, you flag generously and tolerate noise.
  • scikit-learn's own cost-sensitive example works exactly this way - a credit-risk case where one error is priced at five times the other, citing Elkan - and its tooling tunes the threshold to the money, not to a metric.
  • Which means the real deliverable from the business side is not a metric target. It is two prices. Give your teams the cost of each mistake and the threshold stops being anyone's opinion.
Self-studyDials you already own without knowing it3 min read▶

Once you see the threshold, you see it everywhere. Each of these is the same dial - two mistake types with different prices, one cut line, and usually no named owner:

  • Credit and risk approvals - approve a bad applicant vs decline a good one. The cut score is a threshold; ask who priced the two errors.
  • Fraud and security alerts - a missed incident vs an analyst hour burned per false alarm. Alert fatigue is a threshold set too low, silence is one set too high.
  • Content moderation - harmful content left up vs legitimate content taken down. Both mistakes make headlines; the dial decides which one you read about.
  • Hiring screens - a strong candidate filtered out vs an interview slot spent on a weak one. Whoever set that cutoff made a talent-strategy decision.
  • Lumen's outreach - tonight's case: a $74 miss vs a $2 nudge, 37 to 1.

The homework asks you to pick ONE of these in your own org and find the dial's owner. Expect the search to be short and the answer to be "nobody" - that is the finding.

Part 2 · covers Ng's satisficing-vs-optimizing doctrine + Goodhart's law

Goodhart for leaders 8 min live

Goodhart's law: when a measure becomes a target, it stops being a good measure. Here is the mechanism in evaluation: every summary metric hides a cost assumption. F1 - the metric teams most love to optimize - silently assumes both mistake types cost the same. At Lumen they differ by 37x. So a team maximizing F1 is optimizing for a fictional business where a $2 error and a $74 error are equally painful - and the harder they optimize, the more precisely they hit the wrong target.

The cost ratio F1 assumes, next to the ratios real businesses have what the metric assumes what the business actually costs F1's assumption 1 to 1 - both mistakes cost the same Lumen outreach model $74 miss vs $2 false alarm = 37 to 1 The churn business $310 churn vs $8 offer = 39 to 1 Bar length is the cost ratio: how many times dearer the expensive mistake is than the cheap one. F1 assumes 1 to 1. Optimize it at Lumen and you are tuning for a business that does not exist.
🔍 Click to zoom - F1's hidden assumption is off by a factor of 37 at Lumen
LiveThe governance fix: one optimizing number, everything else floors5 min▶

Andrew Ng's doctrine for structuring ML projects is the cleanest fix a leader can mandate: split metrics into one optimizing metric and several satisficing metrics - thresholds to clear, not scores to maximize.

  • The optimizing number should be the money (or the mission equivalent): expected cost or value per decision, using your two prices from Part 1.
  • Everything else becomes a floor or a ceiling: recall at least X so finance's exposure is capped, precision at least Y so marketing's budget survives, response time under Z. Pass/fail, not leaderboards.
  • This kills the Goodhart game structurally: nobody can win by polishing a proxy, because the only number being maximized is the one wired to the P&L.

One caution to carry forward: even the money number on an offline slice is a proxy for what happens in production - Google's "Rules of Machine Learning" makes this point as Rule #39, and it is the plot of a5 and a6. Tonight's fix is still the right first move: proxy-for-money beats proxy-for-nothing.

Real world

The churn team that polished F1 for a quarter. A subscription business ran a churn model whose team proudly pushed F1 up week after week, tuning at the default threshold. Finance saw nothing move. The reason sat in plain sight: a retention offer cost $8, a churned customer cost $310 - a cost ratio near 39x that F1 was structurally blind to. When someone finally optimized the threshold against those two prices, the model flagged far more customers, F1 got WORSE on the dashboard, and retention economics visibly improved within a month. The metric had been the target; the money had been the measure nobody watched.

LiveHow to spot Goodhart running in your own dashboards3 min▶

Four signs, any one of which deserves a meeting. Two or more and you are almost certainly funding metric-polishing:

  • The model metric improves for months while the business line it serves stays flat. The churn story, generalized - the proxy and the money have decoupled.
  • Nobody can state the metric's cost assumption. Ask "what does this metric assume the two mistakes cost?" F1 assumes 1 to 1; if nobody knows that, nobody checked whether it is true.
  • The metric was chosen because it is standard, not because it matches your prices. "Everyone reports F1" is a fashion statement, not an evaluation design.
  • The metric IS the team's target or OKR. That is Goodhart's precondition by definition - the fix is to move the target to the money and demote the metric to a floor.
Live demo

The $704 button ★ 20 min · everyone presses both

Same evaluator as a1 - Lumen's model on a live 2,000-session slice - but tonight you press the two buttons. One asks the machine to find the threshold with the best F1. The other asks for the threshold with the lowest total error cost, using the $2 / $74 price list. They disagree, they disagree by real money, and the ugly one wins.

Press Optimize F1. The threshold jumps to 0.61, F1 hits 0.706, and the metric tiles look magnificent. Now read the cost tile: $1,850. Remember that number.

Press Optimize $. The threshold drops to 0.22, cost falls to $1,146 - and F1 collapses to 0.161. Sit with the discomfort: the best business point has the ugliest metrics on the card. A dashboard sorted by F1 would rank the cheapest operating point dead last.

Do the arithmetic out loud: $1,850 minus $1,146 is $704 - the Goodhart gap. That is what optimizing the team's favorite metric costs on this one slice, versus optimizing the money. Nobody did anything wrong; the metric's hidden equal-costs assumption did it.

Now change the FN cost box - try a world where a missed buyer is worth much less - and press Optimize $ again. Watch the optimal threshold move. The model never changed; your business assumptions did, and the decision followed. Say the lesson: the cost matrix IS the decision. The metrics are commentary.

How to read the evaluator The two buttons search the same curve of operating points from Part 1 - one for the F1 peak, one for the cost valley. The cost tile prices the two error cells with the boxes below ($2 false alarm, $74 miss by default). Everything recomputes live; change a price and the "right answer" moves, which is exactly the point.

The scoreboard, for the record - three operating points of the SAME model on the SAME 2,000 sessions. Read the last two rows together: the row a dashboard would celebrate and the row the business should choose are different rows.

Three operating points of one model - the metric ranking is upside down F1 score, 0 to 0.8 scale error cost in dollars the cost-optimal point F1 - the dashboard's favorite Error cost per 2,000 sessions Default (nobody chose) threshold 0.50 0.321 $1,736 Optimize F1 threshold 0.61 0.706 $1,850 Optimize $ threshold 0.22 0.161 $1,146 $704 - the Goodhart gap Optimize F1 wins the dashboard at 0.706 and costs $1,850. Optimize $ scores 0.161 and costs $1,146. Same model, same 2,000 sessions, only the threshold moved. The ugliest metric row is the cheapest row.
🔍 Click to zoom - the best F1 row is the most expensive row, by $704
Operating pointThresholdPrecisionRecallF1Error cost
Default (nobody chose)0.5021.5%63.6%0.321$1,736
Optimize F1 (the dashboard's favorite)0.61100.0%54.5%0.706$1,850
Optimize $ (the business point)0.228.8%100.0%0.161$1,146

One more paradox rides along: at the F1-optimal point, accuracy reads 98.8% - a1's serene headline number, still calm, still uninformative, now decorating the operating point that costs $704 too much.

Part 3 · self-study

Three questions for any team quoting F1 5 min read

F1 is not a bad metric - it is a metric with an undisclosed opinion (equal costs) that is almost never true. When a team or a vendor leads with it, these three questions surface the opinion. Good teams enjoy answering them; the silence after each one is also an answer.

Self-studyThe three questions, with what each one exposes4 min read▶
  • 1 · "What cost ratio does your problem actually have?" F1 assumes 1 to 1. If the honest answer is 37 to 1 - or anything far from even - the metric and the business are optimizing different worlds. A team that has never priced the two mistakes cannot know whether F1 is fine or catastrophic.
  • 2 · "Who picked the threshold?" If the answer is "the default" or a name from the data team alone, the finance-vs-marketing trade from Part 1 was made without either party in the room. The dial needs an owner who knows both prices.
  • 3 · "What does the cost-optimal point look like - and why aren't we there?" Tonight you saw it: at Lumen it looks terrible on metrics (F1 0.161) and saves $704 per slice. Sometimes there is a real reason not to operate there - capacity limits, customer-experience floors. Fine: those are satisficing constraints, and they should be stated, not hidden inside a metric choice.

Notice these are governance questions, not math questions. You are not auditing formulas - you are auditing whether a business decision was made by someone authorized to make it.

Questions to ask your teams

This week, in your own meetings ◐ 15 min total

Source material

Official sources covered

This session teaches the decision core of the cost-sensitive evaluation canon - scikit-learn's threshold guidance, Elkan's cost-ratio result, and Ng's metric doctrines - in leader language, with the live evaluator doing the math. This page covers:

✓sklearn threshold-tuning guide + Elkan 2001 - "most certainly not ideal," the cost-ratio rulePart 1 · the tooling itself lives in practitioner b5
✓Ng, Structuring ML Projects - single-number metric, satisficing vs optimizingPart 2, as a governance mandate
✓evalml canon - the $704 Goodhart gap on the live Lumen sliceThe demo · same numbers the practitioner track derives
◐Google Rules of ML #39 - launch metrics are proxies for long-term goalsOne caution here · the full proxy chain in a5-a6
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · On Lumen's evaluator, the F1-optimal threshold costs $704 more than the cost-optimal one. Why do the two buttons disagree?

Same model, same 2,000 sessions, same curve - only the target differs. F1's hidden equal-costs assumption points it at a fictional business; the cost optimizer uses the real $2 / $74 prices, lands at threshold 0.22, and looks ugly (F1 0.161) while saving $704.

2 · In Ng's satisficing-vs-optimizing split, which number should a leader make THE optimizing metric?

One optimizing number keeps iteration fast and Goodhart-proof - provided it is wired to the business. Everything else (recall floor, precision floor, latency ceiling) is pass/fail. Optimizing several numbers at once means optimizing none; optimizing F1 means optimizing an equal-costs fiction.

3 · Who should own the threshold on a production classifier?

The threshold trades finance's pain against marketing's pain, so it needs an owner with both prices in hand - and Elkan's rule makes the setting follow from the cost ratio once they are. The 0.5 default is not a standard; sklearn's own docs call it "most certainly not ideal for most use cases."

Leader session 2 cheat sheet · pin this

The dialThe threshold trades missed buyers (finance, ~$74) against wasted outreach (marketing, ~$2). A business decision wearing a math costume - it needs a named owner.
Curve, not a pointA model has a whole curve of precision-recall operating points. Any quoted P/R pair is one chosen point - ask who chose it.
The 0.5 defaultsklearn's own docs: "most certainly not ideal for most use cases." A default is a choice made by nobody, in favor of nobody.
Elkan's ruleThe right threshold follows from the cost RATIO of the two mistakes. Deliver two prices and the dial setting stops being an opinion.
F1's hidden opinionF1 assumes equal error costs. At Lumen the errors differ 37x - so maximizing F1 optimizes a fictional business, precisely.
The $704 gapOptimize F1: t=0.61, F1 0.706, cost $1,850. Optimize $: t=0.22, F1 0.161, cost $1,146. The best business point has the ugliest metrics.
Satisficing vs optimizingONE optimizing number (the money), everything else floors and ceilings. Ng's doctrine, deployed as governance - it kills the Goodhart game structurally.
Three questions for F1What cost ratio does your problem actually have? Who picked the threshold? What does the cost-optimal point look like - and why aren't we there?