__init__() получил неожиданный аргумент ключевого слова 'iid'

Я пытаюсь использовать BayesSearchCV, но у меня возникла непредвиденная ошибка. Я не использую параметр iid, но ошибка продолжает повторяться __init__() got an unexpected keyword argument 'iid'. Я поделюсь своим кодом здесь.

Код:

      roc_auc = make_scorer(roc_auc_score, greater_is_better=True, needs_threshold=True)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=1234)

clf = CatBoostClassifier(thread_count=2,
                         loss_function='Logloss',
                        
                         od_type = 'Iter',
                         verbose= False
                        )

# Defining your search space
search_spaces = {'iterations': Integer(10, 1000),
                 'depth': Integer(1, 8),
                 'learning_rate': Real(0.01, 1.0, 'log-uniform'),
                 'random_strength': Real(1e-9, 10, 'log-uniform'),
                 'bagging_temperature': Real(0.0, 1.0),
                 'border_count': Integer(1, 255),
                 'l2_leaf_reg': Integer(2, 30),
                 'scale_pos_weight':Real(0.01, 1.0, 'uniform')}

# Setting up BayesSearchCV
opt = BayesSearchCV(clf,
                    search_spaces,
                    scoring=roc_auc,
                    cv=skf,
                    n_iter=100,
                    n_jobs=1,  # use just 1 job with CatBoost in order to avoid segmentation fault
                    return_train_score=False,
                    refit=True,
                    optimizer_kwargs={'base_estimator': 'GP'}
)

Сообщение об ошибке:

1 ответ

Если вы используете skopt версии 0.8.1 и версию scikit-learn>= 0.24, то между этими двумя библиотеками есть некоторая несовместимость.

  1. sklearn больше не использует параметр iid. Возможное исправление - отредактировать searchcv.py, чтобы добавить новый iidпеременную-член в BayesSearchCV, инициализируйте ее значение и не передавайте его в конструктор базового класса. например
          self.iid = iid
    
    super(BayesSearchCV, self).__init__(
         estimator=estimator, scoring=scoring,
         n_jobs=n_jobs, refit=refit, cv=cv, verbose=verbose,
         pre_dispatch=pre_dispatch, error_score=error_score,
         return_train_score=return_train_score)
  1. BayesSearchCV._fit ожидает параллельно с outпять элементов, которые являются списками, но теперь он перевернут - он возвращает список словарных статей. Заменить

            (test_scores, test_sample_counts,
     fit_time, score_time, parameters) = zip(*out)
    

с участием

          test_scores = [d['test_scores'] for d in out]
    test_sample_counts = [d['n_test_samples'] for d in out]
    fit_time = [d['fit_time'] for d in out]
    score_time = [d['score_time'] for d in out]
    parameters = [d['parameters'] for d in out]

Другие варианты включают использование более новой версии skopt (например, 0.9.dev0 работает над исправлением этих проблем) или переход на более старую версию sklearn. Обсуждение этого можно посмотреть здесь .

Другие вопросы по тегам