calibration_curve返回二分类下各分箱的平均预测概率与真实正例比例,需输入0/1标签和1d概率数组(如y_pred_proba[:, 1]),n_bins建议设10–20;calibratedclassifiercv通过sigmoid或isotonic法校准原始模型概率,不改预测标签只优化概率输出。

用 calibration_curve 获取校准数据点
校准曲线本质是把模型输出的概率按分箱(bin)统计真实正例频率(y_true)和平均预测概率(y_prob),sklearn.calibration.calibration_curve 就是干这个的。它不画图,只返回两个数组:横轴(平均预测概率)和纵轴(实际正例比例)。
常见错误是直接传入多分类的 y_pred_proba 全矩阵——它只接受二分类的 1D 概率数组(比如 y_pred_proba[:, 1])。若用 OneVsRestClassifier 等包装器,也得先提取某类的置信度。
- 必须确保
y_true是 0/1 标签,不是 one-hot 或字符串 -
n_bins默认 5,太粗略;实践中建议设为 10–20,尤其当样本量 > 5000 时 - 若某 bin 内无样本,
calibration_curve会跳过该 bin,返回的横纵坐标长度可能小于n_bins
用 CalibratedClassifierCV 对模型做概率校准
原始模型(如 SVC、RandomForestClassifier)输出的概率常不靠谱,CalibratedClassifierCV 可在训练时注入校准逻辑。它支持两种方法:sigmoid(Platt scaling)适合 SVM;isotonic(保序回归)更灵活但易过拟合小数据集。
注意它不改变预测标签,只重映射概率值。校准后模型的 predict_proba 输出才适合喂给 calibration_curve。
- 对小样本(isotonic,改用
sigmoid或干脆不校准 - 使用交叉验证模式(
cv='prefit'除外)时,校准是在每个 fold 上独立做的,最终概率是平均结果,所以无需额外 cross_val_predict -
CalibratedClassifierCV的predict_proba返回值仍是二维数组,记得取第二列用于二分类校准分析
手动画校准曲线并加参考线
用 matplotlib 把 calibration_curve 返回的点连成线,再叠加 y=x 参考线(理想校准)和直方图(显示各 bin 样本量),信息才完整。
容易忽略的是:概率分箱不均匀会导致某些 bin 样本极少,曲线抖动大。建议同时画出每个 bin 的样本数(用柱状图或点大小编码),否则可能误判“S 形偏差”其实是稀疏采样噪声。
- 横纵坐标范围都设为
[0, 1],否则参考线错位 - 用
plt.scatter比plt.plot更直观,点大小可设为bin_weights * 50(bin_weights来自calibration_curve的第 3 个返回值) - 别忘了加网格:
plt.grid(True, alpha=0.3),方便读数值
对比多个模型时避开常见陷阱
想比 LogisticRegression、RandomForest、XGBoost 的校准效果?关键不是看曲线离 y=x 多近,而是看校准前后的 ECE(Expected Calibration Error)变化。ECE 是加权平均绝对误差,权重是各 bin 样本占比。
一个隐蔽坑:不同模型预测概率的分布范围可能不同(比如 RF 常输出偏高或偏低概率),直接画在同一图上会掩盖系统性偏差。应分别计算 ECE,并用箱线图展示多次划分训练/测试集的结果,而非仅单次 split。
-
sklearn.metrics.brier_score_loss是另一个指标,但它对异常高置信低准确预测更敏感,和 ECE 互补,不要只盯一个 - 测试集必须和训练集完全隔离——校准步骤(包括
CalibratedClassifierCV的 cv 过程)不能接触测试标签 - 如果模型本身不支持
predict_proba(如原生XGBoost的 booster='gbtree'),需先用predict_proba方法或设置objective='binary:logistic'
校准曲线看着简单,但 bin 划分方式、样本分布偏斜、模型是否真正支持概率输出——这些细节一错,整条线就失去诊断价值。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











