Как сообщить r2pmml, какой тип данных является моими переменными?

Я хочу экспортировать модель R в формате pmml и использовать ее в другом месте. Другое программное обеспечение требует, чтобы некоторые переменные были целыми числами, но вместо этого все числовые переменные экспортируются как двойные, даже если они явно являются целыми числами в моем наборе данных.

Я попытался обойти эту проблему, изменив их вручную (или с помощью регулярных выражений), и я удалил все десятичные знаки, но хотя программное обеспечение принимает новый формат, предсказание не то, что я ожидаю (потому что я только что удалил десятичные знаки), поэтому я хочу решить эту проблему. непосредственно внутри Р.

Как я могу заставить свои переменные быть определенным типом данных (в частности, «целым числом»)?

Это пример кода, который экспортирует .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>

но я не уверен, должно ли это быть целым числом или двойным.


person Rodolfo Núñez    schedule 30.08.2019    source источник


Ответы (1)


С помощью пакета R2PMML и лежащего в его основе JPMML-R с открытым исходным кодом, вы всегда можете заглянуть в исходный код (используемой версии), чтобы увидеть, как все реализовано. . В случае типа модели nnet вы можете взглянуть на класс org.jpmml.rexp.NNetConverter.

По сути, есть два варианта. Во-первых, объект модели R (объекты nnet, сохраненные в файле RDS) может вообще не содержать никакой информации о типе объекта. Во-вторых, эта информация может быть там, но преобразователь еще не использует ее - он по умолчанию использует тип данных по умолчанию алгоритма nnet (все числовые вычисления выполняются с использованием типа данных double, так что это кажется хорошим выбором для сохранение в документе PMML).

Где именно записано в вашем объекте (объектах) модели R, что функции var1 и var2 являются целыми числами (а не двойными)? Если вы думаете, что нашли ответ, рассмотрите возможность открытия запроса функции в проекте JPMML-R.

person user1808924    schedule 31.08.2019
comment
Спасибо! Я проверил, и внутри модели RF типы данных сохраняются в 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 ... - person Rodolfo Núñez; 05.09.2019
comment
Сообщение о преобразовании с жалобой на reg:squarederror похоже связано с этой проблемой: github.com/jpmml/jpmml- xgboost/проблемы/43 - person user1808924; 06.09.2019