A classifier outputs a probability; a system needs a decision. The conversion is a threshold, and 0.5 is only optimal when a false positive and a false negative cost exactly the same. They almost never do. Given four numbers, the right threshold is one line of algebra — here it comes out at 0.258, and using 0.5 instead costs £3,570 per 10,000 transactions.
0.5 is an assumption, not a default
predict() in scikit-learn thresholds at 0.5. That is a reasonable library default and a poor production decision, because it encodes a claim: that being wrong in one direction costs precisely as much as being wrong in the other. In fraud, a missed fraud costs a chargeback and a blocked customer costs a sale. In medical triage the two are not remotely comparable. In content moderation they are different kinds of harm entirely.
Two preconditions before any of the arithmetic below is meaningful. The scores must be calibrated probabilities, because the threshold that comes out is on the probability scale — an uncalibrated 0.258 is not 0.258. And the four costs must be real numbers agreed with whoever owns the budget, not guesses supplied by the modeller.
The cost matrix








