如何在SAP HANA Studio中保存R randomForest对象?

时间:2017-11-08 15:15:40

标签: r sap random-forest pmml hana-studio

我是SAP World的新手,我正在尝试使用安装在SAP HANA Studio中的R Server(HANA Studio版本:2.3.8和R Server 3.4.0版本)

我的任务是:

  • 在HANA Studio中的R服务器上训练randomForest模型(借助HANA上的RLANG程序)
  • 将randomForest模型保存为HANA中的PAL模型对象
  • 使用此模型预测HANA中的新数据

以下是培训在HANA上保存模型的RLANG程序的一个小例子:

    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上的模型表应如何显示:

model on SAP HANA

在此示例中,培训正在进行,但我不确定如何在SAP HANA数据库中保存randomForest-Object,或者如何将randomForest-Object转换为图片中的类似对象。

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

如果您计划使用R服务器进行预测,则可以将随机Forest模型存储为SAP HANA中的BLOB对象。

SAP HANA R Integration Guide之后,你需要。

  1. 在您的表BLOB中加入"PA"."TRAIN_MODEL属性。
  2. 在将模型写入表格之前,将模型存储为函数serialize的二进制文件。
  3. 在调用预测程序时加载并Unserialize模型。
  4. 你的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;