Scikit学习中的输出交叉验证模型(又名估计器)是什么



我在python中使用scikit学习模块编写了一段代码,用于执行具有递归特征消除和交叉验证的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学习文档:http://scikit-learn.org/stable/modules/cross_validation.html)我们需要拿出一个测试集进行最终评估,即使我们使用了交叉验证(对我来说似乎是浪费数据)?据我所知,这种最终评估被称为拒绝方法,是最简单的交叉验证。

模型正在做不同的事情。SVC在全特征空间上训练模型,并对全特征空间进行预测。RFECV使用完整的特征空间并调整所选特征的数量。最终的模型以及它所做的任何预测都是基于你的特征的子集(那些没有被消除的特征)。

您可以检查RFECV对象,以获得有关选择了哪些功能或如何执行各种功能子集的更多信息(请参阅RFECV文档,.support_、.grid_scores_和.ranking_都特别相关,如本例所示)。

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

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

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

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

现在,在您的实际示例中,RFECV使用交叉验证来进行特征选择,这是处理训练-验证分离的另一种方式,它会从您的数据中挤出更多的数据(如果您的样本数量较少,并且获取更多的样本是昂贵/不可能的,则特别有用)。

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

编辑:修复了链接

最新更新