.. _calibration: ======================= 概率校准 ======================= .. currentmodule:: sklearn.calibration 在进行分类时,您通常不仅希望预测类别标签,还希望获得相应标签的概率。这个概率为您提供了某种预测的置信度。有些模型可以给出类别概率的较差估计,有些甚至不支持概率预测(例如,某些实例的 :class:`~sklearn.linear_model.SGDClassifier` )。校准模块允许您更好地校准给定模型的概率,或者添加对概率预测的支持。 良好校准的分类器是概率分类器,其 :term:`predict_proba` 方法的输出可以直接解释为置信水平。例如,一个良好校准的(二元)分类器应该对样本进行分类,使得在其给出接近0.8的 :term:`predict_proba` 值的样本中,大约80%实际上属于正类。 在我们展示如何重新校准分类器之前,我们首先需要一种方法来检测分类器的校准程度。 .. note:: 严格适当的评分规则,如 :func:`sklearn.metrics.brier_score_loss` 和 :func:`sklearn.metrics.log_loss` ,评估模型的校准(可靠性)和区分能力(分辨率),以及数据的随机性(不确定性)。这遵循Murphy [1]_ 的著名Brier评分分解。由于不清楚哪个项占主导地位,评分对于单独评估校准的用途有限(除非计算分解的每个项)。例如,较低的Brier损失并不一定意味着更好的校准模型,它也可能意味着校准更差的模型,但具有更强的区分能力,例如使用更多的特征。 .. _calibration_curve: 校准曲线 ------------------ 校准曲线,也称为*可靠性图*(Wilks 1995 [2]_),用于比较二分类器概率预测的校准程度。它将正标签的频率(更准确地说,是*条件事件概率* :math:`P(Y=1|\text{predict_proba})` 的估计值)绘制在 y 轴上,而将模型的预测概率 :term:`predict_proba` 绘制在 x 轴上。难点在于获取 y 轴的值。在 scikit-learn 中,这是通过将预测值分箱来实现的,使得 x 轴表示每个箱中的平均预测概率。然后,y 轴是给定该箱预测值的*正样本比例*,即每个箱中正类样本的比例。 顶部校准曲线图是通过 :func:`CalibrationDisplay.from_estimator` 创建的,该函数使用 :func:`calibration_curve` 计算每个箱的平均预测概率和正样本比例。:func:`CalibrationDisplay.from_estimator` 接受一个已拟合的分类器作为输入,用于计算预测概率。因此,分类器必须具有 :term:`predict_proba` 方法。对于少数没有 :term:`predict_proba` 方法的分类器,可以使用 :class:`CalibratedClassifierCV` 将分类器输出校准为概率。 底部直方图通过显示每个预测概率箱中的样本数量,提供了每个分类器行为的一些见解。 .. figure:: ../auto_examples/calibration/images/sphx_glr_plot_compare_calibration_001.png :target: ../auto_examples/calibration/plot_compare_calibration.html :align: center .. currentmodule:: sklearn.linear_model :class:`LogisticRegression` 更有可能自行返回良好校准的预测,因为它具有损失的规范链接函数,即 :ref:`log_loss` 的对数链接函数。 在没有惩罚的情况下,这导致了所谓的**平衡属性**,参见[8]_和:ref:`Logistic_regression` 。 在上面的图中,数据是根据线性机制生成的,这与:class:`LogisticRegression` 模型(模型是“良好指定的”)一致,并且正则化参数 `C` 的值被调整为适当(既不太强也不太低)。因此,该模型从其 `predict_proba` 方法返回准确的预测。 与此相反,其他显示的模型返回有偏差的概率;每个模型有不同的偏差。 .. currentmodule:: sklearn.naive_bayes :class:`GaussianNB` (朴素贝叶斯)倾向于将概率推向0或1(注意直方图中的计数)。这主要是因为它假设在给定类别的情况下特征是条件独立的,而在这个包含2个冗余特征的数据集中并非如此。 .. currentmodule:: sklearn.ensemble :class:`RandomForestClassifier` 显示了相反的行为:直方图显示在概率大约0.2和0.9处有峰值,而接近0或1的概率非常罕见。Niculescu-Mizil和Caruana [3]_给出了这种解释:“诸如bagging和随机森林这样平均一组基础模型预测的方法,在接近0和1的预测上会有困难,因为基础模型中的方差会导致应该接近零或一的预测偏离这些值。由于预测被限制在区间[0,1]内,由方差引起的误差在接近零和一的地方往往是一侧的。例如,如果一个模型应该对一个案例预测p = 0,bagging能达到这一点的唯一方法是所有bagged树都预测零。如果我们向bagging所平均的树添加噪声,这种噪声将导致一些树对该案例预测大于0的值,从而使bagged集合的平均预测偏离0。我们观察到这种效应最 与随机森林强烈相关,因为随机森林训练的基础级树由于特征子集化而具有相对较高的方差。" 因此,校准曲线显示出典型的S形,表明分类器可以更多地信任其"直觉",并通常返回更接近0或1的概率。 .. currentmodule:: sklearn.svm :class:`LinearSVC` (SVC) 显示的S形曲线比随机森林更为明显,这是最大间隔方法的典型特征(参见Niculescu-Mizil和Caruana [3]_),这些方法专注于接近决策边界的难以分类的样本(支持向量)。 校准分类器 ------------ .. currentmodule:: sklearn.calibration 校准分类器包括拟合一个回归器(称为*校准器*),该回归器将分类器的输出(通过:term:`decision_function` 或:term:`predict_proba` 给出)映射到[0, 1]范围内的校准概率。记给定样本的分类器输出为:math:`f_i` ,校准器试图预测条件事件概率:math:`P(y_i = 1 | f_i)` 。 理想情况下,校准器应在独立于最初用于拟合分类器的训练数据集上进行拟合。这是因为分类器在其训练数据上的表现会比新数据更好。使用训练数据的分类器输出来拟合校准器会导致有偏差的校准器,该校准器映射到的概率比应有的更接近0和1。 使用方法 -------- :class:`CalibratedClassifierCV` 类用于校准分类器。 :class:`CalibratedClassifierCV` 使用交叉验证方法来确保始终使用无偏数据来拟合校准器。数据被分成k对 `(train_set, test_set)` (由 `cv` 决定)。当 `ensemble=True` (默认)时,以下过程对每个交叉验证分割独立重复:首先在 `train_set` 上训练 `base_estimator` 的克隆, 训练子集。然后,它在测试子集上的预测结果被用来拟合一个校准器(可以是sigmoid或等渗回归器)。这产生了一个由k个 `(分类器, 校准器)` 对组成的集合,其中每个校准器将其对应分类器的输出映射到[0, 1]区间。每个对在 `calibrated_classifiers_` 属性中暴露出来,其中每个条目都是一个经过校准的分类器,具有输出校准概率的:term:`predict_proba` 方法。:class:`CalibratedClassifierCV` 实例的:term:`predict_proba` 输出对应于 `calibrated_classifiers_` 列表中k个估计器的预测概率的平均值。:term:`predict` 的输出是具有最高概率的类别。 当 `ensemble=False` 时,通过:func:`~sklearn.model_selection.cross_val_predict` 使用交叉验证来获取所有数据的无偏预测。这些无偏预测随后被用来训练校准器。 `calibrated_classifiers_` 属性仅包含一个 `(分类器, 校准器)` 对,其中分类器是基于所有数据训练的 `base_estimator` 。在这种情况下,:class:`CalibratedClassifierCV` 的:term:`predict_proba` 输出是从单个 `(分类器, 校准器)` 对获得的预测概率。 `ensemble=True` 的主要优势在于可以受益于传统的集成效应(类似于:ref:`bagging` )。由此产生的集成应该既校准良好,又比 `ensemble=False` 稍微更准确。使用 `ensemble=False` 的主要优势是计算上的:它通过仅训练一个基础分类器和校准器对来减少总体拟合时间,减小最终模型的大小并提高预测速度。 或者,一个已经拟合的分类器可以通过设置 `cv="prefit"` 来进行校准。在这种情况下,数据不会被分割,所有数据都被用来拟合回归器。这取决于用户来确保 确保用于拟合分类器的数据与用于拟合回归器的数据不相交。 :class:`CalibratedClassifierCV` 支持通过 `method` 参数使用两种回归技术进行校准: `"sigmoid"` 和 `"isotonic"` 。 .. _sigmoid_regressor: Sigmoid ^^^^^^^ Sigmoid 回归器, `method="sigmoid"` 基于 Platt 的逻辑模型 [4]_: .. math:: p(y_i = 1 | f_i) = \frac{1}{1 + \exp(A f_i + B)} \,, 其中 :math:`y_i` 是样本 :math:`i` 的真实标签,:math:`f_i` 是未校准分类器对样本 :math:`i` 的输出。:math:`A` 和 :math:`B` 是实数,通过最大似然拟合回归器时确定。 Sigmoid 方法假设可以通过对原始预测应用 Sigmoid 函数来校正 :ref:`校准曲线 ` 。这一假设在 Platt 1999 [4]_ 的第 2.1 节中,对于具有常见核函数的 :ref:`SVM` 在各种基准数据集上得到了经验验证,但并不一定普遍适用。此外,逻辑模型在标定误差对称的情况下效果最佳,即每个二分类的分类器输出呈正态分布且具有相同方差 [7]_。对于高度不平衡的分类问题,这可能是一个问题,因为输出不具有相等的方差。 一般来说,这种方法在小样本量或未校准模型不够自信且高低输出具有相似校准误差时最为有效。 Isotonic ^^^^^^^^ `method="isotonic"` 拟合一个非参数的等渗回归器,输出一个阶梯式非递减函数,参见 :mod:`sklearn.isotonic` 。它最小化: .. math:: \sum_{i=1}^{n} (y_i - \hat{f}_i)^2 满足 :math:`\hat{f}_i \geq \hat{f}_j` 当且仅当 :math:`f_i \geq f_j` 。:math:`y_i` 是样本 :math:`i` 的真实标签,:math:`\hat{f}_i` 是回归器的输出。 样本 :math:`i` 的校准分类器(即校准后的概率)。 与 'sigmoid' 方法相比,这种方法更为通用,唯一的限制是映射函数是单调递增的。 因此,它更强大,因为它可以纠正未校准模型的任何单调扭曲。 然而,它更容易过拟合,尤其是在小数据集上 [6]_。 总的来说,当有足够的数据(大于 ~ 1000 个样本)避免过拟合时,'isotonic' 的表现将与 'sigmoid' 相当或更好 [3]_。 .. note:: 对 AUC 等排序指标的影响 通常预期校准不会影响 ROC-AUC 等排序指标。然而,在使用 `method="isotonic"` 进行校准后,这些指标可能会有所不同,因为等渗回归在预测概率中引入了平局。 这可以看作是模型预测的不确定性范围内的。 如果严格希望保持排序和 AUC 分数,请使用 `method="sigmoid"` ,这是一个严格单调的变换,因此保持了排序。 多类支持 ^^^^^^^^ 等渗回归和 sigmoid 回归器都只支持一维数据(例如,二分类输出),但如果 `base_estimator` 支持多类预测,则可以扩展到多类分类。 对于多类预测,:class:`CalibratedClassifierCV` 以 :ref:`ovr_classification` 方式分别对每个类别进行校准 [5]_。 在预测概率时,每个类别的校准概率分别进行预测。由于这些概率不一定总和为1,因此进行后处理以对其进行归一化。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_calibration_plot_calibration_curve.py` * :ref:`sphx_glr_auto_examples_calibration_plot_calibration_multiclass.py` * :ref:`sphx_glr_auto_examples_calibration_plot_calibration.py` * :ref:`sphx_glr_auto_examples_calibration_plot_compare_calibration.py` .. rubric:: 参考文献 .. [1] Allan H. Murphy (1973). :doi:`"A New Vector Partition of the Probability Score" <10.1175/1520-0450(1973)012%3C0595:ANVPOT%3E2.0.CO;2>` Journal of Applied Meteorology and Climatology .. [2] `On the combination of forecast probabilities for consecutive precipitation periods. `_ Wea. Forecasting, 5, 640–650., Wilks, D. S., 1990a .. [3] `Predicting Good Probabilities with Supervised Learning `_ , A. Niculescu-Mizil & R. Caruana, ICML 2005 .. [4] `Probabilistic Outputs for Support Vector Machines and Comparisons to Regularized Likelihood Methods. `_ J. Platt, (1999) .. [5] `Transforming Classifier Scores into Accurate Multiclass Probability Estimates. `_ B. Zadrozny & C. Elkan, (KDD 2002) .. [6] `Predicting accurate probabilities with a ranking loss. `_ Menon AK, Jiang XJ, Vembu S, Elkan C, Ohno-Machado L. Proc Int Conf Mach Learn. 2012;2012:703-710 .. [7] `Beyond sigmoids: How to obtain well-calibrated probabilities from binary classifiers with beta calibration `_ Kull, M., Silva Filho, T. M., & Flach, P. (2017). .. [8] Mario V. Wüthrich, Michael Merz (2023). :doi:`"Statistical Foundations of Actuarial Learning and its Applications" <10.1007/978-3-031-12409-9>` Springer Actuarial