如何在AWS SageMaker HyperparameterTuner中配置自定义指标(如ndcg@n)
问题
尝试在SageMaker的HyperparameterTuner超参数调优任务中使用ndcg@n作为优化目标。在独立训练任务中可以将其设为eval_metric并在日志中查看,但用于超参数调优时遇到以下问题:
- 直接设置
objective_metric_name="ndcg@5"时,收到报错:
超参数调优任务的目标指标[ndcg@5]对[xgboost]算法无效,请选择有效的目标指标。
- 尝试在
metrics_definition中添加配置metric_definitions = [{'Name': 'validation:ndcg@5','Regex': 'ndcg@5:(\\S+)'}]时,收到报错:
调用CreateHyperParameterTuningJob操作时发生错误(ValidationException):无法覆盖Amazon SageMaker算法的指标定义,请移除指标定义后重试请求。
- 创建自定义指标(可在日志中查看)时,仍遇到上述两个矛盾错误:添加指标定义被要求移除,移除后又提示指标无效。
此外,不仅HyperparameterTuner,普通(非HyperparameterTuner)训练任务中也无法添加自定义指标,连精确率、召回率这类通用指标也无法使用。需要解决的问题是:如何在SageMaker的HyperparameterTuner中添加自定义指标?
解决方法
针对SageMaker内置算法(如XGBoost)
内置算法的指标定义是平台预固定的,无法通过metrics_definition修改。如果要使用ndcg@5这类未被内置调优指标覆盖的指标,需按以下操作:
- 在训练任务的
eval_metric参数中指定ndcg@5,确保训练日志中会输出该指标的数值。 - 核对SageMaker内置算法的预定义指标列表,确认是否有对应的指标名(部分版本的内置XGBoost可能将
ndcg@5映射为validation:ndcg,需根据实际日志输出调整)。 - 若内置指标列表中无对应项,只能切换到自定义训练脚本的方式。
自定义训练脚本(推荐方案)
通过自定义训练脚本可以完全控制指标的输出和定义,步骤如下:
- 编写训练脚本,在训练过程中计算
ndcg@5、精确率、召回率等自定义指标,并按照SageMaker要求的格式输出到日志,示例代码:
输出格式要清晰,确保后续正则表达式能准确匹配指标数值。# 计算得到ndcg_score后输出 print(f"validation:ndcg@5={ndcg_score}") - 创建
Estimator时,指定自定义的metric_definitions,示例:metric_definitions = [ {'Name': 'validation:ndcg@5', 'Regex': 'validation:ndcg@5=(\\S+)'} ] estimator = Estimator( entry_point='train.py', # 其他参数如实例类型、框架版本等 metric_definitions=metric_definitions ) - 创建
HyperparameterTuner时,直接将objective_metric_name设置为你定义的指标名(如"validation:ndcg@5"),此时不会触发覆盖内置指标的错误,因为这是自定义训练任务。
普通训练任务添加自定义指标的解决方式
普通训练任务若使用内置算法,同样无法自定义metric_definitions,只能用平台预定义指标。如需自定义指标,必须使用自定义训练脚本,按照上述步骤配置metric_definitions并在日志中输出对应格式的指标数值,SageMaker控制台就能识别并展示这些自定义指标。
内容的提问来源于stack exchange,提问作者Luis Leal
相关产品推荐
相关产品推荐

