如何校准不平衡分类的概率
许多机器学习模型能够预测一个概率或概率类成员的分数。
可能性为评估和比较模型提供了所需的粒度水平,特别是在诸如工具 弧度曲线 用于解释预测,并使用ROC等标准来比较模型性能,两者都使用概率。
不幸的是,许多模型预测的概率或概率都没有校准。这意味着他们在某些情况下可能过于自信,而在其他情况下则缺乏信心。更糟糕的是,分类任务中存在的严重倾斜的分类分布,可能会导致预测概率的更大偏差,因为它们过度预测了大多数分类。
因此,在评估非线性机器学习模型的性能之前,对其预测概率进行校准通常是一个好主意。此外,当使用不平衡的数据集时,一般性地校准概率是一个很好的做法,甚至是像逻辑回归这样的模型,当类标签是平衡的时,它预测了校准良好的概率。
在本教程中,您将发现如何校准不平衡分类的预测概率。
完成本教程后,你会知道:
本教程分为五个部分:
许多机器学习算法可以预测一个概率或一个概率类似的分数,以指示类成员。
例如,逻辑回归可以直接预测类成员的可能性,支持向量机可以预测一个不是概率,但可以解释为概率的分数。
在需要概率预测的问题上,概率可以作为不确定性的度量。在分类不平衡的情况下尤其如此,在评估和选择模型方面,清晰的类别标签往往是不够的。预测概率为更细的模型的评价和选择提供了基础,例如通过使用 中华人民共和国和先进经济衰退诊断图 ,测量方法,如ROC等,和技术,如阈值移动。
因此,在处理不平衡的分类任务时,通常倾向于使用预测概率的机器学习模型。问题是很少有机器学习模型能够校准概率。
修正的概率意味着概率反映真实事件的可能性。
如果您在分类中考虑到这一点,可能会感到困惑,因为我们的类标签是正确的还是不正确的,而不是概率。为了澄清,回顾在二进制分类中,我们预测的是一个负或正的情况,如0或1类。如果预测100个例子的概率为0.8%,那么80%的例子将是第1类,20%的例子将是0类,如果这些概率被校准的话。在这里, 校准 预测概率与阳性病例发生的一致性。
不确定的概率表明,概率得分存在偏差,这意味着概率在某些情况下过于自信或缺乏信心。
校准概率
.概率与事件的真实可能性相符。
未校准概率
.可能性过于自信和/或缺乏自信。
这对于没有使用概率框架进行训练的机器学习模型和像不平衡分类任务那样具有不平衡分布的训练数据来说是很常见的。
未校准概率有两个主要原因:
很少有机器学习算法产生校准概率。这是因为要预测校准概率的模型,必须在概率框架下进行明确的训练,例如最大概率估计。提供校准概率的一些算法实例包括:
许多算法要么预测一个概率–比如说得分,要么是类标记,必须强制才能产生一个概率–比如得分。因此,这些算法通常要求他们" 概率 在使用前进行校准。实例包括:
训练数据集的偏倚,如类分布的偏斜,意味着模型自然而然地预测多数类的概率高于平均少数类。
问题是,模型可能会过度补偿和过多地关注大多数类。这甚至适用于典型的校准概率,如逻辑回归。
……在不平衡的情况下,通过监督学习获得的班级概率估计,系统地低估了少数班级实例的概率,尽管表面上总体校准良好。
概率是通过重新校准它们的值来校准的,这样它们就能更好地匹配训练数据中观察到的分布。
我们希望估计的类概率能反映样本的真实潜在概率。也就是说,预测的类概率(或概率相似的值)需要精确校准。如果要很好地校准,概率必须有效地反映出兴趣事件的真实可能性。
— Page 249, 应用预测建模 , 2013.
对训练数据进行概率预测,将概率分布与预期概率进行比较,并进行调整以提供更好的匹配。这通常涉及到分离一个训练数据集,并使用一个部分来训练模型和另一个部分作为验证集来衡量概率。
预测概率有两种主要技术: 板缩放 和 等张回归 .
板缩放
.逻辑回归模型转换概率。
等张回归
.加权最小二乘回归模型来变换概率。
平台缩放是一种简单的方法,它是为了将输出从支持向量机缩放到概率值而开发的。它涉及到学习一个逻辑回归模型,以执行将分数转换为校准概率。等张回归是一种较为复杂的加权最小二乘回归模型。它需要更多的培训数据,尽管它也更强大和更普遍。这里,等渗简单地指的是单调地增加对重新计算的值的原始概率的映射。
当预测概率中的变形为西格模形状时,平台缩放最有效。等张回归是一种更强大的校准方法,可以纠正任何单调变形。
— 预测良好概率与监督学习 , 2005.
科学学习图书馆提供了对普拉特标度和等渗回归方法的访问,通过 分类类 .
这是一个模型的包装器(如SVM)。首选的缩放技术是通过" 方法 ""论点,可以是 似星的 ‘(普拉特缩放)或’ 等渗的 ‘ (isotonic regression).
交叉验证用于从模型中衡量预测的概率,通过" cv ""论点。这意味着该模型适合于训练集,并根据测试集进行校准,而这一过程是对K折叠的重复K时间,在这一过程中预测的概率在运行过程中是平均的。
设置" cv "论据取决于可用数据的数量,尽管可以使用3或5这样的数值。重要的是,这种划分是分层的,这在对不平衡数据集使用概率校准时是很重要的,因为通常只有很少的正类例子。
# example of wrapping a model with probability calibration
model = …
calibrated = CalibratedClassifierCV(model, method=‘sigmoid’, cv=3)
现在我们知道了如何校准概率,让我们看看在不平衡分类数据集上校准模型概率的一些例子。
在本节中,我们将回顾如何在不平衡的分类数据集上校准支持向量机模型的概率。
首先,让我们使用 ()职能 .我们将生成10000个例子,其中99%属于负案例(0类),1%属于正案例(1类)。
…
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
接下来,我们可以定义一个具有默认超参数的SVM。这意味着模型没有调整到数据集,但将提供一致的比较基础。
然后我们可以使用重复分层的方法在数据集上评估这个模型 交叉验证 三个10倍的重复。
我们将使用RECOOC对模型进行评估,并计算所有重复和折叠的平均得分。中华民国联邦委员会将利用支持向量机提供的未经校准的概率类似得分。
…
# define model
model = SVC(gamma=‘scale’)
然后我们可以使用重复分层的方法在数据集上评估这个模型 交叉验证 三个10倍的重复。
我们将使用RECOOC对模型进行评估,并计算所有重复和折叠的平均得分。中华民国联邦委员会将利用支持向量机提供的未经校准的概率类似得分。
…
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(model, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
将此链接在一起,完整的示例列于下文。
# evaluate svm with uncalibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.svm import SVC
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = SVC(gamma=‘scale’)
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(model, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,在不平衡的分类数据集上使用未校准概率来评估支持向量机。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到,支持向量机实现了约0.804的ROC系统。
Mean ROC AUC: 0.804
接下来,我们可以用 CalibratedClassifierCV 类包SVM模型并预测校准概率。
我们使用分层的10倍交叉验证来评价模型;这意味着9,000个例子用于训练,1,000个例子用于每一个折叠的测试。
与…有关 CalibratedClassifierCV 其中,9,000个折叠的例子将分为6,000个用于训练模型,3,000个用于校准概率。这并没有留下许多少数群体的例子,例如。90/10分10倍交叉验证,然后60/30进行校准。
使用校准时,重要的是根据您选择的模型评估方案处理这些数字,或者调整折叠数以确保数据集足够大,或者甚至转换到更简单的列/测试细分,而不是在必要时进行交叉验证。可能需要试验。
我们将一如既往地定义SVM模型,然后定义 CalibratedClassifierCV 然后采用等张回归方法,通过重复分层K型交叉验证来评价校准模型。
…
# define model
model = SVC(gamma=‘scale’)
# wrap the model
calibrated = CalibratedClassifierCV(model, method=‘isotonic’, cv=3)
由于支持向量机的概率并没有在默认情况下进行校准,我们预计,校准这些概率将导致对基于概率明确评估模型的ROCauc的改进。
将其联系起来,下面是用校准概率评价支持向量机的完整例子。
# evaluate svm with calibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = SVC(gamma=‘scale’)
# wrap the model
calibrated = CalibratedClassifierCV(model, method=‘isotonic’, cv=3)
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(calibrated, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,在不平衡的分类数据集上使用校准概率来评估支持向量机。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到支持向量机实现了从0.804至0.975的提升。
Mean ROC AUC: 0.875
可能性校准可以与对算法或数据集的其他修改一起评估,以解决倾斜类分布。
例如,支持向量机提供" 班级_体重 “可以设定为” 平衡的 "调整利润率,以利于少数人阶级。我们可以把这个变化包括到SVM中,并校准概率,我们可能会看到模型技能的进一步提升,例如:
…
# define model
model = SVC(gamma=‘scale’, class_weight=‘balanced’)
将此联系起来,下面列出了具有校准概率的类加权支持向量机的完整示例。
# evaluate weighted svm with calibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = SVC(gamma=‘scale’, class_weight=‘balanced’)
# wrap the model
calibrated = CalibratedClassifierCV(model, method=‘isotonic’, cv=3)
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(calibrated, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,使用不平衡分类数据集上的校准概率来评估类别加权SVM。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到支持向量机实现了进一步的提升,从大约0.975从大约0.966。
Mean ROC AUC: 0.966
决策树 是另一种不自然产生概率的高效机器学习。
取而代之的是,直接预测类标签,并且可以根据为新示例预测的树叶中的训练数据集中的例子分布情况来估计概率类似的分数。因此,决策树上的概率得分应该在被评估和用于选择模型之前进行校准。
我们可以使用 决策者学习班 .
该模型可以用我们的综合不平衡分类数据集上的未校准概率来评价。
完整的例子列于下文。
# evaluate decision tree with uncalibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.tree import DecisionTreeClassifier
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = DecisionTreeClassifier()
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(model, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,在不平衡的分类数据集上使用未校准概率来评估决策树。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到,决策树达到了约0.842的ROC等元。
Mean ROC AUC: 0.842
然后,我们可以使用校准包装器来评估相同的模型。
在这种情况下,我们将使用通过设置" 方法 “论点” 似星的 “.
…
# wrap the model
calibrated = CalibratedClassifierCV(model, method=‘sigmoid’, cv=3)
下面是一个完整的例子,用来评价带有不平衡分类的校准概率的决策树。
# decision tree with calibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.calibration import CalibratedClassifierCV
from sklearn.tree import DecisionTreeClassifier
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = DecisionTreeClassifier()
# wrap the model
calibrated = CalibratedClassifierCV(model, method=‘sigmoid’, cv=3)
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(calibrated, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,在不平衡的分类数据集上使用校准概率来评估决策树。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到,决策树实现了从约0.842提升到约0.859。
Mean ROC AUC: 0.859
可能性校准对方法和方法都很敏感。
因此,最好在模型上测试一组不同的概率校准方法,以发现哪些方法对数据集最有效。一种方法是将校准方法和交叉验证褶皱作为超参数来处理并调整它们。在本节中,我们将研究使用网格搜索来调整这些超参数。
K最近的邻居,或KNN,算法是另一种非线性机器学习算法,它直接预测一个类标签,并且必须修改以产生一个概率类似的得分。这通常涉及到在附近使用阶级标签的分布。
我们可以使用 邻邦分类者等级 默认的邻居面积为5.
完整的例子列于下文。
# evaluate knn with uncalibrated probabilities for imbalanced classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = KNeighborsClassifier()
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate model
scores = cross_val_score(model, X, y, scoring=‘roc_auc’, cv=cv, n_jobs=-1)
# summarize performance
print(‘Mean ROC AUC: %.3f’ % mean(scores))
运行该示例时,在不平衡的分类数据集上,用未校准概率来评估nn。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到,全国运动队取得了约0.864的中华民国自卫队。
Mean ROC AUC: 0.864
知道概率取决于邻居的大小和未校准,我们希望一些校准将会提高使用RECauc模型的性能。
而不是抽查一个配置 CalibratedClassifierCV 同学们,我们会用 格里德罗切夫 对不同的配置进行网格搜索。
首先,模型和校准包装被定义为之前。
…
# define model
model = KNeighborsClassifier()
# wrap the model
calibrated = CalibratedClassifierCV(model)
我们将测试两者" 似星的 ” and “ 等渗的 “方法"的价值,以及不同的” cv “数值[2,3,4]。回顾” cv 控制用于估计校准概率的训练数据集的分离。
我们可以将参数网格定义为带有参数名称的指定参数。 CalibratedClassifierCV 我们希望调整并提供要尝试的值列表。这将测试3*2或6个不同的组合。
…
# define grid
param_grid = dict(cv=[2,3,4], method=[‘sigmoid’,‘isotonic’])
我们就可以定义 格里德罗切夫 利用参数的模型和网格,并使用相同的重复分层K型交叉验证方法,我们在评估每个参数组合之前使用。
…
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define grid search
grid = GridSearchCV(estimator=calibrated, param_grid=param_grid, n_jobs=-1, cv=cv, scoring=‘roc_auc’)
# execute the grid search
grid_result = grid.fit(X, y)
一旦进行了评估,我们将总结用最高的Rocauc找到的配置,然后列出所有组合的结果。
# report the best configuration
print(“Best: %f using %s” % (grid_result.best_score_, grid_result.best_params_))
# report all configurations
means = grid_result.cv_results_[‘mean_test_score’]
stds = grid_result.cv_results_[‘std_test_score’]
params = grid_result.cv_results_[‘params’]
for mean, stdev, param in zip(means, stds, params):
print(“%f (%f) with: %r” % (mean, stdev, param))
将其联系在一起,用KNN模型对不平衡分类进行网格搜索概率校准的完整例子列出如下。
# grid search probability calibration with knn for imbalance classification
from numpy import mean
from sklearn.datasets import make_classification
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.calibration import CalibratedClassifierCV
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=4)
# define model
model = KNeighborsClassifier()
# wrap the model
calibrated = CalibratedClassifierCV(model)
# define grid
param_grid = dict(cv=[2,3,4], method=[‘sigmoid’,‘isotonic’])
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define grid search
grid = GridSearchCV(estimator=calibrated, param_grid=param_grid, n_jobs=-1, cv=cv, scoring=‘roc_auc’)
# execute the grid search
grid_result = grid.fit(X, y)
# report the best configuration
print(“Best: %f using %s” % (grid_result.best_score_, grid_result.best_params_))
# report all configurations
means = grid_result.cv_results_[‘mean_test_score’]
stds = grid_result.cv_results_[‘std_test_score’]
params = grid_result.cv_results_[‘params’]
for mean, stdev, param in zip(means, stds, params):
print(“%f (%f) with: %r” % (mean, stdev, param))
运行该示例时,在不平衡的分类数据集上使用一组不同类型的校准概率来评估nn。
注意事项 你的 结果可能不同 给出了算法的随机性或评价过程,或数值精度的差异.考虑运行几次示例,并比较平均结果。
在这种情况下,我们可以看到,最好的结果是通过" cv 两个中的一个和一个 等渗的 “价值” 方法 达到平均的中华民国奥先令约0.895,从0.864到0.864,没有校准。
Best: 0.895120 using {‘cv’: 2, ‘method’: ‘isotonic’}
0.895084 (0.062358) with: {‘cv’: 2, ‘method’: ‘sigmoid’}
0.895120 (0.062488) with: {‘cv’: 2, ‘method’: ‘isotonic’}
0.885221 (0.061373) with: {‘cv’: 3, ‘method’: ‘sigmoid’}
0.881924 (0.064351) with: {‘cv’: 3, ‘method’: ‘isotonic’}
0.881865 (0.065708) with: {‘cv’: 4, ‘method’: ‘sigmoid’}
0.875320 (0.067663) with: {‘cv’: 4, ‘method’: ‘isotonic’}
这提供了一个模板,您可以使用它来评估不同模型上的概率校准配置。