如何修复Xgboost中Pass `evals` as keyword args的FutureWarning
触发警告的根本原因
这个警告和你定义的模型超参数(包括你之前怀疑的eval_metric)完全无关,触发源是你调用XGBoost训练接口时,evals(验证集)参数的传参方式不符合新版本要求。
从XGBoost 1.3版本开始,训练接口不再支持evals参数按位置顺序传入,必须显式作为关键字参数传递。你之前写训练代码时,大概率是直接把验证集列表按参数位置传到了训练函数里,没有加evals=的关键字前缀,就会弹出这个警告。
比如你之前的代码大概率是这种写法:
# 会触发警告的错误写法 xgb.train(params, dtrain, num_boost_round=100, [(dtrain, 'train'), (dtest, 'test')])
上面代码最后传入的验证集元组列表,就是evals对应的参数,因为没写evals=关键字,属于位置传参,就会触发警告。
修复方法
你不需要修改任何已经定义好的模型超参数,只需要调整训练函数的传参写法,给验证集参数显式加上evals=关键字声明即可:
# 适配未来版本的正确写法,无警告 xgb.train( params=params, dtrain=dtrain, num_boost_round=100, evals=[(dtrain, 'train'), (dtest, 'test')] # 显式声明evals关键字参数 )
如果你用的是XGBoost的Scikit-Learn风格接口(XGBClassifier/XGBRegressor),调用fit()方法传入验证集时也要注意,这个接口里的验证集参数名是eval_set,同样不能位置传参,要显式写关键字:
# Sklearn接口错误写法 model.fit(X_train, y_train, [(X_val, y_val)]) # Sklearn接口正确写法 model.fit(X_train, y_train, eval_set=[(X_val, y_val)])
补充说明
你之前调整eval_metric参数没效果是正常的,这个参数是定义评估指标的模型超参,属于params字典里的合法配置项,和传参方式类的警告没有任何关联,不需要改动。
内容的提问来源于stack exchange,提问作者Tam
相关产品推荐
相关产品推荐

