1.16. 概率校准#
在执行分类时,您通常不仅想要预测类别标签,还想获得相应标签的概率。此概率为您提供了对预测的某种置信度。一些模型可能无法为您提供对类别概率的良好估计,甚至有些模型不支持概率预测(例如,SGDClassifier
的某些实例)。校准模块允许您更好地校准给定模型的概率,或添加对概率预测的支持。
经过良好校准的分类器是概率分类器,其 predict_proba 方法的输出可以直接解释为置信度级别。例如,经过良好校准的(二元)分类器应该对样本进行分类,以便在它给出接近于 0.8 的 predict_proba 值的样本中,大约 80% 实际上属于正类。
在我们展示如何重新校准分类器之前,我们首先需要一种方法来检测分类器校准得有多好。
注意
用于概率预测的严格适当评分规则,例如 sklearn.metrics.brier_score_loss
和 sklearn.metrics.log_loss
,同时评估模型的校准(可靠性)和判别能力(分辨率),以及数据的随机性(不确定性)。这来自 Murphy [1] 的著名 Brier 分数分解。由于尚不清楚哪个项占主导地位,因此该分数在单独评估校准方面用途有限(除非计算分解的每一项)。例如,较低的 Brier 损失并不一定意味着校准更好的模型,它也可能意味着校准更差的模型具有更高的判别能力,例如使用更多特征。
1.16.1. 校准曲线#
校准曲线,也称为可靠性图(Wilks 1995 [2]),比较二元分类器的概率预测校准得有多好。它在 y 轴上绘制正标签的频率(更准确地说,是条件事件概率 \(P(Y=1|\text{predict_proba})\) 的估计值),在 x 轴上绘制模型的预测概率 predict_proba。棘手的部分是获得 y 轴的值。在 scikit-learn 中,这是通过对预测进行分箱来完成的,这样 x 轴就代表每个箱中的平均预测概率。然后,y 轴是给定该箱的预测的正样本比例,即样本中类别为正类的比例(在每个箱中)。
顶部的校准曲线图是使用 CalibrationDisplay.from_estimator
创建的,它使用 calibration_curve
来计算每个箱的平均预测概率和正样本比例。 CalibrationDisplay.from_estimator
将拟合的分类器作为输入,用于计算预测概率。因此,分类器必须具有 predict_proba 方法。对于少数没有 predict_proba 方法的分类器,可以使用 CalibratedClassifierCV
来校准分类器输出为概率。
底部的直方图通过显示每个预测概率箱中的样本数量,对每个分类器的行为提供了一些见解。
LogisticRegression
更可能直接返回经过良好校准的预测,因为它对损失函数有规范的链接函数,即 对数损失 的 logit 链接。在无惩罚的情况下,这会导致所谓的 **平衡属性**,参见 [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],因此由方差引起的误差在接近零和一的地方往往是单边的。例如,如果模型应该预测 p = 0 对应于一个案例,那么 bagging 唯一能够实现这一点的方法是所有袋装树都预测为零。如果我们在袋装树上添加噪声,那么这种噪声会导致一些树对这个案例预测比 0 更大的值,从而使袋装集合的平均预测远离 0。我们观察到这种效应在随机森林中最为强烈,因为用随机森林训练的基层树由于特征子集而具有相对较高的方差。”因此,校准曲线显示出特征的 S 形,表明分类器可以更多地信任其“直觉”并返回更接近 0 或 1 的概率。
LinearSVC
(SVC)显示出比随机森林更 S 形的曲线,这对于最大边距方法来说是典型的(比较 Niculescu-Mizil 和 Caruana [3]),这些方法侧重于难以分类的样本,这些样本靠近决策边界(支持向量)。
1.16.2. 校准分类器#
校准分类器包括拟合一个回归器(称为校准器),该回归器将分类器的输出(如 决策函数 或 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
的克隆。然后,它对测试子集的预测用于拟合校准器(要么是 sigmoid 回归器,要么是等距回归器)。这将导致 k 个 (classifier, calibrator)
对的集合,其中每个校准器将对应分类器的输出映射到 [0, 1]。每个对都在 calibrated_classifiers_
属性中公开,其中每个条目都是一个经过校准的分类器,具有一个 predict_proba 方法,该方法输出经过校准的概率。主 CalibratedClassifierCV
实例的 predict_proba 输出对应于 k
个估计器在 calibrated_classifiers_
列表中的预测概率的平均值。 predict 的输出是具有最高概率的类别。
当 ensemble=False
时,交叉验证用于通过 cross_val_predict
为所有数据获得“无偏”预测。然后使用这些无偏预测来训练校准器。属性 calibrated_classifiers_
仅包含一个 (classifier, calibrator)
对,其中分类器是在所有数据上训练的 base_estimator
。在这种情况下, CalibratedClassifierCV
的 predict_proba 输出是从单个 (classifier, calibrator)
对获得的预测概率。
ensemble=True
的主要优势是受益于传统的集成效应(类似于 Bagging 元估计器)。由此产生的集成应该既经过良好校准,又比使用 ensemble=False
时略微准确。使用 ensemble=False
的主要优势是计算上的:它通过仅训练单个基本分类器和校准器对来减少整体拟合时间,减小最终模型大小并提高预测速度。
或者,可以通过设置 cv="prefit"
来校准已经拟合的分类器。在这种情况下,数据不会被拆分,所有数据都用于拟合回归器。用户需要确保用于拟合分类器的数据与用于拟合回归器的数据是不相交的。
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 年第 2.1 节 [4] 中针对各种基准数据集上的具有常见核函数的 支持向量机 进行了经验验证,但并不一定普遍适用。此外,如果校准误差是对称的,则逻辑模型的效果最佳,这意味着每个二元类的分类器输出都服从具有相同方差的正态分布 [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. 多类支持#
等距回归器和 sigmoid 回归器都只支持一维数据(例如,二元分类输出),但如果 base_estimator
支持多类预测,则可以扩展到多类分类。对于多类预测,CalibratedClassifierCV
以 OneVsRestClassifier 方式对每个类别进行单独校准 [5]。在预测概率时,会分别预测每个类别的校准概率。由于这些概率不一定加起来为 1,因此会执行后处理以对其进行归一化。
示例
参考文献