首页 文章

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

提问于
浏览
0

我使用scikit-learn模块在python中编写了一个代码,用递归特征消除和交叉验证来执行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)我们需要提供一个测试集进行最终评估,即使我们使用了交叉验证(对我来说似乎浪费了数据)?据我所知,最终评估被称为保持方法,并且是最简单的交叉验证 .

1 回答

  • 1

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

    您可以检查RFECV对象以获取有关所选功能或执行各种功能子集的更多信息(请参阅RFECV documentation, . support_,.grid_scores_和.ranking_都特别相关,因为This example) .

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

    • 训练数据用于训练模型(显然)

    • 验证数据用于调整模型(不用于测试模型)

    • 测试数据用于实际测试模型

    验证和测试之间的区别可能有点模糊,但非常重要 . 以你的例子为例(并且假设你当时没有工作,你可以检查模型并使用验证集进行一些预测 . 这可以让你了解哪些功能正常工作,哪些功能没有,另一些功能位于其他位置 . 关于模型(例如,使用什么样的内核以及该内核上的任何参数) . 最终决定使用原始特征的某个子集,以及3阶的多项式内核 .

    大!现在你有了一个工作模型 . 该模型对看不见的数据有多好?如果你没有测试装置,你永远不会知道 . 您所知道的就是如何让它在验证集上工作 .

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

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

    编辑:修正了一个链接

相关问题