Как сохранить объект R randomForest в SAP HANA Studio?
Я довольно новичок в мире SAP и пытаюсь работать с R Server, установленным в SAP HANA Studio (версия HANA Studio: 2.3.8 и версия R Server 3.4.0)
Мои задачи:
- Обучить модель randomForest на R Server в HANA Studio (с помощью процедуры RLANG в HANA)
- Сохраните модель randomForest как объект модели PAL в HANA
- Сделать прогноз на новые данные в HANA, используя эту модель
Вот небольшой пример процедуры RLANG для обучения сохранению модели на HANA:
PROCEDURE "PA"."RF_TRAIN" (
IN data "PA"."IRIS",
OUT modelOut "PA"."TRAIN_MODEL"
)
LANGUAGE RLANG
SQL SECURITY INVOKER
DEFAULT SCHEMA "PA"
AS
BEGIN
require(randomForest)
require(dplyr)
require(pmml)
# iris <- as.data.frame(data)
data(iris)
iris <- iris %>% mutate(y = factor(ifelse(Species == "setosa", 1, 0)))
model <- randomForest(y~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, iris,
importance = TRUE,
ntree = 500)
modelOut <- as.data.frame(pmml(model))
END;
(Пожалуйста, не смущайтесь, я не использую свои входные данные для обучения модели, это не реальный пример)
Вот как должна выглядеть таблица с моделью в SAP HANA:
В этом примере обучение работает, но я не уверен, как сохранить объект randomForest в базе данных SAP HANA или как преобразовать объект randomForest в похожий объект на рисунке.
Буду признателен за любую помощь:)
1 ответ
Если вы планируете использовать R-сервер для своих прогнозов, вы можете сохранить свою модель случайного леса в виде BLOB
объект в SAP HANA.
Следуя Руководству по интеграции SAP HANA R, вам необходимо.
- Включить
BLOB
приписать к вашей таблице"PA"."TRAIN_MODEL
, - Сохраните модель как двоичную с функцией
serialize
прежде чем записать это в вашу таблицу. - Загрузить и
Unserialize
Ваша модель при вызове процедуры прогнозирования.
Что бы дать, в вашем R сценарии.
require(randomForest)
require(dplyr)
require(pmml)
generateRobjColumn <- function(...){
result <- as.data.frame(cbind(
lapply(
list(...),
function(x) if (is.null(x)) NULL else serialize(x, NULL)
)
))
names(result) <- NULL
names(result[[1]]) <- NULL
result
}
# iris <- as.data.frame(data)
data(iris)
iris <- iris %>% mutate(y = factor(ifelse(Species == "setosa", 1, 0)))
model <- randomForest(y~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, iris,
importance = TRUE,
ntree = 500)
modelOut <- data.frame(ID = 1, MODEL = generateRobjColumn(pmml(model)))
Обратите внимание, что вам на самом деле не нужно использовать pmml
если вы планируете повторно использовать модель как есть.
В другой процедуре вам нужно будет вызвать эту таблицу и десериализовать вашу модель для прогнозирования.
CREATE PROCEDURE "PA"."RF_PREDICT" (IN data "PA"."IRIS", IN modelOut "PA"."TRAIN_MODEL", OUT result "PA"."PRED")
LANGUAGE RLANG AS
BEGIN
rfModel <- unserialize(modelOut$MODEL[[1]])
result <- predict(rfModel, newdata = data) # or whatever steps you need for prediction
END;