在python中没有交叉验证的网格搜索有简单的方法吗?

时间:2016-01-06 03:09:36

标签: python scikit-learn random-forest grid-search

在scikit中有一个非常有用的类GridSearchCV - 学习网格搜索和交叉验证,但我不想做交叉验证。我想在没有交叉验证的情况下进行网格搜索,并使用整个数据进行训练。 更具体地说,我需要用" oob得分评估我的模型由RandomForestClassifier评估"在网格搜索期间。 有简单的方法吗?或者我应该自己上课?

要点

  • 我想轻松地进行网格搜索。
  • 我不想进行交叉验证。
  • 我需要使用整个数据进行训练。(不要分开训练数据和测试数据)
  • 我需要在网格搜索期间使用oob得分进行评估。

4 个答案:

答案 0 :(得分:27)

我真的建议不要使用OOB来评估模型,但知道如何在F_GETFL之外运行网格搜索很有用(我经常这样做,所以我可以保存最佳网格中的CV预测便于模型堆叠)。我认为最简单的方法是通过GridSearchCV()创建参数网格,然后循环遍历每组参数。例如,假设您有一个网格字典,名为" grid"和RF模型对象,名为" rf",那么您可以执行以下操作:

ParameterGrid()

答案 1 :(得分:2)

一种方法是使用for g in ParameterGrid(grid): rf.set_params(**g) rf.fit(X,y) # save if best if rf.oob_score_ > best_score: best_score = rf.oob_score_ best_grid = g print "OOB: %0.5f" % best_score print "Grid:", best_grid 来创建所需参数的迭代器并循环遍历它。

您可以做的另一件事是实际配置GridSearchCV以执行您想要的操作。我不会推荐这么多,因为它不必要地复杂化 你需要做的是:

  • 使用docs中的arg ParameterGrid并为其提供一个生成一个包含所有索引的元组的生成器(以便列车和测试相同)
  • 更改cv arg以使用从随机森林中发出的oob。

答案 2 :(得分:1)

查看此链接: https://stackoverflow.com/a/44682305/2202107

他使用了cv=[(slice(None), slice(None))],这是sklearn的作者不推荐的。

答案 3 :(得分:0)

尽管问题早在几年前就已经解决了,但我只是发现了一种更自然的方法,如果您坚持使用GridSearchCV()而不是其他方法(ParameterGrid()等):

  1. 创建一个 sklearn.model_selection.PredefinedSplit()。它使用一个名为 test_fold 的参数,该参数是一个列表,大小与输入数据相同。在列表中,将属于训练集的所有样本设置为 -1 ,将其他样本设置为 0
  2. 使用cv =“创建的PredefinedSplit对象”创建GridSearchCV对象。

然后,GridSearchCV将仅生成1个火车验证分段,该分段在 test_fold 中定义。