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


使用snowflake进行模型推理:解决编码器加载后的“isnan”错误

本文档旨在解决在Snowflake中使用已保存的编码器进行模型推理时遇到的 "ufunc 'isnan' not supported" 错误。我们将深入探讨问题的原因,并提供一种可行的解决方案,包括代码示例和关键步骤,以确保成功地将编码器和模型部署到Snowflake并进行推理。

问题分析

在Snowflake中部署机器学习模型时,一个常见的挑战是如何正确地保存和加载预处理步骤,例如One-Hot Encoding和Ordinal Encoding。当模型和编码器被保存到Snowflake并尝试在UDF(用户定义函数)中使用时,可能会遇到 "ufunc 'isnan' not supported" 错误。

这个错误通常表明在编码器的转换过程中,输入数据包含了编码器在训练时未遇到的值,或者数据类型不匹配,导致isnan函数无法处理。具体来说,问题可能源于以下几个方面:

  1. 数据类型不一致: UDF中接收的数据类型与模型训练时使用的数据类型不一致。
  2. 缺失值处理不当: 编码器在训练时没有正确处理缺失值,导致在推理时遇到缺失值时出错。
  3. 未知值处理: 推理数据中包含编码器在训练时未遇到的类别,且编码器没有正确配置handle_unknown参数。
  4. 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的示例代码:

ViiTor AI ViiTor AI

一个强大的多语言AI语音合成和视频转译平台

ViiTor AI 9414 查看详情 ViiTor AI
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_final['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”错误的详细内容,更多请关注其它相关文章!


# js  # 肥西网站优化费用  # 网站建设过时了吗英语  # 丽水网站优化价格  # 吕梁交城全网营销推广中心  # 专属网站建设流程  # 遵义seo网站优化  # 微博短视频营销百度推广  # 福保专业外贸网站推广  # 大公司seo销售  # 并在  # 以确保  # 文档  # 是一个  # 的是  # 几种  # 所需  # 浮点  # 正确地  # 加载  # red  # python包  # api调用  # ai  # csv  # session  # 编码  # go  # json  # python  # 龙泉网站建设推广 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 电脑开不了机怎么办 电脑无法开机的解决方法  歌词怎么展示在|直播|间视频号?有什么注意事项?  c++中的const关键字用法大全_c++ const正确使用指南  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  中大网校app做题记录清除方法  iCloud官方网站 iCloud网页版在线登录入口  在PySimpleGUI中实现键盘按键绑定按钮事件  PHP实现等比数列:构建数组元素基于前一个值递增的方法  百度网盘如何设置上传限额  《tt语音》超级玩家开通方法  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  空腹吃苹果好吗 苹果空腹摄入指南  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  《绿竹漫游》关闭消息通知方法  德邦快递收费标准详解  《兴业银行》注册登录方法  QQ网站入口直接登录 QQ官方正版登录页面  《波斯王子:失落的王冠》剑术大师打法攻略  j*a中ArrayBlockingQueue的使用  PSD转AI文件的简单方法  铁路12306官网入口 铁路12306中国铁路官网登录首页  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法  附近酒吧怎么找?  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  微博网页版访问入口 微博网页版网页端使用指南  解决CSS background 属性中 cover 关键字的常见误用  J*aScript模块加载器_RequireJS原理分析  背部总是隐隐作痛怎么回事 背痛如何改善  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  cad加载的线型看不见怎么办_cad线型不可见问题解决方法  J*aScript与HTML元素交互:图片点击事件与链接处理教程  顺丰快递收费标准查询_如何查看顺丰最新收费价格  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  Highcharts雷达图轴线交点数值标注指南  除了Copilot,还有哪些值得一试的VS Code AI插件?  抖音网页版地址直接进入_抖音网页版在线观看入口  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  企查查官网和爱企查 企查查企业查询官网入口  Go App Engine 项目结构与包管理深度指南  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  qq邮箱怎么注册_QQ邮箱注册步骤与注意事项  如何通过settings.json个性化您的VS Code体验  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  如何查询个人病历记录  Apple Music无故扣费引质疑  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  《sketchbook》选中部分图案移动方法 

 2025-11-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.