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]),比较二元分类器的概率预测的校准程度。它绘制了正标签的频率(更准确地说,是条件事件概率\(P(Y=1|\text{predict_proba})\) 的估计)在 y 轴上,相对于模型的预测概率predict_proba 在 x 轴上。棘手的部分是获得 y 轴的值。在 scikit-learn 中,这是通过对预测进行分箱来实现的,这样 x 轴就代表每个分箱中的平均预测概率。然后,y 轴是在给定该分箱的预测的情况下正样本的比例,即类别为正类(在每个分箱中)的样本的比例。
顶部的校准曲线图是使用CalibrationDisplay.from_estimator
创建的,它使用calibration_curve
计算每个bin的平均预测概率和阳性比例。CalibrationDisplay.from_estimator
以拟合后的分类器作为输入,用于计算预测概率。因此,分类器必须具有predict_proba方法。对于少数没有predict_proba方法的分类器,可以使用CalibratedClassifierCV
将分类器输出校准为概率。
底部的直方图通过显示每个预测概率bin中的样本数量,提供了一些关于每个分类器行为的见解。
LogisticRegression
更有可能自行返回良好校准的预测,因为它具有其损失的规范链接函数,即Log loss的对数链接函数。在非惩罚情况下,这会导致所谓的平衡属性,参见[8]和Logistic regression。在上图中,数据是根据线性机制生成的,这与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唯一能做到这一点的方法是所有bagged树都预测零。如果我们向bagging正在平均的树添加噪声,则此噪声将导致一些树为该案例预测大于0的值,从而使bagged集成体的平均预测远离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
对测试子集进行预测使用预测来拟合校准器(S形或等距回归器)(当数据是多类时,为每个类别拟合一个校准器)
这将产生一个包含 k 个`(classifier, calibrator)
对的集合,其中每个校准器将其对应分类器的输出映射到[0, 1]区间。每个对都在`calibrated_classifiers_
属性中公开,其中每个条目都是一个经过校准的分类器,具有一个predict_proba方法,该方法输出校准后的概率。主CalibratedClassifierCV
实例的predict_proba输出对应于`calibrated_classifiers_
列表中k
个估计器的预测概率的平均值。predict的输出是概率最高的类别。
当使用`ensemble=True
时,仔细选择`cv
非常重要。对于每次拆分,所有类别都应该存在于训练集和测试子集中。当一个类别不存在于训练子集中时,该类别的预测概率将默认为该拆分的`(classifier, calibrator)
对的0。由于它是对所有对进行平均,这会歪曲predict_proba。当一个类别不存在于测试子集中时,该类别的校准器(在该拆分的`(classifier, calibrator)
对中)将使用没有正类的数据进行拟合。这会导致无效的校准。
当`ensemble=False
时,交叉验证用于通过cross_val_predict
获得所有数据的“无偏”预测。然后使用这些无偏预测来训练校准器。calibrated_classifiers_
属性仅包含一个`(classifier, calibrator)
对,其中分类器是在所有数据上训练的`base_estimator
。在这种情况下,CalibratedClassifierCV
的predict_proba输出是从单个`(classifier, calibrator)
对获得的预测概率。
使用`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
。它最小化
受限于当 \(f_i \geq f_j\) 时,\(\hat{f}_i \geq \hat{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,因此会执行后处理以对其进行归一化。
示例
参考文献