【问题标题】:How to tell r2pmml what dataType are my variables?如何告诉 r2pmml 我的变量是什么数据类型?
【发布时间】:2020-01-04 02:37:21
【问题描述】:

我想以 pmml 格式导出 R 模型并在其他地方使用它。其他软件需要一些变量作为整数,但所有数字变量都导出为双精度变量,即使它们在我的数据集中显式为整数。

我试图通过手动(或使用正则表达式)更改它们来绕过这个问题,并且我删除了每个小数,但是当软件接受新格式时,预测不是我所期望的(因为我只是删除了小数),所以我想要直接在 R 中解决这个问题。

如何强制我的变量为特定数据类型(尤其是“整数”)?

这是一个导出 .pmml 的代码示例:

# Required packages -------------------------------------------------------

library(tidyverse)
library(r2pmml)
library(randomForest)
library(nnet)

# Dataset creation --------------------------------------------------------

seed = 1
data = data.frame(
  var1 = round(runif(10) * 100),
  var2 = round(runif(10) * 100),
  y = round(runif(10) * 100)
)

data =
  data %>%
  mutate(var1 = as.integer(var1),
         var2 = as.integer(var2))

# Structure check ---------------------------------------------------------

str(data)

# Neural Network and Random Forest models ---------------------------------

nn =
  nnet(
    y ~ .,
    data = data,
    method = "nnet",
    size = c(2),
    linout = 1
  )

rf =
  randomForest(y ~ .,
               data = data)

# pmml export -------------------------------------------------------------

r2pmml(rf,
       file = "rf.pmml",
       dataset = data,
       verbose = TRUE)

r2pmml(nn,
       file = "nn.pmml",
       dataset = data,
       verbose = TRUE)

我希望我的 pmml 将变量 var1 和 var2 作为整数,但在输出的这一部分中它们最终是双倍的

    <DataDictionary>
        <DataField name="y" optype="continuous" dataType="double"/>
        <DataField name="var1" optype="continuous" dataType="double"/>
        <DataField name="var2" optype="continuous" dataType="double"/>

我在

中得到十进制数
        <NeuralLayer activationFunction="logistic">
            <Neuron id="hidden/1" bias="-0.4112317232771385">
                <Con from="input/1" weight="-6.591508925328581"/>
                <Con from="input/2" weight="-31.805468580606753"/>
            </Neuron>

但我不确定它应该是整数还是双精度。

【问题讨论】:

    标签: r pmml


    【解决方案1】:

    由于R2PMML 包及其底层JPMML-R 库是开源的,您可以随时查看源代码(您正在使用的版本)以了解实现方式。对于nnet 模型类型,您可以查看org.jpmml.rexp.NNetConverter 类。

    基本上,有两种选择。首先,R 模型对象(nnet 保存在 RDS 文件中的对象)可能根本不包含任何特征类型信息。其次,该信息可能存在,但转换器尚未使用它 - 它默认为 nnet 算法的默认数据类型(所有数值计算工作均使用双精度数据类型完成,因此看起来不错选择存储在 PMML 文档中)。

    它究竟记录在你的 R 模型对象中的什么地方,其中 var1var2 是整数(而不是双精度数)?如果你认为 您已经找到了答案,请考虑使用 JPMML-R 项目提出功能请求。

    【讨论】:

    • 谢谢!我检查并在 RF 模型中,默认情况下,数据类型以 numeric 形式保存在 rf$terms 中,即使它们在我的数据集中是整数。我将这些更改为整数(知道它可能无法正常工作)并且我收到了这种错误INFO: Converting.. sep 05, 2019 8:04:25 PM org.jpmml.rexp.Main run SEVERE: Failed to convert java.lang.IllegalArgumentException: integer at org.jpmml.rexp.RExpUtil.getDataType(RExpUtil.java:48) ... Exception in thread "main" java.lang.IllegalArgumentException: reg:squarederror ...
    • 一条抱怨reg:squarederror的转换消息似乎与此问题有关:github.com/jpmml/jpmml-xgboost/issues/43
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2021-10-09
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多