0

我正在尝试使用 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'}
)

错误信息:

错误

4

1 回答 1

0

如果您使用的是 skopt 版本 0.8.1 和 scikit-learn >= 0.24 版本,那么这两个库之间存在一些不兼容。

  1. sklearn 不再使用 iid 参数。可能的解决方法是编辑 searchcv.py 以在 BayesSearchCV 中添加一个新iid成员变量,初始化它的值,并且不要将它传递给基类构造函数。例如
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 期望 Parallel 到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解决了一些兼容性问题)或降级到旧版本的 sklearn。对此的讨论可以看这里

于 2021-08-26T00:37:15.857 回答