29

scikit-learn 中有绝对有用的类 GridSearchCV 可以进行网格搜索和交叉验证,但我不想进行交叉验证。我想在没有交叉验证的情况下进行网格搜索并使用整个数据进行训练。更具体地说,我需要在网格搜索期间使用“oob score”评估由 RandomForestClassifier 制作的模型。有简单的方法吗?还是我应该自己上课?

要点是

  • 我想用简单的方法进行网格搜索。
  • 我不想做交叉验证。
  • 我需要使用整个数据来训练。(不想分开训练数据和测试数据)
  • 我需要在网格搜索期间使用 oob 分数进行评估。
4

4 回答 4

50

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

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
于 2016-01-06T03:52:31.677 回答
2

一种方法是使用ParameterGrid创建所需参数的迭代器并对其进行循环。

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

  • cv使用文档中的 arg并给它一个生成器,该生成器产生一个包含所有索引的元组(以便训练和测试相同)
  • 更改scoringarg 以使用从随机森林中给出的 oob。
于 2016-01-06T03:52:34.977 回答
2

请参阅此链接: https ://stackoverflow.com/a/44682305/2202107

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

于 2018-01-08T06:23:04.127 回答
1

虽然问题在几年前就已经解决了,但如果你坚持使用 GridSearchCV() 而不是其他方式(ParameterGrid() 等),我只是找到了一种更自然的方法:

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

然后,GridSearchCV 将仅生成 1 个训练验证拆分,该拆分在test_fold中定义。

于 2019-12-28T03:55:41.560 回答