AWS SageMaker调用Endpoint报错:无法将字符串转换为float类型问题排查
问题解决方法
直接报错原因
你当前的请求载荷中包含了CSV表头行,第一行的值为Year这类字符串,XGBoost推理容器默认会将所有输入解析为浮点型数值,因此触发转换失败报错。
根本原因
SageMaker内置XGBoost的算法模式推理容器,原生不支持直接传入字符串类型的分类特征,要求所有输入特征必须提前转换为数值类型。
具体修复步骤
- 移除请求载荷中的CSV表头,保证载荷仅包含特征值行,不要保留列名行
- 所有分类特征提前做数值编码:训练阶段就用LabelEncoder、独热编码等方式将
Area这类字符串分类特征转换为数值,推理阶段用训练时拟合好的编码器对输入的分类值做相同转换,不要直接传入字符串到端点 - 保证推理输入的特征顺序和训练数据集的特征顺序完全一致,内置容器不会自动对齐列名,只会按传入顺序解析特征
- 简化载荷构造逻辑,避免多余格式问题:
# 第一步:先对分类特征做编码,area_encoder是训练阶段拟合好的编码器 df['Area'] = area_encoder.transform(df['Area']) # 第二步:直接生成不带表头、不带索引的csv格式载荷 payload = df.to_csv(header=False, index=False).strip() # 调用端点 response = runtime_client.invoke_endpoint( EndpointName=endpoint_name, ContentType="text/csv", Body=payload )
如果需要直接传入带字符串特征的请求,可以将部署方式改为XGBoost自定义脚本模式,自己在推理的input_fn函数中实现字符串特征的编码逻辑,再喂给模型做预测。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

