#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. Спасибо за всю помощь.