Как сохранить объект R randomForest в SAP HANA Studio?

Я новичок в SAP World и пытаюсь работать с 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:

модель на SAP HANA

В этом примере обучение работает, но я не уверен, как сохранить randomForest-Object в базе данных SAP HANA или как преобразовать randomForest-Object в аналогичный на картинке.

Был бы признателен за любую помощь :)


person KayEd    schedule 08.11.2017    source источник


Ответы (1)


Если вы планируете использовать сервер R для своих прогнозов, вы можете сохранить свою случайную модель леса как объект BLOB в SAP HANA.

Следуя Руководству по интеграции SAP HANA R, тебе следует.

  1. Включите атрибут BLOB в свою таблицу "PA"."TRAIN_MODEL.
  2. Сохраните модель как двоичную с помощью функции serialize, прежде чем записывать ее в свою таблицу.
  3. Загрузите и 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;
person AshOfFire    schedule 08.11.2017
comment
Спасибо @AshOfFire, это мне очень помогло. Но у меня есть одна проблема: когда я применяю функцию generateRobjColumn, моя R-сессия уничтожается. - person KayEd; 15.11.2017
comment
Вы пытались запустить скрипт в локальном сеансе R или непосредственно на сервере R? В обоих случаях сценарий работал хорошо для меня. - person AshOfFire; 15.11.2017
comment
Я пробовал локальную сессию R: с небольшим случайным лесом, например, для данных радужной оболочки, он работает хорошо, но для RF с моими данными каждый раз происходит сбой, даже с options(java.parameters = "-Xmx14g") - person KayEd; 15.11.2017
comment
Может быть, это из-за размера ваших данных (я полагаю, намного больше, чем радужная оболочка)? Сериализация имеет ограничение по размеру — см. эту тему для получения дополнительной информации. - person AshOfFire; 15.11.2017