【问题标题】:How to run sklearn.model_selection.GridSearchCV without splitting data?如何在不拆分数据的情况下运行 sklearn.model_selection.GridSearchCV?
【发布时间】:2020-06-03 20:50:29
【问题描述】:

我想评估模型管道的性能。我没有在我正在评估管道的真实标签上训练我的模型,因此没有必要进行交叉验证方案。但是,我仍然想使用 sklearn 中提供的网格搜索功能。

是否可以在不拆分数据的情况下使用sklearn.model_selection.GridSearchCV?换句话说,我想运行 Grid Search 并获得传入管道的完整数据集的分数。

这是一个简单的例子:

我可能希望为 KMeans 选择最佳的 k。实际上,我将在 许多 数据集上使用 KMeans,这些数据集在某种意义上是相似的。碰巧我有一些这样的数据集的真实标签,我称之为“训练”数据。因此,我决定不使用BIC 之类的东西,而是简单地为我的训练数据选择最佳的k,并将该k 用于未来的数据集。搜索k 的可能值是一种网格搜索。 KMeans 在 sklearn 库中可用,因此我可以非常轻松地在此模型上定义网格搜索。顺便说一句,KMeans 接受一个“空”y 值,它只是通过并可以在 GridSearchCV 记分器中使用。但是,在这里进行交叉验证是没有意义的,因为我个人的 kmeans 模型从来没有看到地面实况标签,因此无法过拟合。

需要明确的是,上面的示例只是一个人为的示例,目的是为那些担心我可能会滥用此功能的人证明这种事情的可能用例是合理的。上例我感兴趣的解决方案是如何不拆分GridSearchCV中的数据。

是否可以在不拆分数据的情况下使用sklearn.model_selection.GridSearchCV

【问题讨论】:

  • 你做GridSearchCV等于做CV。当然,从技术角度来看,您可以在没有 train/test 拆分的情况下这样做。但这会使 ML 中普遍接受的 train/validate/test 哲学无效。
  • @SergeyBushmanov 的训练/验证/测试理念假设一个人正在根据真实标签(可能正在测试的标签相同)训练您的数据。我的训练管道不使用地面实况标签。因此,交叉验证没有任何作用,并且不可能过度拟合地面实况标签。
  • “当然,从技术角度来看,您可以在没有训练/测试拆分的情况下这样做。”当然如此。但是,我想知道 sklearn 中现有的 gridsearch 助手是否可以帮助解决这个问题?
  • 理论上你可以做到gs=GridSearchCV(scoring=None, cv=None); gs.fit(X, None),但你应该更具体地说明你的问题是什么......
  • cv=None: "无,使用默认的 5 折交叉验证,"。这不会关闭交叉验证。

标签: python scikit-learn


【解决方案1】:

文档声称GridSearchCV 构造函数中的cv 参数可选地能够接受“可迭代的产生(训练,测试)拆分为索引数组。”事实证明,“索引数组”位是无关紧要的,并且可以发送可用于索引数组的任意对象。如果我们交出一个为训练和测试拆分提供整个数组的东西,我们可以规避交叉验证行为。

这是完成与问题中给出的示例相对应的事情的一种方法:

grid_search = sklearn.model_selection.GridSearchCV(
    sklearn.cluster.KMeans(),
    {"k": [2,3,4,5,7,10,20]},
    cv=(((slice(None), slice(None)),)
)

如果您将真实标签作为y 传递给它,它会针对整个数据集评估与各种k 相对应的KMeans 每次运行的结果。

【讨论】:

    【解决方案2】:

    如果你做网格搜索,你需要做交叉验证,否则你会在测试数据上过拟合,因为你在同一数据上评估了几个超参数的设置。

    【讨论】:

    • 我重申我在训练期间没有使用地面实况标签。不可能过度拟合我没有提供给训练算法的数据。
    • @Scott 那么我不明白你在做什么。你能澄清一下吗?您不使用标签进行培训吗?是某种无监督学习吗?
    • 有点像。请注意,网格搜索只是一种优化方法。各种不涉及交叉验证的优化器一直用于模型选择。例如,当优化表面是可微的时,梯度下降方法会优化参数。我的优化需要网格搜索。实际上,通常进入 GridSearchCV 的“超参数”只是我的模型参数。
    • 我会尝试设计一个简单的例子。
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多