RandomizedSearchCV занимает больше времени при меньшем количестве элементов для поиска

#python #machine-learning #scikit-learn #hyperparameters

#python #машинное обучение #scikit-learn #гиперпараметры

Вопрос:

У меня возникла странная проблема, я использую 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")
  

Ответ №1:

Это связано со случайным характером следующего:

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

randint(1, 70) вернет целое число от 1 до 70. Таким образом, во время разных запусков генерируется разное значение max_depth .

Таким образом, может случиться, что во время определенного запуска генерируемое значение очень велико. На скорость DecisionTreeClassifier влияет значение max_depth и it max_leaf_nodes . Если они очень большие, время будет очень большим.

Кроме того, я не уверен, как вы можете запустить этот код. Потому что RandomizedSearchCV принимает сетку параметров словаря итераций. Но ваш код будет генерировать один int для «max_depth», «max_leaf_nodes» вместо массива или итерируемого. Поэтому он должен выдавать ошибку. Какую версию sklearn вы используете? Или приведенный вами здесь код отличается от фактического?

Комментарии:

1. спасибо Vivek за ответ, однако я сомневаюсь, что причиной является глубина, поскольку, если я укажу все параметры и только максимальную глубину с тем же самым randint (1,70), я увижу огромную разницу во времени. Оба дают почти одинаковые результаты по максимальной глубине (между 18-20). Я запускал с обеими настройками (со всеми параметрами и только с максимальной глубиной) около 30-40 раз, и каждый раз со всеми параметрами заканчивается через 2-3, а максимальная глубина занимает вечность.

2. Я использую sklearn версии 0.19.1 и python 3.6. Кроме того, параметр «n_iter» определяет, сколько раз выполняется этот RandomSearchCV, и при каждом запуске он вызывает параметр search space и получает число с помощью функции randint.

3. @user6658936 randint() возвращает int, а не дистрибутив, который RandomizedSearchCV может вызываться снова и снова в каждом итерации.

4. я понимаю, что randint () возвращает число, но параметр «n_iter» определяет, сколько раз выполняется этот RandomSearchCV. Каждый раз, когда RandomSearchCV вызывается на основе этого параметра, он вызывает число из randint для этого параметра. Я это проверил. Если я просто выполню n_iter = 10 и с приведенным выше кодом, он вернет случайно выбранные 10 значений для максимальной глубины. ниже приведены выходные данные cv_results_

5. ‘params’: [{‘class_weight’: ‘balanced’, ‘criterion’: ‘entropy’, ‘max_depth’: 6, ‘max_features’: ‘sqrt’, ‘max_leaf_nodes’: 11, ‘min_samples_leaf’: 44}, {‘class_weight’: ‘balanced’, ‘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},

Ответ №2:

вы можете закрыть это, поскольку, похоже, проблема исчезла, когда я начал использовать случайное начальное значение как в классификаторе, так и в RandomSearchCV. Спасибо за всю помощь.