sklearn2pmml xgboost缺失值(missing)处理的坑

2023-05-16

sklearn2pmml xgboost缺失值(missing)处理的坑

今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。

看了下同事的代码,貌似也没有问题

from sklearn2pmml import PMMLPipeline
from sklearn2pmml import sklearn2pmml
from xgboost import XGBClassifier
weight = train_y.sum() * 1.0/ (len(train_data) - train_y.sum())
xgb_clf = XGBClassifier(learning_rate=0.1,n_estimators=100,max_depth=3,objective='binary:logistic',seed=1,silent=1,reg_alpha=3,reg_lambda=0.9,scale_pos_weight=1/weight,missing=-9999, eval_metric='auc')
pipeline = PMMLPipeline([('classifier',xgb_clf)])
pipeline.fit(train_x,train_y)
sklearn2pmml(pipeline,'data/a_card_1.pmml',with_repr=True)

首先注意到和之前不同点在于这次缺失值不是nan了,这引起了我的警觉,重新训练了下模型,把样本缺失值处理为np.nan,训练时missing设为默认值None,这时和线上对比发现一致了,果然是missing value的问题。

sklearn2pmml对于xgboost并没有暴露missing这个参数,所以对于missing不为None的童鞋可使用https://github.com/jpmml/jpmml-xgboost 转化。

xgb_clf.get_booster().dump_model('/tmp/a_card_model.dump.txt')
xgb_clf.get_booster().save_model('/tmp/xgb.model')

java -jar target/jpmml-xgboost-executable-1.3-SNAPSHOT.jar --model-input /tmp/xgb.model --fmap-input /tmp/xgb.fmap --pmml-output xgboost_miss.pmml --missing-value -9999

fmap可通过以下方式产生

fmap(feature map file):实现feature id和feature name的对应
格式为 featmap.txt: <featureid> <featurename> <q or i or int>\n

Feature id0开始直到特征的个数为止,从小到大排列。
i表示是二分类特征
q表示数值变量,如年龄,时间等。q可以缺省
int表示特征为整数(when int is hinted, the decision boundary will be integer)
可根据以下语句通过读取pkl文件的feature_name生成,或者根据feature顺序通过别的方式生成 


def ceate_feature_map(file_name,features): 
    outfile = open(file_name, 'w') 
    for i, feat in enumerate(features): 
        outfile.write('{0}\t{1}\tq\n'.format(i, feat))

通过对比PMML可以发现不同点就在于DataField增加了missing配置

<DataDictionary>
		<DataField name="_target" optype="categorical" dataType="integer">
			<Value value="0"/>
			<Value value="1"/>
		</DataField>
		<DataField name="pas_age" optype="continuous" dataType="float">
			<Value value="-9999" property="missing"/>
		</DataField>
		<DataField name="last_gulf_call_days" optype="continuous" dataType="float">
			<Value value="-9999" property="missing"/>
		</DataField>
		....
</DataDictionary>	

可以手动在之前的PMLL文件中增加即可解决这个问题。

当然我觉得更好的方式就是使用默认值,即np.nan,对应到spark也就是null,非常自然。

不过没怎么看懂PMML是怎么处理缺失值的,贴一段xgboost原生和PMML对比

booster[0]:
0:[last_30_days_invoice_value<2407.28491] yes=1,no=2,missing=2
	1:[last_6_month_finish_count_variation_coefficient<0.61500001] yes=3,no=4,missing=4
		3:[last_6_month_fast_finish_order_max_actual_cost<86.4949951] yes=7,no=8,missing=8
			7:leaf=-0.0717158243
			8:leaf=-0.147665188
		4:[last_1_year_taxi_finish_order_actual_cost<505.25] yes=9,no=10,missing=9
			9:leaf=-0.0261387583
			10:leaf=-0.178924426
	2:[app_system_tools_wifi_category_number_rate<0.0645833313] yes=5,no=6,missing=5
		5:[last_1_year_night_finish_rate<0.0652500018] yes=11,no=12,missing=12
			11:leaf=-0.0177322756
			12:leaf=0.0268170126
		6:[app_stock_sub_category_number_rate<0.0875959098] yes=13,no=14,missing=13
			13:leaf=0.06783209
			14:leaf=-0.0312540941
<Segment id="1">
   <True/>
   <TreeModel functionName="regression" missingValueStrategy="none" noTrueChildStrategy="returnLastPrediction" splitCharacteristic="multiSplit" x-mathContext="float">
       <MiningSchema>
           <MiningField name="last_6_month_fast_finish_order_max_actual_cost"/>
           <MiningField name="last_1_year_night_finish_rate"/>
           <MiningField name="last_30_days_invoice_value"/>
           <MiningField name="app_stock_sub_category_number_rate"/>
           <MiningField name="app_system_tools_wifi_category_number_rate"/>
           <MiningField name="last_1_year_taxi_finish_order_actual_cost"/>
           <MiningField name="last_6_month_finish_count_variation_coefficient"/>
       </MiningSchema>
       <Node score="0.026817013">
           <True/>
           <Node score="-0.026138758">
               <SimplePredicate field="last_30_days_invoice_value" operator="lessThan" value="2407.285"/>
               <Node score="-0.14766519">
                   <SimplePredicate field="last_6_month_finish_count_variation_coefficient" operator="lessThan" value="0.615"/>
                   <Node score="-0.071715824">
                       <SimplePredicate field="last_6_month_fast_finish_order_max_actual_cost" operator="lessThan" value="86.494995"/>
                   </Node>
               </Node>
               <Node score="-0.17892443">
                   <SimplePredicate field="last_1_year_taxi_finish_order_actual_cost" operator="greaterOrEqual" value="505.25"/>
               </Node>
           </Node>
           <Node score="0.06783209">
               <SimplePredicate field="app_system_tools_wifi_category_number_rate" operator="greaterOrEqual" value="0.06458333"/>
               <Node score="-0.031254094">
                   <SimplePredicate field="app_stock_sub_category_number_rate" operator="greaterOrEqual" value="0.08759591"/>
               </Node>
           </Node>
           <Node score="-0.017732276">
               <SimplePredicate field="last_1_year_night_finish_rate" operator="lessThan" value="0.06525"/>
           </Node>
       </Node>
   </TreeModel>
</Segment>

xgboost有明确的当遇到缺失值如何处理说明,但PMML貌似并没有,看出的童鞋麻烦告知我一下,非常感谢。

我们实现了配置化在Spark上部署模型,如一模型部署配置如下

sparkConf:
  #spark任务名称, 必填
  appName: driverCCardPMML
  #是否启用hive支持
  enableHiveSupport: true
  #spark其它配置选项,如内存,shffle partitions数量等
appConf:
  #debug开启时,每个节点会做持久化
  debug: true
  #持久化数量,0代表全量
  limit: 10
  savePath: /user/fbi/model_deploy/
  sourcePath: /user/fbi/model_source/
#一个子节点只有一个父节点,所以树更合适
tree:
  #节点描述
  desc: C卡PMML
  #名称,用于标识一个组件
  name: model_pmml
  #传递给组件的参数,包括模型超参数,以及配置参数等
  parameters:
    #pmml文件路径,暂只支持本地文件,spark-submit可通过--files glm1.pmml上传
    pmmlPath: zkc_driver_ccard_v1.1.pmml
    #是否排除原始列,默认false(保留)
    excludeOriginColumn: true
    #排除例外,如uid等
    excludeExcept: ["uid"]
  #子节点合并所有结果,如果children只有一个,可省略joinType,joinKey
  #join类型,full(默认), inner, left, right
  children:
    - desc: 加载C卡原数据
      name: data_source
      parameters:
        #支持hql, hql_file json
        type: hql_file
        path: datasource.sql
        #方便模型校验,可配置saveTable,将负责数据源落库,将会保存到/user/fbi/model_source/year/month/day/model_driver_c_card_source.parquet
        saveTable: model_driver_c_card_source
      transformer:
        - desc: 数据类型转换
          name: feature_data_type
          parameters:
            #原始数据类型 tinyint,smallint, int, bigint, float, double,string, decimal
            originalType: ["decimal"]
            #目标数据类型
            targetType: double
            #排除的列名,可省略
            #exceptColumn: []      
  #transformer节点,pipeline模式
  transformer:
    - desc: 落库
      name: data_sink
      parameters:
        #是否自动建表
        auto: true
        path: /user/fbi/
        db: riskmanage_dm
        table: model_driver_c_card_v1
        tableName: 模型-司机-C卡-v1

最近也在反思是否有更好的离线部署方式,如DSL,比如通过spark-sql可以完全实现上面的处理流程,当然需要稍微扩展下spark-sql语法,是否值得尝试?

大家对离线模型都是如何部署的,欢迎交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sklearn2pmml xgboost缺失值(missing)处理的坑 的相关文章

  • 设置电脑网络唤醒-华硕主板+向日葵

    我一直用向日葵的开机棒唤醒电脑 xff0c 后来重装系统 xff0c 就开机棒失效了 由于是重装系统 xff0c 所以BIOS的设置没问题的 xff0c 就怀疑是新系统需要设置 xff0c 找了好久找到这个教程 xff0c 记录一下 参考这
  • 各种排序的运行时间对比

    冒泡排序 cpp view plain copy time 34 220s include lt cstring gt include lt iostream gt include lt fstream gt include lt algo
  • Cordova概述

    Cordova Apache Cordova is an open source mobile development framework It allows you to use standard web technologies HTM
  • Ubuntu18.04 项目配置

    有问题多重启就好啦 1 换源2 配置输入法3 安装Nvidia驱动4 安装Cuda5 下载谷歌浏览器并安装6 安装Anaconda37 pip换源8 Ubuntu18 04 无法通过蓝牙链接 Airpods9 安装PyCharm10 安装P
  • 基于numpy的CNN实现,进行MNIST手写数字识别

    主要框架来自于这篇文章 xff1a https blog csdn net qq 36393962 article details 99354969 xff0c 下面会以原文来代称这篇文章 本文在原文的基础上增加了交叉熵以及mnist数据集
  • libevent 的http模块实现http服务器

    首先声明 xff0c libevent的http模块是为单线程设计的 xff0c 如果业务逻辑中有耗时操作 xff0c 则需要自行设计线程池以便提高吞吐量 xff0c 每个工作线程中都要运行一个event base loop和一个evhtt
  • swig 使用案例

    包含数组 结构体嵌套 xff0c 函数指针传递等基本操作 swig默认不支持数组元素的写入 xff0c 如果想操作数组元素 xff0c 可以附加一些接口函数实现 比如下面在处理结构体的数组成员时 xff0c 使用 extend命令扩展了对应
  • 攻击防御实例——SQL注入

    攻击防御实例 SQL注入 1 i 表示匹配的时候不区分大小写 2 s 匹配任何不可见字符 xff0c 包括空格 制表符 换页符等等 等价于 f n r t v 3 information schema xff1a 是一个数据库 xff0c
  • 264 nal type

    NUAL HEAD 43 43 0 1 2 3 4 5 6 7 43 43 43 43 43 43 43 43 43 F NRI Type 43 43 F xff1d Forbidden zero bit 61 0 NRI 61 Nal r
  • SubClassWindow详解

    许多Windows程序员都是跳过SDK直接进行RAD开发工具 或VC xff0c 我想VC应不属于RAD 的学习 xff0c 有些人可能对子类化机制比较陌生 我们先看看什么是Windows的子类化 Windows给我们或是说给它自己定义了许
  • stl upper_bound函数实现

    写了一个upper bound的实现 其中递归使用二分法求解最上界 xff0c 虽然写的完全不像STL的风格 xff0c 但是练手还是可以的 view plaincopy to clipboardprint 01 include lt io
  • 关于TrackMouseEvent用法总结

    对于这个函数我也是最近想研究控件自绘才知道它真正怎么用 以前只是见到过 嗯 废话不多说 我先说下我的问题 如何响应鼠标离开某个窗体 控件 事件 先大概讲下步骤 然后再集中对 TrackMouseEvent 进行详解 为按钮添加以下几个函数
  • 关于CComboBox的自绘

    我想 如果大家学过一些控件的自绘的话 CComboBox算是很难的一种了 首先是它本身的复杂度 它由三个控件组成 CEdit CListBox CButton 我想但就CEdit来讲 就够你受得了 还要想想他们之间的消息传递 不禁让人无从下
  • 内部链接与外部链接

    在说内部连接与外部连接前 xff0c 先说明一些概念 1 声明 一个声明将一个名称引入一个作用域 在c 43 43 中 xff0c 在一个作用域中重复一个声明是合法的 以下都是声明 xff1a int foo int int 函数前置声明
  • partition/stable_partition详解

    Partition 将满足条件的元素向前移动 TEMPLATE FUNCTION partition template lt class BidIt class Pr gt inline BidIt Partition BidIt Firs
  • jsoncpp解析拼装数组

    int main 数组创建与分析 例子一 string strValue 61 34 34 ldh 34 34 001 34 34 gfc 34 34 002 34 34 yyj 34 34 003 34 34 andy 34 34 005
  • 查看静态库(.lib)和动态库(.dll)的导出函数的信息

    一般情况下 xff0c 我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息 xff0c 可以使用VS自带的工具dumpbin xff1b 可以直接在命令行下输入dumpbin就可以查看他的使用说明 xff0c 如果未显示
  • do {...} while (0) 在宏定义中的作用

    http www cnblogs com lanxuezaipiao p 3535674 html 如果你是一名C程序员 xff0c 你肯定很熟悉宏 xff0c 它们非常强大 xff0c 如果正确使用可以让你的工作事半功倍 然而 xff0c
  • Nginx 代理服务器10k文件无法上传

    在我们使用Nginx作为代理服务器的时候 xff0c 在进行文件上传时 xff0c 大于10k的文件上传失败 xff0c 因为此时后台服务并没有接收到请求 xff0c 所以在Nginx配置中进行排错 xff0c 终于找到了问题所在 1 修改
  • 即插即用型设备驱动的加载过程

    现假设驱动程序已被正确安装 xff1a 1 某种PnP总线驱动发现了即插即用设备的存在 xff1a 对于热插拔设备 xff0c 则发现过程发生于插入设备的瞬间 xff1b 如果是非热插拔设备 xff0c 则发现过程发生于系统启动时 2 Pn

随机推荐

  • EXCEL 基于合并计算工具实现相似表格汇总和求平均值

    1 表格汇总合并 在处理大量表格时 xff0c 有时候需要将很多相思内容的表格 xff0c 合并到一张表里 xff0c 那么就需要用到 合并计算工具 了 如下表所示为某公司南京分部的BCD产品的销售额 通过下表可以知道还有海口 上海 珠海三
  • ZYNQ7020AMP使用方法总结

    本人使用的sdk版本为2015 4本人的方法适用于15 4之后的版本 Zynq开发双核分为两种方法 xff0c 第一种双核裸跑 xff0c 第二种linux 43 裸跑 双核裸跑 xff1a 先使用Debug调试器调试 xff0c 通过SD
  • 试用了5款BI分析工具,终于找到了上手最快的那一个!

    前几天 xff0c 领导甩给我一个任务 xff0c 考察几个BI工具 xff0c 下季度立项用 潜心做ETL的我 xff0c 对BI只是略懂 之前上的BO xff0c 由于开发模式不适应 人员用不惯 xff0c 再加上负责这块的同事走的走
  • RNA-seq流程——使用hisat2进行序列比对(不利用循环&利用循环)(未完待续)

    RNA seq流程 使用hisat2进行序列比对 xff08 不利用循环 xff06 利用循环 xff09 xff08 未完待续 xff09 本次使用ky老师的文件进行序列比对 xff0c 比对时使用双端比对 xff0c 1 clean f
  • JavaWeb学习jsp中,单击验证码图片进行替换

    lt td gt 验证码 lt td gt lt td class 61 34 inputs 34 gt lt input name 61 34 checkCode 34 type 61 34 text 34 id 61 34 checkC
  • Linux的FTP安装、使用和配置(FTP客户端管理工具)

    一 FTP服务介绍 1 什么是HTP服务 FTP xff08 File Transfer Protocol xff09 是一种应用非常广泛并且古老的一个互联网文件传输协议 FTP主要用户互联网中文件的双向传输 xff08 上传 下载 xff
  • 详解警告“unreferenced local variable”

    在编译C 43 43 程序时 xff0c 我们有时候遇到这样的警告 warning C4101 39 x1 39 unreferenced local variable 下面是一个会出现上述警告的简单例子 xff1a using names
  • 为Github page绑定自定义域名并实现https访问

    欢迎参观我的网站 gt Yuci s Blog 实现目标 获取自定义域名yucichueng me 将上述域名 及www域名 解析到yucichueng github ioIP地址 将域名解析服务托管于CloudFlare 获取SSL证书
  • [NFC]NFC 客户 Support 流程

    驱动部分问题 测试程序用法再还未移植上层内容前执行测试程序后 NoACK不慎移植了上层后但还未确认底层是否移植成功需要先删除移植上层所产生的内容设备节点权限海思平台的驱动问题64位平台问题想用 NXP CLK 控制 PMIC 的 CLK安全
  • win10 文件夹背景 win10教程

    韩梦飞沙 韩亚飞 313134555 64 qq com yue31313 han meng fei sha 如何修改Windows10文件夹背景色 百度经验 Windows 10 文件夹背景 xff08 资源管理器中 xff09 如何更改
  • SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

    前言 好久没有写文章了 xff0c 前段时间由于公司项目比较忙 xff0c 因此耽搁了一些时间 本篇文章也是本头条号转正后发的第一篇文章 xff0c 在此跟各位看官道歉 xff0c 同时也感谢各位看官的不离不弃 希望各位看官可以关注本头条号
  • Jackson多态反序列化的使用

    缘起 最近看Apache Druid的源代码 0 5很老的版本 xff0c 印象最深的就是对Jackson的多态反序列化和注入的使用了 xff0c 这里也属于自己的知识盲点 xff0c 看着复杂的json直接反序列化为可用对象 xff0c
  • Apache Druid源码导读--Google guice DI框架

    文章目录 缘起Google Guice介绍与Spring的对比Example覆盖已有绑定关系默认绑定 Apache Druid中Guice模块guice lifecycleguice jsonconfigguice jersey jetty
  • [gevent源码分析] 深度分析gevent运行流程

    一直对gevent运行流程比较模糊 xff0c 最近看源码略有所得 xff0c 不敢独享 xff0c 故分享之 gevent是一个高性能网络库 xff0c 底层是libevent xff0c 1 0版本之后是libev xff0c 核心是g
  • TCP服务器端和客户端程序设计

    一 实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法 体会TCP与UDP编程的不同 xff0c UDP编程 xff1a http blog csdn net yueguanghaidao article details
  • UDP服务器端和客户端程序设计

    实验三 UDP服务器端程序设计 一 实验目的 学习和掌握Linux下的UDP服务器基本原理和基本编程方法 xff0c 体会与TCP的区别 xff0c TCP编程 xff1a http blog csdn net yueguanghaidao
  • python实现的文本编辑器

    wxpython实现的文本编辑器 效果如下 xff1a 主要功能 xff1a 1 编辑保存文本 xff0c 打开修改文本 2 常用快捷键 xff0c 复制 xff0c 粘贴 xff0c 全选等 3 支持撤销功能 4 支持弹出式菜单 代码如下
  • C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

    这个主要是在CSAPP基础上做的 xff0c 添加了POST xff0c SSL xff0c 目录显示等功能 一 实现功能 xff1a 1 支持GET POST方法 2 支持SSL安全连接即HTTPS 3 支持CGI 4 基于IP地址和掩码
  • CMD命令提示符窗口基本样式属性设置

    本篇文章主要针对Win7系统的CMD命令提示窗口 xff0c Win10系统中的CMD命令提示窗口其本身可以随意拖动放大 缩小 由于默认的系统中 xff0c Win系统的CMD命令提示窗口过小 xff0c 通过设置其基本的属性 xff0c
  • sklearn2pmml xgboost缺失值(missing)处理的坑

    sklearn2pmml xgboost缺失值 missing 处理的坑 今天同事在部署xgboost pmml模型时遇到了大坑 xff0c 线上spark预测和本地python预测结果怎么都不对应 xff0c 记录一下处理过程 看了下同事