为什么我的 platts 和 isotonic 校准曲线的点比我的未校准模型少?

数据挖掘 Python xgboost 可能性 网格搜索 概率校准
2022-02-15 15:32:13

我使用网格搜索训练模型,然后使用其中的最佳参数来定义我选择的模型。

model = XGBClassifier()
pipeline = make_pipeline(model)

kfolds = StratifiedKFold(3)
clf = GridSearchCV(pipeline, parameters, cv=kfolds.split(x_train, y_train),
                           scoring='roc_auc', return_train_score=True)

clf.fit(x, y)

model = clf.best_estimator_

使用gridsearch中的这个模型,然后校准它并绘制未校准与校准的图。

y_test_uncalibrated = model.predict_proba(x_test)[:, 1]
fraction_of_positives, mean_predicted_value=calibration_curve(y_test,y_test_uncalibrated,n_bins=10)

plt.plot(mean_predicted_value, fraction_of_positives, 's-', label='Uncalibrated')
    
clf_isotonic = CalibratedClassifierCV(model, cv='prefit', method='isotonic')
clf_isotonic.fit(x_train, y_train)
y_test_iso = clf_isotonic.predict_proba(x_test)[:, 1]
fraction_of_positives, mean_predicted_value = calibration_curve(y_test, y_test_iso, n_bins=10)
    
plt.plot(mean_predicted_value, fraction_of_positives, 's-', color='red', label='Calibrated (Isotonic)')

我对上面的 platts 做同样的事情。但是我得到以下结果:

在此处输入图像描述

我不明白为什么现在等渗和普氏的分数减少了?我不觉得我的代码做错了什么。我犯了什么错误吗?

1个回答

的默认值strategycalibration_curve'uniform'即每个 bin 具有相等的宽度。如果在校准后,您的模型在 bin 内没有做出预测,则不会为该范围绘制点。

您可以更改为strategy='quantile',这将保证为每条曲线绘制 10 个点;你会在左边看到更多的红/黄点。


此外,理想情况下,您不应该在训练原始模型的相同数据上进行校准。用户指南

已经安装好的分类器可以通过设置来校准cv="prefit"在这种情况下,数据仅用于拟合回归量。用户需要确保用于拟合分类器的数据与用于拟合回归器的数据不相交。