Optuna TPESampler и RandomSampler по какой-то причине пробуют одни и те же предлагаемые целочисленные значения (также возможные числа с плавающей запятой и логарифмические формы) для любого параметра более одного раза. Я не мог найти способа, чтобы он не предлагал одни и те же значения снова и снова. Из 100 исследований довольно много всего лишь дубликатов. Количество уникальных предлагаемых значений составляет около 80–90 из 100 испытаний. Если я добавлю больше параметров для настройки, скажем 3, я даже увижу, что все 3 из них получают одинаковые значения несколько раз за 100 испытаний.
Это вот так. 75 для min_data_in_leaf использовалось 3 раза:
[I 2020-11-14 14: 44: 05,320] Пробная версия 8 завершена со значением: 45910.54012028659 и параметрами: {'min_data_in_leaf': 75}. Лучшее - проба 4 со значением: 45805.19030897498.
[I 2020-11-14 14: 44: 07,876] Пробная версия 9 завершена со значением: 45910.54012028659 и параметрами: {'min_data_in_leaf': 75}. Лучшее - проба 4 со значением: 45805.19030897498.
[I 2020-11-14 14: 44: 10,447] Пробная версия 10 завершена со значением: 45831.75933279074 и параметрами: {'min_data_in_leaf': 43}. Лучшее - проба 4 со значением: 45805.19030897498.
[I 2020-11-14 14: 44: 13,502] Испытание 11 завершено со значением: 46125.39810101329 и параметрами: {'min_data_in_leaf': 4}. Лучшее - это проба 4 со значением: 45805.19030897498.
[I 2020-11-14 14: 44: 16,547] Пробная версия 12 завершена со значением: 45910.54012028659 и параметрами: {'min_data_in_leaf': 75}. Лучшее - это проба 4 со значением: 45805.19030897498.
Пример кода ниже:
def lgb_optuna(trial):
rmse = []
params = {
"seed": 42,
"objective": "regression",
"metric": "rmse",
"verbosity": -1,
"boosting": "gbdt",
"num_iterations": 1000,
'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 1, 100)
}
cv = StratifiedKFold(n_splits=5, random_state=42, shuffle=False)
for train_index, test_index in cv.split(tfd_train, tfd_train[:,-1]):
X_train, X_test = tfd_train[train_index], tfd_train[test_index]
y_train = X_train[:,-2].copy()
y_test = X_test[:,-2].copy()
dtrain = lgb.Dataset(X_train[:,:-2], label=y_train)
dtest = lgb.Dataset(X_test[:,:-2], label=y_test)
booster_gbm = lgb.train(params, dtrain, valid_sets=dtest, verbose_eval=False)
y_predictions = booster_gbm.predict(X_test[:,:-2])
final_mse = mean_squared_error(y_test, y_predictions)
final_rmse = np.sqrt(final_mse)
rmse.append(final_rmse)
return np.mean(rmse)
study = optuna.create_study(sampler=TPESampler(seed=42), direction='minimize')
study.optimize(lgb_optuna, n_trials=100)