Welcome to Calibration & Class Imbalance — the part of machine learning where your model says:
“I’m 99% confident... and 99% wrong.” 😬
Don’t worry — we’ll teach it humility.
🎯 The Business Reality Check¶
In most real-world business data:
95% of customers don’t churn
98% of transactions aren’t fraud
99% of emails aren’t spam
So your model could predict “no churn” every time and still boast 95% accuracy. But that’s like saying:
“I never predict rain — and I’m right most of the year!” ☀️
High accuracy, zero usefulness.
🧩 Understanding Class Imbalance¶
Class imbalance happens when one class dominates the other.
| Example | Majority | Minority |
|---|---|---|
| Churn Prediction | Loyal Customers | Churners |
| Fraud Detection | Legit Transactions | Frauds |
| Medical Diagnosis | Healthy Patients | Sick Patients |
The model ends up being biased — not because it’s evil, but because math told it “majority wins!” 🧮👑
📉 The Deceptive Accuracy Trap¶
Let’s simulate the tragedy:
from sklearn.metrics import accuracy_score
y_true = [0]*95 + [1]*5 # 5% churn
y_pred = [0]*100 # predicts 'no churn' for everyone
print("Accuracy:", accuracy_score(y_true, y_pred))Output:
Accuracy: 0.95Looks amazing — until your CEO asks:
“So which 5 customers are actually leaving?” …and you just smile nervously. 😅
🧠 Solutions That Save the Day¶
🩹 1. Resampling¶
Oversampling: Clone the minority class (e.g., churners).
Undersampling: Downsize the majority class.
SMOTE: Synthetic Minority Over-sampling Technique — a fancy way of saying “make fake churners” 🤖.
from imblearn.over_sampling import SMOTE
X_res, y_res = SMOTE().fit_resample(X, y)Now your model trains on a fairer playground.
⚙️ 2. Class Weights¶
Tell your model:
“Pay more attention to minority classes!”
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(class_weight='balanced')
model.fit(X, y)It’s like giving your model sensitivity training. 🧘
📊 3. Better Metrics¶
Forget accuracy. Instead, use:
Precision → Of predicted positives, how many are right?
Recall → Of actual positives, how many did we catch?
F1-score → The harmonic lovechild of both ❤️
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))Now we talk business results, not vanity metrics.
🎯 Calibration — Teaching Models Humility¶
Calibration ensures that when your model says “0.8 probability,” it actually means “8 out of 10 times, this happens.”
Many models are overconfident — especially tree-based and neural ones.
Let’s fix that with a calibration curve:
from sklearn.calibration import calibration_curve
import matplotlib.pyplot as plt
prob_true, prob_pred = calibration_curve(y_true, y_pred_prob, n_bins=10)
plt.plot(prob_pred, prob_true, marker='o')
plt.plot([0, 1], [0, 1], '--', color='gray')
plt.title("Calibration Curve – Confidence vs Reality")
plt.xlabel("Predicted Probability")
plt.ylabel("True Probability")
plt.show()A perfectly calibrated model hugs the diagonal. If yours doesn’t — don’t worry, nobody’s does. 😅
🧩 Practice Challenge¶
Create a highly imbalanced dataset using
make_classification.Train two models: one with and one without
class_weight='balanced'.Compare precision, recall, and F1.
Plot a calibration curve.
Write a “CEO report” explaining why 95% accuracy is misleading — bonus points for sarcasm.
🧮 Quick Recap¶
| Concept | What It Means |
|---|---|
| Imbalanced Data | One class dominates the other |
| Resampling | Adjust data ratios |
| Class Weights | Penalize majority mistakes |
| Calibration | Align predicted probs with real outcomes |
| Better Metrics | Precision, Recall, F1 over Accuracy |
💬 “A model without calibration is like a confident intern — always sure, sometimes right, never humble.” 😎
🔗 Next Up: Lab – Churn Prediction Time to build your own churn model and see if you can spot the quitters before they quit! 🧠💼
# Your code here