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
相关产品推荐
相关产品推荐

