#optuna
Вопрос:
Я пытаюсь сделать гипертюнинг с помощью Optuna
. Набор данных равен MovieLense
(1 м). В одном сценарии у меня есть Lasso
, Ridge
и Knn
. Оптуна отлично работает для Лассо и Гребня, но застревает из-за Knn.
Вы можете увидеть, как проводились испытания для настройки модели Ridge 2021-07-22 18:33:53
. Позже для Кнн было создано новое исследование 2021-07-22 18:33:53
. Сейчас (на момент публикации) это 2021-07-23 11:07:48
так, но для этого не было судебного разбирательства Knn
.
^[[32m[I 2021-07-22 18:33:53,959]^[[0m Trial 199 finished with value: -1.1917496039282074 and parameters: {'alpha': 3.553292157377711e-07, 'solver': 'sag', 'normalize': False}. Best is trial 71 with value: -1.1917485424789929.^[[0m
^[[32m[I 2021-07-22 18:33:53,961]^[[0m A new study created in memory with name: no-name-208652b3-68ec-4464-a2ae-5afefa9bf133^[[0m
То же самое происходит с SVR
моделью (вы можете увидеть, как optuna застряла после пробы с номером 84 на 2021-07-23 05:13:40
)
^[[32m[I 2021-07-23 05:13:37,907]^[[0m Trial 83 finished with value: -1.593471166487258 and parameters: {'C': 834.9834466420455, 'epsilon': 99.19181748590665, 'kernel': 'linear', 'norm': 'minmax'}. Best is trial 61 with value: -1.553044709891868.^[[0m
^[[32m[I 2021-07-23 05:13:40,261]^[[0m Trial 84 finished with value: -1.593471166487258 and parameters: {'C': 431.4022584640214, 'epsilon': 2.581688694428477, 'kernel': 'linear', 'norm': 'minmax'}. Best is trial 61 with value: -1.553044709891868.^[[0m
Не могли бы вы сказать мне, почему Optuna застревает и как я могу решить эти проблемы?
Окружающая среда
- Версия Optuna: 2.8.0
- Версия Python: 3.8
- ОС: Linux CentOS 7
- (Необязательно) Другие библиотеки и их версии: Scikit Learn, Pandas и (наиболее распространенные библиотеки)
Воспроизводимые примеры
Код, который я использую для гипернастройки
def tune(objective):
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=200, n_jobs=40)
params = study.best_params
return params
def knn_objective(X_train: DataFrame, y_train: DataFrame, cv_method: kfolds) -> Callable[[Trial], float]:
def objective(trial: Trial) -> float:
args: Dict = dict(
n_neighbors=trial.suggest_int("n_neighbors", 2, 40, 1),
weights=trial.suggest_categorical("weights", ["uniform", "distance"]),
metric=trial.suggest_categorical("metric", ["euclidean", "manhattan", "mahalanobis"]),
)
estimator = KNeighborsRegressor(**args)
scores = cross_validate(
estimator, X=X_train, y=y_train, scoring="neg_mean_squared_error", cv=cv_method, n_jobs=-1
)
return float(np.mean(scores["test_score"]))
return objective
Комментарии:
1. У меня та же проблема с регрессором XGBoost. Что бы я ни делал, испытания застревают случайным образом. У меня был большой набор данных, поэтому я подумал, что проблема в этом. Затем переключился на поддельный набор данных, содержащий всего 200 строк. В идеале поиск должен завершиться через несколько минут, но он застрял после 3-й пробной версии, и я запускаю это на Colab на GPU
2. @BexT. Очень жалко! Я сделал проблему ( github.com/optuna/optuna/issues/2820 ), но не повезло!
3. Эй, я думаю, проблема в наборе данных и размере пространства поиска. Оказывается, у меня было несколько конфликтующих гиперпараметров и слишком большое пространство для поиска. Вот почему некоторые испытания длились целую вечность. После сокращения пространства поиска до более важных гиперпараметров поиск выполняется быстрее. Другими словами, это не похоже на «он застрял».
Ответ №1:
Не понимаю, в чем проблема. Что ты имеешь в виду, когда говоришь, что Оптуна «застрял»? Не завершаются ли испытания или не происходит ли поиск новых хороших ценностей?
Комментарии:
1. Количество испытаний составляет 200. Вы можете видеть, что после испытаний с 84 номерами приращения не происходит! Он застрял после определенного числа
2. Похоже, проблема с knn, а не с Optuna. Можно было бы попробовать многопоточность, чтобы избежать застревания одного процесса. В противном случае посмотрите на код knn, чтобы понять, почему он замерзает.
3. Я использовал
n_jobs
вcross_validate