我想评估模型管道的性能。我没有根据我正在评估管道的真实标签来训练我的模型,因此没有必要进行交叉验证方案。不过,我仍然想使用 sklearn 中提供的网格搜索功能。
是否可以在不拆分数据的情况下使用sklearn.model_selection.GridSearchCV
?换句话说,我想运行网格搜索并获取传递到管道的完整数据集的分数。
这是一个简单的例子:
我可能希望为 KMeans 选择最佳的 k
。实际上,我将在许多数据集上使用 KMeans,这些数据集在某种意义上是相似的。碰巧我有一些这样的数据集的真实标签,我将其称为我的“训练”数据。因此,不要使用类似 BIC 的东西,我决定简单地为我的训练数据选择最佳的 k
,并将该 k
用于 future 的数据集。对 k
的可能值进行搜索是网格搜索。 KMeans 在 sklearn 库中可用,因此我可以非常轻松地在此模型上定义网格搜索。顺便说一句,KMeans 接受一个“空”y
值,该值只是简单地传递并可以在 GridSearchCV 记分器中使用。然而,在这里进行交叉验证是没有意义的,因为我的个人 kmeans 模型永远不会看到真实标签,因此无法过度拟合。
需要明确的是,上面的示例只是一个人为的示例,目的是为那些担心我可能滥用此功能的人证明此类事情的可能用例。我感兴趣的上述示例的解决方案是如何不拆分 GridSearchCV 中的数据。
是否可以在不拆分数据的情况下使用sklearn.model_selection.GridSearchCV
?
最佳答案
文档声称,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 的结果。
关于python - 如何在不分割数据的情况下运行sklearn.model_selection.GridSearchCV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60304514/