python - 如何在不分割数据的情况下运行sklearn.model_selection.GridSearchCV?

标签 python scikit-learn

我想评估模型管道的性能。我没有根据我正在评估管道的真实标签来训练我的模型,因此没有必要进行交叉验证方案。不过,我仍然想使用 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/

相关文章:

python - 无法使用python的mysql.connector连接到mysql

Python:只有文件名(而不是路径)可用时如何在系统范围内搜索文件

python-2.7 - 在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性性能差得多

python - CountVectorizer() 不适用于单字母单词

python - 获取选定的特征名称 TFIDF Vectorizer

python - 组合多个偶尔重叠的 DataFrame

python - Kafka AvroConsumer 使用 offsets_for_times 从时间戳消费

python - 使用Python获取原始电子邮件发送服务器

python - 在Python中对可变长度数组进行分类

python - sklearn : Hyperparameter tuning by gradient descent?