如何在不拆分数据的情况下运行sklearn.model_selection.GridSearchCV



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

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

这里有一个简单的例子:

我可能希望为KMeans选择最佳的k。实际上,我将在许多数据集上使用KMeans,这些数据集在某种意义上是相似的。碰巧我有一些这样的数据集的基本事实标签,我将其称为我的"训练"数据。因此,我决定简单地为我的训练数据选择最佳的k,并将该k用于未来的数据集,而不是使用类似BIC的东西。对k的可能值的搜索是网格搜索。sklearn库中提供了KMeans,因此我可以很容易地在此模型上定义网格搜索。顺便说一句,KMeans接受一个"空"的y值,该值只需通过即可在GridSearchCV记分器中使用。然而,在这里进行交叉验证是没有意义的,因为我的单个kmeans模型从未看到基本事实标签,因此无法过拟合。

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

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

文档声称GridSearchCV构造函数中的cv参数可以选择性地接受"可迭代的yield(train,test(拆分为索引数组。"事实证明,"索引数组"位是不相关的,可以发送可用于索引数组的任意对象。如果我们提交一个为训练和测试拆分提供整个数组的东西,我们就可以绕过交叉验证行为。

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

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

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

如果你进行网格搜索,你需要进行交叉验证,否则你会对测试数据进行过度填充,因为你会在同一数据上评估多个超参数设置。

最新更新