Scikit 使用 CalibratedClassifierCV 校准分类器的正确方法

Scikit correct way to calibrate classifiers with CalibratedClassifierCV

Scikit 有 CalibratedClassifierCV,它允许我们在特定的 X、y 对上校准我们的模型。它还明确指出 data for fitting the classifier and for calibrating it must be disjoint.

如果它们必须是不相交的,用以下训练分类器是否合理?

model = CalibratedClassifierCV(my_classifier)
model.fit(X_train, y_train)

我担心使用相同的训练集会违反 disjoint data 规则。另一种方法可能是有一个验证集

my_classifier.fit(X_train, y_train)
model = CalibratedClassifierCV(my_classifier, cv='prefit')
model.fit(X_valid, y_valid)

缺点是训练数据较少。另外,如果 CalibratedClassifierCV 应该只适用于适合不同训练集的模型,为什么它的默认选项是 cv=3,它也适用于基本估计量?交叉验证是否自行处理不相交规则?

问题:CalibratedClassifierCV的正确使用方法是什么?

我已经在 CrossValidated 中回答了完全相同的问题。无论如何我都会把它留在这里,因为我不清楚这个问题是属于这里还是属于 CrossVal。

---原答案---

CalibratedClassifierCV docs 中提到的两件事暗示了它的使用方式:

base_estimator: If cv=prefit, the classifier must have been fit already on data.

cv: If “prefit” is passed, it is assumed that base_estimator has been fitted already and all data is used for calibration.

我可能显然解释错了,但看来您可以通过两种方式使用 CCCV(CalibratedClassifierCV 的缩写):

第一名:

  • 您像往常一样训练您的模型,your_model.fit(X_train, y_train)
  • 然后,您创建 CCCV 实例,your_cccv = CalibratedClassifierCV(your_model, cv='prefit')。请注意,您设置 cv 以标记您的模型已经拟合。
  • 最后,你打电话给your_cccv.fit(X_validation, y_validation)。此验证数据仅用于校准目的。

第二名:

  • 您有一个新的未经训练的模型。
  • 然后你创建your_cccv=CalibratedClassifierCV(your_untrained_model, cv=3)。注意 cv 现在是折叠数。
  • 最后,你打电话给cccv_instance.fit(X, y)。因为您的模型未经训练,所以 X 和 y 必须用于训练和校准。确保数据 'disjoint' 的方法是交叉验证:对于任何给定的折叠,CCCV 会将 X 和 y 拆分为您的训练和校准数据,因此它们不会重叠。

TLDR:方法一允许您控制用于训练和校准的内容。方法二使用交叉验证来尝试充分利用您的数据来实现这两个目的。