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

yke*_*ke9 20 python random-forest scikit-learn grid-search

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

要点是

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

Dav*_*vid 32

我真的建议不要使用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
Run Code Online (Sandbox Code Playgroud)

  • @David,为什么你认为OOB错误可能导致过度拟合?据我了解,根据https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm和其他文献,它应该是对错误率的无偏估计. (3认同)

Sid*_*hou 5

请参阅此链接: /sf/answers/3127761381/

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