如何设置SageMaker XGBoost的eval_metric参数为F1?
你的理解没有错误。SageMaker AutoPilot计算的F1是训练完成后对预测结果做后处理得到的离线指标,并不是XGBoost框架原生支持的训练过程评估指标,你遇到的报错是原生XGBoost自身限制导致的,其内置的eval_metric参数确实不支持直接传入f1取值。
具体解决方法
方法1:训练完成后离线计算F1
如果不需要在训练过程中监控F1,仅需要最终评估模型的F1表现,保留原生支持的评估指标(二分类场景推荐用logloss或auc作为训练时的eval_metric),训练结束后直接调用工具库计算即可:
from sklearn.metrics import f1_score # 此处pred为模型输出的预测概率数组,y_true为真实标签数组 pred_labels = [1 if p > 0.5 else 0 for p in pred] final_f1 = f1_score(y_true, pred_labels)
方法2:自定义评估函数用于训练过程监控
如果需要在训练迭代过程中查看F1变化,或者用F1作为早停判断标准,可以自定义符合XGBoost规范的评估函数,在训练时传入即可:
- 首先定义F1评估函数
from sklearn.metrics import f1_score def custom_f1_eval(preds, dtrain): y_true = dtrain.get_label() y_pred = [1 if p > 0.5 else 0 for p in preds] f1 = f1_score(y_true, y_pred) # 返回值格式:(指标名称, 指标值, 是否越小越好) return ("f1", f1, False)
- 在训练调用时传入自定义函数
xgb.train( params=hyperparameters, dtrain=dtrain, num_boost_round=100, evals=[(dval, "validation")], # 传入自定义评估函数 feval=custom_f1_eval, verbose_eval=True )
如果使用SageMaker内置XGBoost容器的脚本模式,将上述逻辑写入你的训练脚本即可正常输出训练过程中的F1指标。
方法3:超参数调优时以F1为优化目标
如果是使用SageMaker超参数调优(HPO)功能优化F1,不需要修改训练时的eval_metric,仅需要两步配置:
- 在训练脚本中将计算得到的F1值按固定格式打印到日志,例如
print(f"validation-f1={final_f1}") - 在HPO任务配置中添加自定义指标,通过正则表达式提取日志中的F1值,设置为优化目标即可
内容的提问来源于stack exchange,提问作者kee
相关产品推荐
相关产品推荐

