新闻中心
使用Snowflake进行模型推理:解决编码器加载后的“isnan”错误

本文档旨在解决在Snowflake中使用已保存的编码器进行模型推理时遇到的 "ufunc 'isnan' not supported" 错误。我们将深入探讨问题的原因,并提供一种可行的解决方案,包括代码示例和关键步骤,以确保成功地将编码器和模型部署到Snowflake并进行推理。
问题分析
在Snowflake中部署机器学习模型时,一个常见的挑战是如何正确地保存和加载预处理步骤,例如One-Hot Encoding和Ordinal Encoding。当模型和编码器被保存到Snowflake并尝试在UDF(用户定义函数)中使用时,可能会遇到 "ufunc 'isnan' not supported" 错误。
这个错误通常表明在编码器的转换过程中,输入数据包含了编码器在训练时未遇到的值,或者数据类型不匹配,导致isnan函数无法处理。具体来说,问题可能源于以下几个方面:
- 数据类型不一致: UDF中接收的数据类型与模型训练时使用的数据类型不一致。
- 缺失值处理不当: 编码器在训练时没有正确处理缺失值,导致在推理时遇到缺失值时出错。
- 未知值处理: 推理数据中包含编码器在训练时未遇到的类别,且编码器没有正确配置handle_unknown参数。
- API调用错误: 混淆了Snowpark API和scikit-learn API的使用,导致数据转换方式不正确。
解决方案
以下步骤提供了一种解决该问题的完整方案:
1. 编码器和模型的保存
首先,确保使用joblib库正确地保存编码器和模型。以下代码展示了如何将OneHotEncoder、OrdinalEncoder和XGBoost模型保存到Snowflake的stage中:
from joblib import dump
def s*e_object(object_,filename,stagename,auto_compress=True):
dump(object_, filename)
session.file.put(filename, stagename, overwrite=True,auto_compress=auto_compress)
return
# Extract model object
xgb_model = xgb.to_xgboost()
ohe_obj = ohe.to_sklearn()
oe_obj = oe.to_sklearn()
s*e_object(xgb_model,'xgb_model.joblib','@AM_TEST_MODELS')
s*e_object(ohe_obj,'one_hot_encode.joblib','@AM_TEST_MODELS',auto_compress=False)
s*e_object(oe_obj,'ordinal_encode.joblib','@AM_TEST_MODELS',auto_compress=False)注意:
- auto_compress=False 可以避免压缩编码器文件,有时可以解决加载问题。
- 使用@AM_TEST_MODELS作为stage名称,请根据实际情况修改。
2. UDF的创建和配置
创建UDF时,需要注意以下几点:
- 导入必要的库: 在UDF中导入pandas、joblib、sklearn和xgboost等库。
- 加载编码器和模型: 使用joblib.load从Snowflake的import directory加载编码器和模型。
- 数据类型转换: 确保UDF中接收的数据类型与模型训练时使用的数据类型一致。
- 错误处理: 添加适当的错误处理机制,以便在出现问题时能够及时发现和解决。
以下是一个UDF的示例代码:
Pippit AI
CapCut推出的AI创意内容生成工具
133
查看详情
import cachetools
@cachetools.cached(cache={})
def read_file(filename):
import sys
import os
import joblib
# Get the "path" of where files added through iport are *alible
import_dir = sys._xoptions.get("snowflake_import_directory")
if import_dir:
with open(os.path.join(import_dir, filename), 'rb') as file:
m = joblib.load(file)
return m
@F.udf(
name='predict_package_mix_p',session=session,replace=True,
is_permanent=True,stage_location='@AM_TEST_UDFS',
)
def predict_package_mix_p(
df:PandasDataFrame[int,str,str,str,str,str,int]
) -> PandasSeries[float]:
import sys
import pandas as pd
from joblib import load
import sklearn
import xgboost as xgb
import json
import snowflake.ml.modeling
def transform_simple_target_encode_manual(
df,transform_col,transform_df
):
df = df.merge(transform_df, on=transform_col)
return df
def remove_space(df):
cols = df.columns
space_cols = [x for x in cols if ' ' in x]
for c in space_cols:
new_col = c.replace(" ","_")
df = df.rename(columns={c:new_col})
return df
IMPORT_DIRECTORY_NAME = "snowflake_import_directory"
import_dir = sys._xoptions[IMPORT_DIRECTORY_NAME]
ohe = read_file('one_hot_encode.pkl')
oe = read_file('ordinal_encode.pkl')
te = pd.read_csv(import_dir + 'target_encoding.csv.gz')
model = read_file('xgb_model.pkl.gz')
print('loaded models')
features = [
"LS1_FLIGHT_ID","DEPARTURE_AIRPORT_CODE","ARRIVAL_AIRPORT_CODE",
"ROUTE_CATEGORY_NAME","DEPARTURE_DATETIME_LOCAL",
"ARRIVAL_DATETIME_LOCAL","CAPACITY"
]
df.columns = features
print('loaded dataframe')
# transform data for one hot and ordinal encodings
df_ohe = ohe.transform(df[['ROUTE_CATEGORY_NAME']])
encoded_df = pd.DataFrame(df_ohe, columns=ohe.categories_)
encoded_df.columns = encoded_df.columns.get_level_values(0)
encoded_df = encoded_df.add_prefix('ROUTE_NAME_OHE_')
df = pd.concat([df, encoded_df], axis=1)
df['DEPART_CODE_ENCODE'] = oe.transform(df[['DEPARTURE_AIRPORT_CODE']])
print('transformed via one hot and ordinal')
# transform using pre-set target encoding
df_te = transform_simple_target_encode_manual(df,'ARRIVAL_AIRPORT_CODE',te)
df_final = remove_space(df_te)
print('transformed via target encode')
# change date cols to datetime
df_final.loc[:,'DEPARTURE_DATETIME_LOCAL'] = pd.to_datetime(
df_final.loc[:,'DEPARTURE_DATETIME_LOCAL'],format='%Y-%m-%d %H:%M:%S',yearfirst=True
)
df_final['ARRIVAL_DATETIME_LOCAL'] = pd.to_datetime(
df_final['ARRIVAL_DATETIME_LOCAL'],format='%Y-%m-%d %H:%M:%S',yearfirst=True
)
print('transformed dates')
df_fina
l['DEPART_HOUR'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.hour
# snowpark function goes from 1-7 whereas pandas goes from 0-6
df_final['DEPART_WEEKDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day_of_week + 1
df_final['DEPART_MONTHDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day
df_final['DEPART_YEARDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day_of_year
df_final['DEPART_MONTH'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.month
df_final['DEPART_YEAR'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.year
df_final['ARRIVE_HOUR'] = df_final['ARRIVAL_DATETIME_LOCAL'].dt.hour
print('created features')
pm = pd.Series(model.predict(df_final[
["DEPART_CODE_ENCODE","ROUTE_NAME_OHE_CITY","ROUTE_NAME_OHE_FAR_SUN",
"ROUTE_NAME_OHE_SKI","ROUTE_NAME_OHE_SUN","CAPACITY",
"ARRIVAL_AIRPORT_CODE_ENCODED","DEPART_HOUR",
"DEPART_WEEKDAY","DEPART_MONTHDAY","DEPART_YEARDAY",
"DEPART_MONTH","DEPART_YEAR","ARRIVE_HOUR"]
]))
return pm关键点:
- @cachetools.cached装饰器: 使用cachetools库的@cached装饰器可以缓存加载的编码器和模型,避免每次调用UDF时都重新加载,提高性能。
- sys._xoptions: 使用sys._xoptions获取import directory,确保可以正确加载Snowflake stage中的文件。
- API调用: 确保在UDF中使用的是scikit-learn API(例如ohe.transform(df[['ROUTE_CATEGORY_NAME']])),而不是Snowpark API。
- 列名转换: 注意Snowflake会将列名转换为大写,因此在UDF中需要使用大写列名。
- 数据预处理: 在UDF中完成所有必要的数据预处理步骤,包括One-Hot Encoding、Ordinal Encoding和日期时间特征提取。
3. 推理
创建UDF后,可以使用Snowpark DataFrame调用UDF进行推理:
test_df = session.create_dataframe(
[[979152,"LBA","ALC","SUN","2025-11-24 08:30:00","2025-11-24 12:25:00",189],
[987073,"LBA","FAO","SUN","2025-12-13 16:15:00","2025-12-13 11:25:00",189],
[951384,"STN","FNC","FAR SUN","2025-12-05 09:40:00","2025-12-05 13:35:00",189],
[952380,"MAN","LPA","FAR SUN","2025-12-22 19:45:00","2025-12-22 14:30:00",235],
[963602,"MAN","FUE","FAR SUN","2025-12-29 10:30:00","2025-12-29 15:05:00",235]],
schema=[
"LS1_FLIGHT_ID","DEPARTURE_AIRPORT_CODE","ARRIVAL_AIRPORT_CODE",
"ROUTE_CATEGORY_NAME","DEPARTURE_DATETIME_LOCAL","ARRIVAL_DATETIME_LOCAL","CAPACITY"
]
)
test_df.withColumn(
'PREDICTED_PACKAGE_MIX',
predict_package_mix_p([*test_df])).show()注意:
- session.add_import 用于添加UDF所需的依赖文件。
- session.add_packages 用于添加UDF所需的Python包。
- 确保添加所有必需的依赖项,否则UDF可能会失败。
总结
通过遵循以上步骤,可以解决在Snowflake中使用已保存的编码器进行模型推理时遇到的 "ufunc 'isnan' not supported" 错误。关键在于正确地保存和加载编码器和模型,并在UDF中进行必要的数据预处理和类型转换。此外,使用cachetools库可以提高UDF的性能。
注意事项:
- 确保本地环境和Snowflake环境的Python包版本一致。
- 在部署UDF之前,务必进行充分的测试,以确保其正常工作。
- 监控UDF的性能,并根据需要进行优化。
希望本文档能够帮助您成功地在Snowflake中部署机器学习模型并进行推理。
以上就是使用Snowflake进行模型推理:解决编码器加载后的“isnan”错误的详细内容,更多请关注其它相关文章!
# 重写
# 鱼峰区关键词seo排名优化
# 网站内部细节优化的方法
# 浙江苏州网站建设
# 鹤壁为什么要做搜索关键词排名
# 网站推广建设方案设计
# 石嘴山湖南网站建设
# 网站怎么收录关键词排名
# 自媒体广告营销推广
# 周口网站优化公司
# 数码网站怎么建设
# 文档
# 是一个
# 的是
# 如何实现
# 解决方法
# python
# 自定义
# 所需
# 正确地
# 加载
# red
# python包
# api调用
# ai
# csv
# session
# 编码
# go
# json
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
将HTML Canvas内容转换为可上传的图像文件(File对象)
必由学官方网站入口 必由学学生教师共用登录通道
AI泡沫首次被“刺破”:GPU十年都无法存活!
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
excel怎么制作工资条 excel快速生成工资条的方法
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
解决Flask中Quill编辑器内容提交失败及TypeError的指南
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
PHP 枚举:根据字符串获取枚举案例的策略与实现
steam官方网页快速访问 steam账号注册全流程
DLsite中文平台入口 DLsite官网内容在线查看
c++ 获取系统当前时间 c++时间戳获取方法
外媒分析《GTA6》定价:卖100美元可以但真没必要!
汽车之家官方网站官网入口_汽车之家网页版直接进入
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
jQuery Mask 插件中实现电话号码固定前导零的教程
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
处理嵌套交互式控件:前端可访问性指南
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
海棠电脑版入口_通过电脑访问海棠官网阅读
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
Golang如何使用new_Go new分配内存机制讲解
黑猫投诉统一入口官网 消费者权益保护投诉平台
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
理解Python模块与全局变量的作用域管理
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
mc.js游戏直达 mc.js网页免下载版本秒进地址
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
4399网页游戏电脑版全新入口 4399电脑端在线玩指南


2025-11-04
浏览次数:次
返回列表
l['DEPART_HOUR'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.hour
# snowpark function goes from 1-7 whereas pandas goes from 0-6
df_final['DEPART_WEEKDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day_of_week + 1
df_final['DEPART_MONTHDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day
df_final['DEPART_YEARDAY'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.day_of_year
df_final['DEPART_MONTH'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.month
df_final['DEPART_YEAR'] = df_final['DEPARTURE_DATETIME_LOCAL'].dt.year
df_final['ARRIVE_HOUR'] = df_final['ARRIVAL_DATETIME_LOCAL'].dt.hour
print('created features')
pm = pd.Series(model.predict(df_final[
["DEPART_CODE_ENCODE","ROUTE_NAME_OHE_CITY","ROUTE_NAME_OHE_FAR_SUN",
"ROUTE_NAME_OHE_SKI","ROUTE_NAME_OHE_SUN","CAPACITY",
"ARRIVAL_AIRPORT_CODE_ENCODED","DEPART_HOUR",
"DEPART_WEEKDAY","DEPART_MONTHDAY","DEPART_YEARDAY",
"DEPART_MONTH","DEPART_YEAR","ARRIVE_HOUR"]
]))
return pm