使用Optuna调优LightGBM分类器时遭遇All estimators failed to fit错误求助
使用Optuna调优LightGBM分类器时遭遇All estimators failed to fit错误求助
我目前正在参与Kaggle的「Bank Scoring Case」竞赛,想通过Optuna结合自定义评分函数来调优LightGBM分类器的超参数,以此降低假阴性样本的数量。但每次运行Optuna调参代码时,都会抛出NotFittedError: All estimators failed to fit错误,我实在找不到问题所在,希望能得到大家的帮助!
我的代码如下:
import optuna from optuna.distributions import IntDistribution as IntUniDist from optuna.distributions import UniformDistribution as UniDist from optuna.distributions import LogUniformDistribution as LogUniDist from optuna.distributions import CategoricalDistribution as CatDist from lightgbm import LGBMClassifier from sklearn.pipeline import Pipeline from optuna.distributions import FloatDistribution as fl LogUniDist(1e-5, 1e0).to_internal_repr(1e-4) param_distributions = { 'clf__n_estimators': fl(10, 2000), 'clf__num_leaves': fl(10, 100), 'clf__reg_alpha': fl(1e-5, 1e0), 'clf__reg_lambda': fl(1e-3, 1e0), 'clf__learning_rate': fl(0.01,0.1), 'clf__max_depth': fl(-1,20), } model=LGBMClassifier(random_state=8)#,class_weight='balanced' model_optuna=Pipeline(steps=[#('prepro',preprocessor_ord), ('clf',model)]) from sklearn.metrics import confusion_matrix from sklearn.metrics import fbeta_score, make_scorer def customScore(y_test, y_pred): #beta a choisir entre 0 et 1 on prend 0.7 beta=0.7 #le poids beta qui donnera plus de poids au FN #et 1-beta moins de poids au FP logi_confusion = confusion_matrix(y_test, y_pred) tn, fp, fn, tp = logi_confusion.ravel() alpha=10*fn+fp return alpha #scorer = make_scorer(customScore ,greater_is_better = False) #création de notre propre score grace à make_scorer opt_search_hp = optuna.integration.OptunaSearchCV( model_optuna, param_distributions, n_trials=None, verbose=3, refit=True, timeout=1800, scoring= make_scorer(metric_custom_perte,needs_proba=True), cv=4, return_train_score=False ) opt_search_hp.fit(x_train,y_train)
报错信息:
[I 2023-02-20 16:17:29,106] A new study created in memory with name: no-name-55879412-2d54-486c-af2b-3c4d74911d05 [I 2023-02-20 16:17:29,108] Searching the best hyperparameters using 128290 samples... [W 2023-02-20 16:17:33,370] Trial 0 failed with parameters: {'clf__n_estimators': 1152.9940273025156, 'clf__num_leaves': 78.72037192055771, 'clf__reg_alpha': 0.16664156644372716, 'clf__reg_lambda': 0.7704390387651396, 'clf__learning_rate': 0.0994775554864861, 'clf__max_depth': 2.3794054350476657} because of the following error: NotFittedError('All estimators failed to fit'). Traceback (most recent call last): File "/opt/anaconda3/lib/python3.7/site-packages/optuna/study/_optimize.py", line 200, in _run_trial value_or_values = func(trial) File "/opt/anaconda3/lib/python3.7/site-packages/optuna/integration/sklearn.py", line 239, in __call__ scoring=self.scoring, File "/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 292, in cross_validate _insert_error_scores(results, error_score) File "/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 331, in _insert_error_scores raise NotFittedError("All estimators failed to fit") sklearn.exceptions.NotFittedError: All estimators failed to fit [W 2023-02-20 16:17:33,376] Trial 0 failed with value None. --------------------------------------------------------------------------- NotFittedError Traceback (most recent call last) <ipython-input-113-2e14a5b0857d> in <module> ----> 1 opt_search_hp.fit(x_train,y_train) /opt/anaconda3/lib/python3.7/site-packages/optuna/integration/sklearn.py in fit(self, X, y, groups, **fit_params) 903 n_trials=self.n_trials, 904 timeout=self.timeout, --> 905 callbacks=self.callbacks, 906 ) 907 /opt/anaconda3/lib/python3.7/site-packages/optuna/study/study.py in optimize(self, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, show_progress_bar) 432 callbacks=callbacks, 433 gc_after_trial=gc_after_trial, --> 434 show_progress_bar=show_progress_bar, 435 ) 436 /opt/anaconda3/lib/python3.7/site-packages/optuna/study/_optimize.py in _optimize(study, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, reseed_sampler_rng, time_start, progress_bar) 74 reseed_sampler_rng=False, 75 time_start=None, --> 76 progress_bar=progress_bar, 77 ) 78 else: /opt/anaconda3/lib/python3.7/site-packages/optuna/study/_optimize.py in _optimize_sequential(study, func, n_trials, timeout, catch, callbacks, gc_after_trial, reseed_sampler_rng, time_start, progress_bar) 161 162 try: --> 163 frozen_trial = _run_trial(study, func, catch) 164 finally: 165 # The following line mitigates memory problems that can be occurred in some /opt/anaconda3/lib/python3.7/site-packages/optuna/study/_optimize.py in _run_trial(study, func, catch) 249 and not isinstance(func_err, catch) 250 ): --> 251 raise func_err 252 return frozen_trial 253 /opt/anaconda3/lib/python3.7/site-packages/optuna/study/_optimize.py in _run_trial(study, func, catch) 198 with get_heartbeat_thread(trial._trial_id, study._storage): 199 try: --> 200 value_or_values = func(trial) 201 except exceptions.TrialPruned as e: 202 # TODO(mamu): Handle multi-objective cases. /opt/anaconda3/lib/python3.7/site-packages/optuna/integration/sklearn.py in __call__(self, trial) 237 groups=self.groups, 238 return_train_score=self.return_train_score, --> 239 scoring=self.scoring, 240 ) 241 /opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py in cross_validate(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score, return_estimator, error_score) 290 # the correct key. 291 if callable(scoring): --> 292 _insert_error_scores(results, error_score) 293 294 results = _aggregate_score_dicts(results) /opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py in _insert_error_scores(results, error_score) 329 330 if successful_score is None: --> 331 raise NotFittedError("All estimators failed to fit") 332 333 if isinstance(successful_score, dict):
我自己初步排查的方向(也希望大家补充):
- 超参数类型不匹配:LightGBM的
n_estimators、num_leaves、max_depth都是要求整数类型的参数,但我用了FloatDistribution来定义范围,Optuna会采样出浮点数传给模型,这应该会导致模型初始化失败。比如报错里的clf__n_estimators: 1152.99就是浮点数,而LGBM需要整数。 - 自定义评分函数的矛盾:代码里用了
make_scorer(metric_custom_perte,needs_proba=True),但我实际定义的评分函数是customScore,而且metric_custom_perte根本没定义,这明显是拼写错误;另外needs_proba=True意味着评分函数要接收预测概率,但我的customScore是基于类别预测的混淆矩阵计算的,这两者冲突,会导致评分计算失败,进而让模型拟合终止。 - 数据与预处理问题:我暂时注释掉了Pipeline里的预处理步骤,会不会是x_train里的特征没有做必要的编码(比如类别特征还是字符串)?或者数据里有异常值、缺失值导致模型无法拟合?我打算先单独训练一个简单的LGBM模型,看看能不能正常跑起来,排除数据本身的问题。
备注:内容来源于stack exchange,提问作者Jacqueline Alexandre
相关产品推荐
相关产品推荐

