Why ROC does not notice
ROC plots true positive rate against false positive rate:
TPR = TP / (TP + FN) denominator: all actual positives
FPR = FP / (FP + TN) denominator: all actual negatives
Each is computed entirely within one class. TPR asks what fraction of positives were caught; FPR asks what fraction of negatives were wrongly flagged. Adding a million more negatives leaves TPR untouched and changes FPR only through its own denominator, which grows in proportion.
That class-independence is often described as a virtue, and for some purposes it is. It also means ROC cannot see the thing that makes rare-positive problems hard.
Why PR does notice
Precision is different:
precision = TP / (TP + FP) denominator: everything you flagged
The denominator mixes both classes. When negatives outnumber positives a hundred to one, even a small false positive *rate* produces a large *number* of false positives, and those go straight into precision's denominator.
Concretely: 10,000 rows, 100 positive. A model at 90% recall and 5% FPR catches 90 real positives and flags 495 negatives. FPR of 5% sounds excellent and ROC records it as such. Precision is 90 / 585 = 15%. Five out of six flagged cases are wrong, and every one costs somebody an investigation.
Reading the baselines
Each chart has a dashed no-skill line, and they differ.
For ROC it is the diagonal, always. A random classifier gets AUC 0.5 regardless of balance.
For PR it is a horizontal line at the positive rate. At 50% positives, random scores 0.5 precision. At 2%, random scores 0.02. Drag the slider and watch it drop.
This is what makes PR honest and slightly harder to read: there is no fixed scale. A PR AUC of 0.4 is poor on balanced data and outstanding at a 2% base rate. The number must always be compared against the baseline, never quoted alone.
Which to use
| Situation | Curve | Reason |
|---|
| Roughly balanced | either | they broadly agree |
| Rare positives | PR | ROC hides the false-positive volume |
| You care about ranking overall | ROC | it is what AUC measures |
| Someone acts on each flag | PR | precision is that person's experience |
| Comparing across datasets | ROC, carefully | PR baselines differ by base rate |
The practical rule: if a human or a process has to act on every positive prediction, precision is the thing they experience, and the PR curve is the one to look at.
Where it goes wrong
Reporting ROC AUC alone on imbalanced data. It is the standard way to make a model that will drown a team in false positives look ready to ship.
Comparing PR AUC across datasets with different base rates. The baselines are different, so the numbers are not comparable.
Forgetting that both curves span all thresholds. Neither tells you which threshold to deploy — that is a separate decision, made with [costs](threshold_tuning.html).