RandomizedSearchCV需要更长的时间,搜索的元素更少

时间:2019-03-20 00:27:15

标签: python machine-learning scikit-learn hyperparameters

我遇到一个奇怪的问题,我正在使用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")

2 个答案:

答案 0 :(得分: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?还是您在此处显示的代码与实际代码不同?

答案 1 :(得分:0)

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