【问题标题】:Is there easy way to grid search without cross validation in python?是否有简单的方法来网格搜索而不在 python 中进行交叉验证?
【发布时间】:2016-04-10 01:29:56
【问题描述】:

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

点是

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我尝试PredefinedSplit(test_fold=[-1]*len(X_train)) 时,我收到了错误ValueError: No fits were performed. Was the CV iterator empty? Were there no candidates?。尽管我可能对您的方法有误解。我不得不使用test_fold=[0]*len(X_train)
    【解决方案2】:

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

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

    【讨论】:

    • 不过,这是一个很棒的方法,而且很有效! sklearndevs 指出这是一种不好的做法的 github 问题的链接是 here
    【解决方案3】:

    我真的不建议使用 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
    

    【讨论】:

    • 谢谢你,@大卫!我将使用 ParameterGrid。我想知道为什么我不应该使用OOB来评估。如果你不介意占用你的时间,你能解释一下或者给我一个链接吗?
    • OOB 错误比使用某种形式的保持验证更有可能导致过度拟合。
    • 大卫,你有引用该声明吗? OOB 错误看不到它评估的数据。
    • 大卫,鉴于 oob_score_ = 准确度,您目前正在选择最差的模型。我认为应该是 'if rf.oob_score_ > best_score:'
    • @David,为什么您认为 OOB 错误可能导致过度拟合?据我了解,应该是根据stat.berkeley.edu/~breiman/RandomForests/cc_home.htm和其他文献对错误率的无偏估计。
    【解决方案4】:

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

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

    • 使用 docs 中的 arg cv 并为其提供一个生成器,该生成器生成一个包含所有索引的元组(以便训练和测试相同)
    • 更改 scoring 参数以使用随机森林中给出的 oob。

    【讨论】:

    • 谢谢 AJK。正如您所说,使用 GridSearchCV 的方式看起来有点复杂和不自然。我将使用 ParameterGrid。
    猜你喜欢
    • 2019-09-29
    • 2017-06-19
    • 2021-12-11
    • 2015-09-18
    • 1970-01-01
    • 2017-12-29
    • 2017-10-07
    • 2013-10-20
    • 2014-01-10
    相关资源
    最近更新 更多