Scikit-learn 中的输出交叉验证模型(又名估算器)是什么?

What is the output cross-validated model (aka estimator) in Scikit-learn?

我在 python 中编写了一个代码,使用 scikit-learn 模块执行具有递归特征消除和交叉验证的 SVM 分类:

svc = SVC(kernel="linear") 
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y_train, 2), scoring='f1') 
svc.fit(X_train, y_train)
rfecv.fit(X_train, y_train)

不幸的是,我无法理解为什么使用交叉验证模型 (rfecv.fit) 时的输出分类与默认模型 (svc.fit) 不同。交叉验证模型是否代表基于预测分数 (f1) 值的最佳性能模型?如果是,如何提取有关此模型经过训练和验证的数据的信息?

此外,谁能解释一下为什么(根据 scikit-learn 文档:http://scikit-learn.org/stable/modules/cross_validation.html)我们需要为最终评估提供一个测试集,即使我们使用了交叉验证(看起来像浪费数据给我)?据我所知,这种最终评估称为 holdout 方法,是最简单的一种交叉验证。

模型在做不同的事情。 SVC 在您的完整特征 space 上训练模型,并在完整特征 space 上进行预测。 RFECV 使用完整特征 space 并调整所选特征的数量。最终模型及其所做的任何预测都基于您的特征子集(未消除的特征)。

您可以检查 RFECV 对象以获取有关选择了哪些功能或各种功能子集如何执行的更多信息(请参阅 RFECV documentation, .support_, .grid_scores_ and .ranking_ are all particularly relevant, as is This example)。

你问题的第二部分是关于数据分区的。通常,在构建新模型时,您应该将数据分成三组:

  • 训练数据用于训练模型(显然)
  • 验证数据用于调整模型(不用于测试模型)
  • 测试数据用于实际测试模型

验证和测试之间的区别可能有点模糊,但非常重要。以您的示例(并暂时假设您没有使用交叉验证),您将在训练集上训练您的数据。现在它正在运行,您可以检查模型并使用验证集做出一些预测。这会让您了解哪些功能有效,哪些功能无效,以及关于模型的其他繁琐位(例如,使用哪种内核以及该内核上的任何参数)。您最终决定使用原始特征的某些子集和 3 次多项式内核。

太棒了!现在你有了一个工作模型。该模型在未见数据上的实际表现如何?如果你没有测试集,你永远不会知道。您所知道的是您如何让它在验证集上工作。

现在在您的实际示例中,RFECV 使用交叉验证来进行特征选择,这是处理训练-验证分离的另一种方法,它可以从您的数据中挤出更多(如果您的数据量较小,则特别有用)样本数量和获得更多是 expensive/impossible).

通常,交叉验证以平均值处理(例如,随机 k 折的平均性能),练习的目标是不断调整模型,直到您对平均性能感到满意为止。只有这样你才能测试它(在测试集上)。

编辑:修复了 link