新闻中心

解决Snowflake中保存的编码器无法用于推理新数据的问题

2025-11-01
浏览次数:
返回列表

解决snowflake中保存的编码器无法用于推理新数据的问题

本文旨在解决在Snowflake中保存OneHotEncoder和OrdinalEncoder后,用于推理新数据时出现`ufunc 'isnan' not supported`错误的问题。文章将深入探讨问题原因,并提供一份详细的解决方案,包括正确的编码器调用方式、数据类型转换以及优化的UDF函数实现,确保模型在Snowflake环境中能够稳定可靠地进行预测。

在Snowflake中部署机器学习模型时,将预处理步骤(如One-Hot Encoding和Ordinal Encoding)集成到用户自定义函数(UDF)中是常见的做法。然而,在将训练好的编码器保存到Snowflake并尝试用于新数据推理时,可能会遇到各种问题,其中一个常见的问题是ufunc 'isnan' not supported错误。本文将详细介绍如何解决这个问题,并提供一个完整的示例,展示如何在Snowflake中正确地加载和使用编码器进行推理。

问题分析

ufunc 'isnan' not supported错误通常表明在尝试对包含非数值数据(例如字符串)的数据执行数值操作。这通常发生在以下情况下:

  1. 数据类型不匹配: 输入到编码器的数据类型与编码器训练时使用的数据类型不一致。
  2. 缺失值处理不当: 编码器在训练时没有正确处理缺失值,导致在推理时遇到未知的缺失值。
  3. 编码器调用错误: 在UDF中错误地使用了Snowpark API而不是scikit-learn API来转换数据。

解决方案

以下步骤将帮助您解决在Snowflake中保存的编码器无法用于推理新数据的问题:

1. 确保数据类型一致性

在训练和推理阶段,确保输入到编码器的数据类型一致。例如,如果训练数据中的某一列是字符串类型,那么在推理时,该列也必须是字符串类型。可以使用Snowflake的CAST函数或Snowpark的astype方法来转换数据类型。

ECTouch移动商城系统 ECTouch移动商城系统

ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有

ECTouch移动商城系统 0 查看详情 ECTouch移动商城系统

2. 正确处理缺失值

在训练编码器时,使用handle_unknown和unknown_value参数来处理未知值和缺失值。例如,对于OneHotEncoder,可以将handle_unknown设置为'ignore'来忽略未知类别。对于OrdinalEncoder,可以使用unknown_value参数指定未知值的编码。

from snowflake.ml.modeling.preprocessing import OneHotEncoder,OrdinalEncoder
import numpy as np

# OneHotEncoder示例
ohe = OneHotEncoder(handle_unknown='ignore', input_cols='CATEGORY', output_cols='ROUTE_OHE')
ohe.fit(mock_df)

# OrdinalEncoder示例
categories = {
    "AIRPORT": np.array(['A', 'B', 'C'])
}
oe = OrdinalEncoder(
    handle_unknown='use_encoded_value', unknown_value=-1,
    encoded_missing_value=-1, input_cols='AIRPORT',
    output_cols='AIRPORT_ENCODE',
    categories=categories
)
oe.fit(mock_ohe)

3. 使用正确的编码器API

在UDF中,由于使用的是Pandas DataFrame,因此需要使用scikit-learn API来转换数据,而不是Snowpark API。将Snowpark的编码器转换为scikit-learn的编码器,再进行数据转换。

# 将Snowpark编码器转换为scikit-learn编码器
ohe_obj = ohe.to_sklearn()
oe_obj = oe.to_sklearn()

# 在UDF中使用scikit-learn API进行转换
df_ohe = ohe_obj.transform(df[['ROUTE_CATEGORY_NAME']])

4. 优化UDF函数

为了提高推理性能,可以使用@cachetools.cached装饰器来缓存加载的模型,避免每次调用UDF时都重新加载模型。此外,可以使用向量化UDF,一次性处理整个DataFrame,而不是逐行处理。

import cachetools
import pandas as pd
from snowflake.snowpark.types import PandasDataFrameType,PandasSeriesType,PandasDataFrame,PandasSeries
import snowflake.snowpark.functions as F

@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',
        input_type=PandasDataFrameType([IntegerType(),StringType(),StringType(),StringType(),StringType(),StringType(),IntegerType()], list(test_df.schema.names)),
        return_type=PandasSeriesType(FloatType())
)
def predict_package_mix_p(
    df:PandasDataFrame
) -> PandasSeries:
    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

    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

5. 注意事项

  • 列名大小写: Snowflake在存储表时,会将列名转换为大写。因此,在UDF中引用列名时,需要使用大写。
  • 模型和编码器版本: 确保在训练和推理阶段使用的模型和编码器版本一致。
  • 依赖包: 在Snowflake中注册UDF时,需要添加所有必要的依赖包,例如pandas、joblib、xgboost和scikit-learn。

总结

通过遵循上述步骤,您可以解决在Snowflake中保存的编码器无法用于推理新数据的问题,并构建一个稳定可靠的机器学习推理流程。关键在于确保数据类型一致性,正确处理缺失值,使用正确的编码器API,并优化UDF函数以提高性能。记住,仔细检查代码,并参考Snowflake的官方文档,可以帮助您避免许多常见的错误。

以上就是解决Snowflake中保存的编码器无法用于推理新数据的问题的详细内容,更多请关注其它相关文章!


# 网店  # 武汉推广微信群大全网站  # 站长推荐seo  # 免网推广网站  # 关键词综合排名指数  # 昆山网站建设平台分析  # 手机网站推广流程  # seo综合分析网站  # 舟山营销推广途径  # seo得多少钱  # 网站平台优化技巧有哪些  # 自动登录  # 操作流程  # 的是  # js  # 用户登录  # 加载  # 而不是  # 正确处理  # 转换为  # 可以使用  # red  # ai  # csv  # session  # 编码  # go  # json 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 高德地图怎么看全景照片_高德地图全景照片浏览教程  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  c++项目目录结构应该如何组织_c++工程化项目结构规范  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  抖音创作助手登录入口_抖音创作辅助工具官网直达  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Tabulator表格中精确实现日期时间排序的指南  免费抖音短视频入口_抖音网页版短视频免费通道  j*a toString()的覆盖  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  海棠账号登录入口_登录海棠账户同步阅读记录  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  绝地鸭卫平a核爆刀流玩法攻略  CSS实现侧边栏导航项全宽圆角悬停背景效果  在Runstone环境中高效处理TasteDive API的JSON数据  J*a递归快速排序中静态变量的状态管理与陷阱  qq游戏手机版下载安装_qq游戏移动端入口  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  css链接悬停下划线样式如何自定义_使用::after结合content和transition  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  Python getattr() 异常处理深度解析:避免程序意外退出  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  解决Django多数据库/多Schema环境下外键迁移问题  qq游戏网页版直接玩_qq游戏免下载快速入口  铁路12306的积分有效期是多久_铁路12306积分有效期说明  在Go Martini框架中高效服务动态生成图像的实践指南  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  理解J*aScript Promise的微任务队列与执行顺序  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  红果短剧网页版官网入口 官方最新网址发布  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  如何有效阻止外部脚本意外修改内联样式的高度属性  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  菜鸟取件码是什么怎么查 最全查询渠道汇总  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  离线运行Go语言之旅:本地部署与GOPATH配置指南  React列表渲染与独立状态管理:避免全局状态影响局部更新  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Golang指针如何与map组合使用_Golang map指针组合实践  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件 

搜索