1.16. 概率校准#
在执行分类时,您通常不仅希望预测类别标签,还希望获得相应标签的概率。此概率为您提供了预测的某种置信度。有些模型可能给出较差的类别概率估计,有些甚至不支持概率预测(例如,SGDClassifier
的某些实例)。校准模块允许您更好地校准给定模型的概率,或添加对概率预测的支持。
校准良好的分类器是概率分类器,其 predict_proba 方法的输出可以直接解释为置信水平。例如,一个校准良好的(二元)分类器应该对样本进行分类,使得在其 predict_proba 值接近(比如说)0.8 的样本中,大约有80%的样本实际上属于正类别。
在展示如何重新校准分类器之前,我们首先需要一种方法来检测分类器的校准效果如何。
注意
用于概率预测的严格适当评分规则,如 sklearn.metrics.brier_score_loss
和 sklearn.metrics.log_loss
,同时评估模型的校准(可靠性)和判别能力(分辨率),以及数据的随机性(不确定性)。这源于Murphy [1] 著名的 Brier 分数分解。由于不清楚哪个项占主导地位,该分数对于单独评估校准的用途有限(除非计算分解的每个项)。例如,较低的 Brier 损失不一定意味着更好的校准模型,也可能意味着校准更差但判别能力更强的模型,例如使用了更多特征的模型。
1.16.1. 校准曲线#
校准曲线,也称为可靠性图(Wilks 1995 [2]),比较二元分类器的概率预测校准得如何。它将正标签的频率(更准确地说,条件事件概率 \(P(Y=1|\text{predict_proba})\) 的估计值)绘制在y轴上,将模型预测的概率 predict_proba 绘制在x轴上。棘手的部分是获取y轴的值。在 scikit-learn 中,这是通过对预测进行分箱来实现的,使得x轴表示每个箱的平均预测概率。y轴则是给定该箱预测值的正例分数,即属于正类的样本比例(在每个箱中)。
上方的校准曲线图是使用 CalibrationDisplay.from_estimator
创建的,该函数使用 calibration_curve
计算每个箱的平均预测概率和正例分数。CalibrationDisplay.from_estimator
接受一个已拟合的分类器作为输入,该分类器用于计算预测概率。因此,分类器必须具有 predict_proba 方法。对于少数没有 predict_proba 方法的分类器,可以使用 CalibratedClassifierCV
来校准分类器输出到概率。
下方的直方图通过显示每个预测概率箱中的样本数量,对每个分类器的行为提供了一些见解。

LogisticRegression
本身更可能返回校准良好的预测,因为它对其损失函数具有规范的链接函数,即 对数损失 的 logit-link。在无惩罚的情况下,这导致了所谓的 平衡特性,参见 [8] 和 逻辑回归。在上图中,数据是根据线性机制生成的,这与 LogisticRegression
模型(模型“指定良好”)一致,并且正则化参数 C
的值被调整到适当(既不太强也不太弱)。因此,该模型从其 predict_proba
方法返回准确的预测。与此相反,所示的其他模型返回有偏差的概率;每个模型的偏差不同。
GaussianNB
(朴素贝叶斯)倾向于将概率推向0或1(注意直方图中的计数)。这主要是因为它假设给定类别时特征是条件独立的,而在此数据集中,由于包含2个冗余特征,情况并非如此。
RandomForestClassifier
表现出相反的行为:直方图在概率约为0.2和0.9处显示峰值,而接近0或1的概率非常罕见。Niculescu-Mizil和Caruana [3] 对此给出了解释:“像 bagging 和随机森林这样对一组基础模型预测进行平均的方法,在做出接近0和1的预测时可能会遇到困难,因为底层基础模型的方差会使应该接近0或1的预测偏离这些值。由于预测被限制在[0,1]区间内,方差引起的误差在接近0和1时往往是单侧的。例如,如果模型应该对某个案例预测 \(p = 0\),那么 bagging 只有在所有 bagging 的树都预测零时才能实现。如果我们对 bagging 平均的树添加噪声,这种噪声会导致一些树对该案例预测大于0的值,从而使 bagging 集成的平均预测偏离0。我们在随机森林中观察到这种效应最强烈,因为随机森林训练的基础树由于特征子集化而具有相对较高的方差。”因此,校准曲线呈现出特征性的S形,表明分类器通常可以更相信其“直觉”并返回更接近0或1的概率。
LinearSVC
(SVC)显示出比随机森林更S形的曲线,这对于最大间隔方法来说是典型的(比较 Niculescu-Mizil 和 Caruana [3]),它们专注于靠近决策边界的难以分类的样本(支持向量)。
1.16.2. 校准分类器#
校准分类器包括拟合一个回归器(称为校准器),它将分类器的输出(由 decision_function 或 predict_proba 给出)映射到 [0, 1] 区间内的校准概率。用 \(f_i\) 表示给定样本的分类器输出,校准器尝试预测条件事件概率 \(P(y_i = 1 | f_i)\)。
理想情况下,校准器应该在独立于用于拟合分类器的训练数据的数据集上进行拟合。这是因为分类器在其训练数据上的性能会优于新数据。因此,使用训练数据的分类器输出来拟合校准器将导致有偏差的校准器,其映射到的概率会比实际应有的更接近0和1。
1.16.3. 用法#
CalibratedClassifierCV
类用于校准分类器。
CalibratedClassifierCV
使用交叉验证方法来确保始终使用无偏数据来拟合校准器。数据被分成 \(k\) 个 (train_set, test_set)
对(由 cv
确定)。当 ensemble=True
(默认)时,以下过程独立地重复进行每次交叉验证分割:
base_estimator
的一个克隆在训练子集上进行训练。训练好的
base_estimator
在测试子集上进行预测。这些预测用于拟合一个校准器(sigmoid 或保序回归器)(当数据是多类别时,为每个类别拟合一个校准器)。
这会产生一个 \(k\) 个 (分类器, 校准器)
对的集成,其中每个校准器将其对应分类器的输出映射到 [0, 1] 区间。每个对都暴露在 calibrated_classifiers_
属性中,其中每个条目都是一个带有 predict_proba 方法的校准分类器,该方法输出校准后的概率。predict_proba 对于主 CalibratedClassifierCV
实例的输出对应于 calibrated_classifiers_
列表中 \(k\) 个估计器的预测概率的平均值。predict 的输出是概率最高的类别。
在使用 ensemble=True
时,仔细选择 cv
至关重要。对于每个分割,所有类别都应同时存在于训练子集和测试子集中。当训练子集中缺少某个类别时,该类别在该分割的 (分类器, 校准器)
对的预测概率将默认为0。这会使 predict_proba 产生偏差,因为它对所有对进行了平均。当测试子集中缺少某个类别时,该类别(在该分割的 (分类器, 校准器)
对中)的校准器将拟合在没有正类的数据上。这会导致校准无效。
当 ensemble=False
时,交叉验证用于通过 cross_val_predict
获取所有数据的“无偏”预测。然后这些无偏预测用于训练校准器。calibrated_classifiers_
属性仅包含一个 (分类器, 校准器)
对,其中分类器是训练在所有数据上的 base_estimator
。在这种情况下,CalibratedClassifierCV
的 predict_proba 输出是从单个 (分类器, 校准器)
对获得的预测概率。
ensemble=True
的主要优点是受益于传统的集成效应(类似于 Bagging 元估计器)。由此产生的集成模型应既校准良好又比 ensemble=False
稍准确。使用 ensemble=False
的主要优点是计算方面:它通过只训练一个基础分类器和校准器对来减少总拟合时间,减小最终模型大小并提高预测速度。
或者,可以使用 FrozenEstimator
作为 CalibratedClassifierCV(estimator=FrozenEstimator(estimator))
来校准一个已经拟合的分类器。用户需确保用于拟合分类器的数据与用于拟合回归器的数据不重叠。
CalibratedClassifierCV
支持通过 method
参数使用两种回归技术进行校准:"sigmoid"
和 "isotonic"
。
1.16.3.1. Sigmoid#
Sigmoid 回归器,即 method="sigmoid"
,基于 Platt 的逻辑模型 [4]
其中 \(y_i\) 是样本 \(i\) 的真实标签,\(f_i\) 是未经校准分类器对样本 \(i\) 的输出。\(A\) 和 \(B\) 是通过最大似然法拟合回归器时确定的实数。
Sigmoid 方法假设 校准曲线 可以通过对原始预测应用 sigmoid 函数来校正。这一假设在 Platt 1999 [4] 的第2.1节中,通过在各种基准数据集上使用常见核函数的 支持向量机 案例得到了经验证实,但并不一定普遍成立。此外,当校准误差对称时,即每个二元类别的分类器输出呈正态分布且方差相同 [7] 时,逻辑模型效果最佳。这对于高度不平衡的分类问题可能是一个问题,因为输出没有相等的方差。
总的来说,这种方法对于小样本量,或者当未校准模型过于保守且高输出和低输出的校准误差相似时,最为有效。
1.16.3.2. 保序#
method="isotonic"
拟合一个非参数保序回归器,它输出一个阶梯式的非递减函数,参见 sklearn.isotonic
。它最小化:
受限于 \(\hat{f}_i \geq \hat{f}_j\),只要 \(f_i \geq f_j\)。其中 \(y_i\) 是样本 \(i\) 的真实标签,\(\hat{f}_i\) 是校准分类器对样本 \(i\) 的输出(即,校准后的概率)。与 'sigmoid'
相比,此方法更通用,因为唯一的限制是映射函数单调递增。因此,它更强大,可以纠正未校准模型的任何单调失真。但是,它更容易过拟合,特别是在小数据集上 [6]。
总体而言,当有足够数据(大于约1000个样本)以避免过拟合时,'isotonic'
的表现将与 'sigmoid'
相当或更好 [3]。
注意
对 AUC 等排名指标的影响
通常预期校准不会影响 ROC-AUC 等排名指标。然而,当使用 method="isotonic"
时,这些指标在校准后可能会有所不同,因为保序回归会在预测概率中引入并列值。这可以被视为模型预测不确定性的一部分。如果您严格希望保留排名,从而保留 AUC 分数,请使用 method="sigmoid"
,它是一个严格单调的变换,因此可以保留排名。
1.16.3.3. 多类别支持#
保序回归器和S形回归器都只支持一维数据(例如,二元分类输出),但如果 base_estimator
支持多类别预测,则它们会扩展到多类别分类。对于多类别预测,CalibratedClassifierCV
会以 OneVsRestClassifier 的方式独立校准每个类别 [5]。在预测概率时,会独立预测每个类别的校准概率。由于这些概率不一定总和为一,因此会执行后处理以对其进行归一化。
示例
参考文献