【问题标题】:What is the output cross-validated model (aka estimator) in Scikit-learn?Scikit-learn 中的输出交叉验证模型(又名估计器)是什么?
【发布时间】:2015-05-27 07:51:31
【问题描述】:

我已经使用 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)我们需要提供一个测试集进行最终评估,即使我们使用了交叉验证(似乎浪费数据我)?据我所知,这种最终评估称为保持方法,是最简单的交叉验证。

【问题讨论】:

    标签: python machine-learning scikit-learn classification svm


    【解决方案1】:

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

    您可以检查 RFECV 对象以获取有关选择了哪些功能或各种功能子集如何执行的更多信息(请参阅RFECV documentation、.support_、.grid_scores_ 和 .ranking_ 都特别相关,This example 也是如此) .

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

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

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

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

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

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

    编辑:修复链接

    【讨论】:

    • 感谢您的回复!关于我的第一个问题,RFECV 是否递归删除属性并在为每个随机交叉验证 k 折集(即随机训练和验证集)保留的那些属性上建立模型,最终模型基于 k 折集产生高精度所需的最低功能(例如 f1)?关于我的第二个问题,就我而言,我没有使用验证数据来调整“超参数”(例如内核大小、C 和 gamma),那么为什么我不能将其视为测试数据呢?
    • 对。 RFECV 使用交叉验证为您优化功能集(而不是您手动执行),其中最佳由您传递给评分的任何内容定义(在您的情况下为 f1,其他选项为 here)。
    • 对于测试集,假设您没有弄乱模型参数并且使用 k-fold 进行验证,您只需要两组:Train/Validate 和 Test。最终评估应该来自您根据应用于未见测试集的训练/验证数据(例如 RFECV 模型)构建的任何内容。如果它很好,一切都很棒。如果没有,请重新随机化并重新开始。不要试图调整东西以使模型在测试集上表现更好。测试用于最终评估。请记住,目标不是在测试集上表现出色,而是在之后发生的任何事情上表现出色。
    猜你喜欢
    • 2016-04-25
    • 2017-09-02
    • 2020-02-08
    • 2017-04-24
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2015-06-22
    相关资源
    最近更新 更多