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

AWS SageMaker Canvas模型部署边缘设备(Python)数据处理问题求助

解决SageMaker Canvas导出XGBoost模型本地调用问题

问题根源

SageMaker Canvas训练XGBoost模型时会自动执行一系列预处理逻辑(时间特征提取、类别特征编码、缺失值填充、特征顺序对齐等),本地直接调用模型时如果不复现这些步骤,就会出现数据类型错误或预测结果偏差。


分步解决方案

1. 修复数据类型错误

报错提示dt(时间字符串)和thingname(字符串类别)不符合DMatrix要求的类型,需先做如下处理:

处理时间特征dt

Canvas不会直接使用原始时间字符串,而是自动提取时间分量,本地需复现这一步:

import pandas as pd
import numpy as np

df = pd.read_csv('solar-prediction-data.csv')
# 转换为datetime类型
df['dt'] = pd.to_datetime(df['dt'])
# 提取核心时间特征(Canvas默认会提取这些)
df['year'] = df['dt'].dt.year
df['month'] = df['dt'].dt.month
df['day'] = df['dt'].dt.day
df['hour'] = df['dt'].dt.hour
df['weekday'] = df['dt'].dt.weekday  # 0=周一,6=周日
# 对周期性特征做正弦余弦编码(适配模型对周期性的识别)
df['hour_sin'] = np.sin(2 * np.pi * df['hour'] / 24)
df['hour_cos'] = np.cos(2 * np.pi * df['hour'] / 24)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)
# 删除原始时间字段
df = df.drop('dt', axis=1)

处理类别特征thingname

将字符串类型转为pandas的category类型,同时开启DMatrix的类别特征支持:

df['thingname'] = df['thingname'].astype('category')

2. 对齐Canvas的预处理逻辑(解决预测结果偏差)

步骤1:对齐特征顺序

XGBoost对特征顺序高度敏感,必须和Canvas训练时的特征顺序完全一致。你可以在Canvas的模型训练页面查看特征列表,或者用Canvas中预测过的样本反推顺序。例如训练时的特征顺序为:thingname, clouds, temp, year, month, day, hour, weekday, hour_sin, hour_cos, month_sin, month_cos,则需调整DataFrame的列顺序:

# 替换为你实际的特征顺序
required_cols = ['thingname', 'clouds', 'temp', 'year', 'month', 'day', 'hour', 'weekday', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos']
df = df[required_cols]

步骤2:处理缺失值

Canvas默认用中位数填充数值特征缺失值,用众数填充类别特征缺失值,本地需复现:

# 数值特征填充中位数
num_cols = ['clouds', 'temp', 'year', 'month', 'day', 'hour', 'weekday', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos']
for col in num_cols:
    df[col] = df[col].fillna(df[col].median())

# 类别特征填充众数
df['thingname'] = df['thingname'].fillna(df['thingname'].mode()[0])

步骤3:正确加载模型并预测

import xgboost as xgb

# 创建DMatrix并启用类别特征支持
dpredict = xgb.DMatrix(df, enable_categorical=True)

# 加载模型
model = xgb.Booster()
model.load_model('xgboost-model')

# 执行预测
result = model.predict(dpredict)
print('Prediction result::')
print(result)

3. 验证与调试

  • 拿Canvas中已预测过的样本,用本地代码处理后对比结果,逐步调整预处理步骤。
  • 确保本地XGBoost版本(1.6.2)与Canvas训练时的版本完全一致。

内容的提问来源于stack exchange,提问作者Hans Cornelis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:20:58