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

3

Scikit有CalibratedClassifierCV,可以让我们在特定的X和y组合上校准模型。它还明确指出:用于拟合分类器和校准分类器的数据必须是不相交的。

如果它们必须是不相交的,那么使用以下内容来训练分类器是否合法?

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

我担心使用相同的训练集会违反“不相交数据”的规则。另一种选择是使用验证集。

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

缺点是留下较少的数据进行训练。此外,如果CalibratedClassifierCV只适用于在不同训练集上拟合的模型,则其默认选项为cv=3,这是为什么?交叉验证是否自行处理不相交规则?
问题:使用CalibratedClassifierCV的正确方法是什么?
1个回答

5

我已经在CrossValidated中回答过完全相同的问题。由于我不确定这个问题属于这里还是CrossVal,所以我仍然会在这里留下我的答案。

--- 原始回答 ---

CalibratedClassifierCV文档提到了两件事情,暗示了它的用法:

base_estimator: 如果设置了cv=prefit,则分类器必须已经拟合数据了。

cv: 如果传递“prefit”,则假定base_estimator已经被拟合,并且所有数据都用于校准。

我可能理解有误,但是似乎可以使用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必须同时用于训练和校准。确保数据“不重叠”的方法是交叉验证:对于任何给定的折叠,CCCV将X和y拆分为您的训练和校准数据,因此它们不重叠。

TLDR:方法一允许您控制用于训练和校准的数据。方法二使用交叉验证尝试最大化数据的利用率,同时达到训练和校准的目的。


好的,这非常有帮助。文档在这个问题上并不是很有用和清晰。 - agenis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接