0

我是 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 中的新数据进行预测

这是一个 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 转换为图片中的类似对象。

将不胜感激任何帮助:)

4

1 回答 1

0

如果您计划使用 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;
于 2017-11-08T17:04:25.797 回答