如何在XGBoost.cv中同时使用R²与RMSE作为评估指标
XGBoost.cv 同步使用RMSE和R²评估指标的实现方法
XGBoost内置的metrics参数仅支持官方预置的评估指标,要新增R²(决定系数)统计,可通过feval参数传入自定义评估函数实现,不影响原有RMSE指标的计算和早停逻辑。
具体实现步骤
- 编写符合XGBoost接口规范的R²计算函数
import numpy as np from sklearn.metrics import r2_score import xgboost as xgb def r2_eval(preds, dtrain): # 从DMatrix对象中提取真实标签 labels = dtrain.get_label() # 计算R²值 r2_val = r2_score(labels, preds) # 返回格式要求:(指标名, 指标值, 是否值越大模型效果越好) return "r2", r2_val, True
- 修改
xgb.cv调用参数,保留原有RMSE配置,新增自定义指标传入
cv_results = xgb.cv( params, dtrain, num_boost_round=800, seed=42, nfold=5, metrics=['rmse'], # 保留内置RMSE指标计算 feval=r2_eval, # 传入自定义R²评估函数 early_stopping_rounds=10 )
结果说明
- 运行后得到的
cv_resultsDataFrame会同时包含两类指标的统计结果,对应字段为:- 训练集RMSE统计:
train-rmse-mean、train-rmse-std - 验证折RMSE统计:
test-rmse-mean、test-rmse-std - 训练集R²统计:
train-r2-mean、train-r2-std - 验证折R²统计:
test-r2-mean、test-r2-std
- 训练集RMSE统计:
- 默认早停逻辑仍以传入
metrics的第一个指标(即RMSE)为判定依据,如果需要改为按R²触发早停,只需在xgb.cv中新增参数maximize=True即可。 - 如果需要同时传入多个自定义评估指标,可将多个函数放在列表中传给
feval参数,例如feval=[r2_eval, 其他自定义函数]。
注意:自定义评估函数不要写入
metrics列表,该参数仅识别XGBoost内置的指标名称字符串,自定义指标统一通过feval传入。
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

