如何解决Python:LightGBM 超参数调整值错误
我编写了以下代码来在 LightGBM 分类器模型上执行 RandomizedSearchCV
,但出现以下错误。
ValueError: For early stopping,at least one dataset and eval metric is required for evaluation
代码
import lightgbm as lgb
fit_params={"early_stopping_rounds":30,"eval_metric" : 'f1',"eval_set" : [(X_val,y_val)],'eval_names': ['valid'],'verbose': 100,# 'categorical_feature': 'auto'
}
from scipy.stats import randint as sp_randint
from scipy.stats import uniform as sp_uniform
param_test ={'num_leaves': sp_randint(6,50),'min_child_samples': sp_randint(100,500),'min_child_weight': [1e-5,1e-3,1e-2,1e-1,1,1e1,1e2,1e3,1e4],'subsample': sp_uniform(loc=0.2,scale=0.8),'colsample_bytree': sp_uniform(loc=0.4,scale=0.6),'reg_alpha': [0,2,5,7,10,50,100],'reg_lambda': [0,20,100]}
n_HP_points_to_test = 100
from sklearn.model_selection import RandomizedSearchCV
#n_estimators is set to a "large value". The actual number of trees build will depend on early stopping and 5000 define only the absolute maximum
clf = lgb.LGBMClassifier(max_depth=-1,random_state=42,silent=True,metric='f1',n_jobs=4,n_estimators=5000,)
gs = RandomizedSearchCV(
estimator=clf,param_distributions=param_test,n_iter=n_HP_points_to_test,scoring='f1',cv=3,refit=True,random_state=41,verbose=True)
gs.fit(X_trn,y_trn,**fit_params)
print('Best score reached: {} with params: {} '.format(gs.best_score_,gs.best_params_))
尝试过的解决方案
我尝试实施以下链接中给出的解决方案,但没有一个奏效。如何解决这个问题?
- LightGBM error : ValueError: For early stopping,at least one dataset and eval metric is required for evaluation
- ValueError: For early stopping,at least one dataset and eval metric is required for evaluation #3028
- For early stopping,at least one dataset and eval metric is required for evaluation #1597
解决方法
F1
不在 LightGBM 的内置指标中。您可以轻松添加自定义 eval_metric:
from sklearn.metrics import f1_score
def lightgbm_eval_metric_f1(preds,dtrain):
target = dtrain.get_label()
weight = dtrain.get_weight()
unique_targets = np.unique(target)
if len(unique_targets) > 2:
cols = len(unique_targets)
rows = int(preds.shape[0] / len(unique_targets))
preds = np.reshape(preds,(rows,cols),order="F")
return "f1",f1_score(target,preds,weight),True
关于优化,我更愿意将原生 python API 用于 LightGBM (lightgbm.train
) 和 Optuna
框架,效果非常好。
Optuna 框架:https://github.com/optuna/optuna
但使用 Optuna 调整 LightGBM 的最简单方法是使用 MLJAR AutoML(它内置了 f1
指标)。
automl = AutoML(
mode="Optuna"
algorithms=["LightGBM"],optuna_time_budget=600,# 10 minutes for tuning
eval_metric="f1"
)
automl.fit(X,y)
MLJAR AutoML 框架:https://github.com/mljar/mljar-supervised
如果您想查看 MLJAR 中 LightGBM+Optuna 优化的详细信息,这里是代码 https://github.com/mljar/mljar-supervised/blob/master/supervised/tuner/optuna/lightgbm.py
,您的第三个链接(2020 年 2 月)中的最后一条消息表明,如果无法识别该指标,则会引发此错误,实际上 "f1"
不是 LGBM's builtin metrics 之一。要么使用他们的内置函数之一(但您仍然可以使用 F1 作为超参数搜索的选择标准),或者创建自定义指标(请参阅 LGBMClassifier.fit
method's documentation 末尾的注释)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。