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

Python 如何在不拆分数据的情况下运行sklearn.model_selection.GridSearchCV?,python,scikit-learn,Python,Scikit Learn,我想评估一个模型管道的性能。我不是根据我评估管道所依据的地面真相标签来训练我的模型,因此不需要执行交叉验证方案。但是,我仍然希望使用sklearn中提供的网格搜索功能 是否可以在不拆分数据的情况下使用sklearn.model\u selection.GridSearchCV?换句话说,我希望运行网格搜索,并获得传递到管道的完整数据集的分数 下面是一个简单的例子: 我可能希望为KMeans选择最佳的k。实际上,我将在许多在某种意义上类似的数据集上使用KMeans。碰巧我有一些这样的数据集的基本事

我想评估一个模型管道的性能。我不是根据我评估管道所依据的地面真相标签来训练我的模型,因此不需要执行交叉验证方案。但是,我仍然希望使用sklearn中提供的网格搜索功能

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

下面是一个简单的例子:

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

要清楚的是,上面的例子只是一个人为的例子,为那些担心我可能滥用此功能的人提供了一个可能的用例。我感兴趣的上述示例的解决方案是如何在
GridSearchCV
中不分割数据


是否可以在不分割数据的情况下使用
sklearn.model\u selection.GridSearchCV

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

文档声称
GridSearchCV
构造函数中的
cv
参数可以选择性地接受“一个iterable屈服(训练,测试)拆分为索引数组”。结果表明,“索引数组”位是不相关的,还可以发送任意对象,这些对象可用于索引数组。如果我们提交一个东西,为列车和测试拆分提供整个数组,我们就可以避免交叉验证行为

这是与问题中给出的示例相对应的一种实现方法:

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运行的结果。

您所做的
GridSearchCV
等于所做的
CV
。当然,从技术角度来看,您可以在不进行
train/test
split的情况下进行此操作。但是,这使ML中普遍接受的
训练/验证/测试
原理无效。@SergeyBushmanov训练/验证/测试原理假设,人们正在根据基本真相标签(可能测试的标签)训练数据。我的训练管道不使用地面真相标签。因此,交叉验证不起任何作用,并且不可能过度拟合基本事实标签。“当然,从技术角度来看,您可以在不进行训练/测试分离的情况下这样做。”当然是这样。但是,我想知道sklearn中现有的gridsearch助手是否可以帮助实现这一点?理论上,您可以做
gs=GridSearchCV(score=None,cv=None);gs.fit(X,无)
但您应该更具体地说明问题所在……
cv=None
:“无,使用默认的5倍交叉验证”。这不会关闭交叉验证。我重申,我在培训期间没有使用地面真相标签。不可能过度拟合我没有提供给训练算法的数据。@Scott那么我不明白你在做什么。你能澄清一下吗?您不使用标签进行培训吗?这是一种无监督的学习吗。请注意,网格搜索只是一种优化方法。各种不涉及交叉验证的优化器一直用于模型选择。例如,当优化曲面是可微的时,梯度下降方法在参数上进行优化。我的优化需要网格搜索。通常进入GridSearchCV的“超参数”实际上只是我的模型参数。我将尝试设计一个简单的示例。