在scikit中有一个非常有用的类GridSearchCV - 学习网格搜索和交叉验证,但我不想做交叉验证。我想在没有交叉验证的情况下进行网格搜索,并使用整个数据进行训练。 更具体地说,我需要用" oob得分评估我的模型由RandomForestClassifier评估"在网格搜索期间。 有简单的方法吗?或者我应该自己上课?
要点
答案 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以执行您想要的操作。我不会推荐这么多,因为它不必要地复杂化 你需要做的是:
ParameterGrid
并为其提供一个生成一个包含所有索引的元组的生成器(以便列车和测试相同)cv
arg以使用从随机森林中发出的oob。答案 2 :(得分:1)
查看此链接: https://stackoverflow.com/a/44682305/2202107
他使用了cv=[(slice(None), slice(None))]
,这是sklearn的作者不推荐的。
答案 3 :(得分:0)
尽管问题早在几年前就已经解决了,但我只是发现了一种更自然的方法,如果您坚持使用GridSearchCV()而不是其他方法(ParameterGrid()等):
然后,GridSearchCV将仅生成1个火车验证分段,该分段在 test_fold 中定义。