【问题标题】:RandomizedSearchCV takes longer time with fewer elements to searchRandomizedSearchCV 需要更长的时间,但要搜索的元素更少
【发布时间】:2019-08-10 14:56:51
【问题描述】:

我遇到了一个奇怪的问题,我正在使用 RandomizedSearchCV 来优化我的参数。

para_RS =     {"max_depth": randint(1,70),
               "max_features": ["log2", "sqrt"],
               "min_samples_leaf": randint(5, 50),
               "criterion": ["entropy","gini"],
               "class_weight":['balanced'],
               "max_leaf_nodes":randint(2,20)
              }
dt = DecisionTreeClassifier()

如果我包含所有这些参数,输出会在 2-3 分钟内出现,但是如果我删除所有参数并只保留以下参数,它将永远运行并且我必须杀死笔记本

para_RS =     {
               "max_depth": randint(1,70)
              }

如果我删除的更少,它需要很长时间才能运行(5-10 分钟)。 下面是代码:

if (randomsearch == True):
        tick = time.time()

        print("Random_Search_begin")
        rs= RandomizedSearchCV(estimator=dt, cv=5, param_distributions=para_RS,
                               n_jobs=4,n_iter =30, scoring="roc_auc",return_train_score=True)
        rs.fit(trainx_outer,trainy_outer)

        # other code irrelevant to the issue...

        print("Random_Search_end")

【问题讨论】:

    标签: python machine-learning scikit-learn hyperparameters


    【解决方案1】:

    您可以关闭它,因为当我开始在分类器和 RandomSearchCV 中使用随机种子时,问题似乎消失了。感谢大家的帮助。

    【讨论】:

      【解决方案2】:

      这是由于以下情况的随机性:

      "max_depth": randint(1,70)
      "max_leaf_nodes":randint(2,20)
      

      randint(1, 70) 将返回一个介于 1 和 70 之间的整数。因此,在不同的运行期间,会生成不同的 max_depth 值。

      所以可能会发生在某个运行期间,产生的价值非常高。 DecisionTreeClassifier 的速度受max_depth 的值和max_leaf_nodes 的影响。如果这些非常大,时间会非常长。

      另外,我不确定您如何能够运行此代码。因为 RandomizedSearchCV 采用可迭代字典的参数网格。但是您的代码将为“max_depth”、“max_leaf_nodes”生成单个 int,而不是数组或可迭代。所以它应该抛出一个错误。您使用的是哪个版本的 sklearn?还是您在此处显示的代码与实际代码不同?

      【讨论】:

      • 感谢 Vivek 的回答,但是,我怀疑深度是原因,好像我提到了所有参数,并且只提到了具有相同 randint(1,70) 的最大深度,我看到时间上的巨大差异.两者在最大深度(18-20 之间)上给出了几乎相同的结果。我使用两种设置(所有参数且只有最大深度)运行了大约 30-40 次,每次所有参数都以 2-3 完成,最大深度需要永远。
      • 我正在运行 sklearn 版本 0.19.1 和 python 3.6。此外,“n_iter”参数是驱动此 RandomSearchCV 运行的次数,每次运行时它都会调用参数搜索空间并获得一个通过 randint 函数编号。
      • @user6658936 randint() 返回一个 int 而不是 RandomizedSearchCV 可以在每个迭代中一次又一次调用的分布。
      • 我理解 randint() 返回一个数字,但“n_iter”参数是驱动这个 RandomSearchCV 多少次的参数。每次根据该参数调用 RandomSearchCV 时,它都会从 randint 中为该参数调用一个数字。我已经验证过了。如果我只是做 n_iter = 10 并使用上面的代码,它将随机返回 10 个值作为最大深度。下面是 cv_results_ 的输出
      • 'params': [{'class_weight': 'balanced', 'criterion': 'entropy', 'max_depth': 6, 'max_features': 'sqrt', 'max_leaf_nodes': 11, 'min_samples_leaf':44},{'class_weight':'平衡','criterion':'gini','max_depth':3,'max_features':'sqrt','max_leaf_nodes':4,'min_samples_leaf':7} , {'class_weight': 'balanced', 'criterion': 'gini', 'max_depth': 4, 'max_features': 'sqrt', 'max_leaf_nodes': 17, 'min_samples_leaf': 42},
      猜你喜欢
      • 2022-04-28
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多