Функция r для достижения успеха, но не распознается в контейнере
Вот пример сценария R, использующего пару библиотек
library(pmml)
library(pmmlTransformations)
data(iris)
irisBox <- WrapData(iris)
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length",
newFieldName="Sepal.Length.Transformed",
formulaText="ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8)")
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data)
pmml(mod1, transform = irisBox)
Функция отлично работает и создает хороший вывод pmml. Однако оператор ifelse не является распознаваемой функцией в pmml 4_3. Кто-нибудь может порекомендовать альтернативу приведенному выше сценарию для создания работоспособной команды pmml?
Я признаю, что DiscretizeXform рекомендуется в пакете pmmlTransformations, но он очень громоздкий, поэтому я неохотно его использую, поскольку он должен читать точки останова из внешних файлов.
2 ответа
pmmlTransformations
Пакет не знает, как обрабатывать R-функцию ifelse, и передает ее как есть. Вот почему итоговый документ PMML содержит Apply@function="ifelse"
когда он должен содержать Apply@function="if"
,
Встроенная функция PMML "if" отлично подходит для представления логики ветвления if-else:
Реализует логику IF-THEN-ELSE. ELSE часть не обязательна. Если часть ELSE отсутствует и логическое значение равно false, возвращается отсутствующее значение.
Что касается решения, то, пожалуйста, рассмотрите возможность перехода к r2pmml
пакет, который позволяет вам разрабатывать функции внутри формул (в отличие от "бокса") data.frame
объекты), включая полную поддержку функции "ifelse":
library("randomForest")
library("r2pmml")
iris.rf = randomForest(Species ~ ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8) + ., data = iris)
r2pmml(iris.rf, "iris.pmml")
Похоже, простая замена будет работать.
irisBox <- WrapData(iris)
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length",
newFieldName="Sepal.Length.Transformed",
formulaText="if(Sepal.Length>5) Sepal.Length*1.2 else Sepal.Length*.8")
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data)
pmml(mod1, transform = irisBox)