You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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规范的评估函数,在训练时传入即可:

  1. 首先定义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)
  1. 在训练调用时传入自定义函数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:24:02