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

sap*_*ico 3 python classification calibration training-data scikit-learn

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

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

model = CalibratedClassifierCV(my_classifier)
model.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

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

my_classifier.fit(X_train, y_train)
model = CalibratedClassifierCV(my_classifier, cv='prefit')
model.fit(X_valid, y_valid)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

\n\n

---原答案---

\n\n

CalibrateClassifierCV 文档中提到了两件事,暗示了它的使用方式:

\n\n
\n

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

\n\n

cv:如果传递了\xe2\x80\x9cprefit\xe2\x80\x9d,则假设已经拟合了base_estimator,并且所有数据都用于校准。

\n
\n\n

我显然可能会错误地解释这一点,但看来您可以通过两种方式使用 CCCV(CalibrateClassifierCV 的缩写):

\n\n

第一:

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

第二:

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

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

\n