使用sp_execute_external_script,如何将训练模型的元数据路由到output_data_1

时间:2016-05-10 22:08:35

标签: sql-server r sql-server-2016

R-Integration到SQL Server 2016(CTP3): 我正在使用新的sp_execute_external_script来创建线性回归模型。有没有办法将有关训练模型的系数数据发送到output_data_1_name?

例如,在R-Script的正文中,如果你发出:print(myModel); 它在SSMS输出窗口(而不是output_data)中打印出来:

Call:
lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData)

Coefficients:
  (Intercept)       IndepVar1  IndepVar2
      123.456       25.456     56.382

是否有可能将其纳入数据框?这将是更可取的,因为我也想获得t值和R平方并将其存储到表中。即使varchar(max)也没关系。我自己就解析一下。

这是我最近尝试过的:

declare @rx_model varbinary(max) = (select model from dbo.Mymodel)
exec dbo.sp_execute_external_script 
@language              = N'R',
@script                = N'require("RevoScaleR");
Mymodel                <- unserialize(rx_model);
Mymodelsummary         = summary(Mymodel);
A1 = Mymodelsummary[1]; 
A2 = Mymodelsummary[2];
A3 = Mymodelsummary[3];
A4 = Mymodelsummary[4];
A5 = Mymodelsummary[5];
summary_Text = data.frame( c(A4, A5) ); ', 
@input_data_1          = N'', 
@input_data_1_name     = N'', 
@output_data_1_name    = N'summary_Text',
@params                = N'@rx_model varbinary(max)', 
@rx_model              = @rx_model
with result sets (("A4" nvarchar(max), "A5" nvarchar(max) ));

我在SQL Server 2016 CTP3中遇到的错误是:

Msg 39004,Level 16,State 20,Line 0 执行'sp_execute_external_script'期间发生'R'脚本错误 使用HRESULT 0x80004004。 消息39019,级别16,状态1,行0 发生外部脚本错误: as.data.frame.default(x [[i]],optional = TRUE,stringsAsFactors = stringsAsFactors)出错: 不能强制类“”summary.rxLinMod“”强制到data.frame 电话:来源... data.frame - &gt; as.data.frame - &gt; as.data.frame.default ScaleR出错。检查输出以获取更多信息。 eval中的错误(expr,envir,enclos): ScaleR出错。检查输出以获取更多信息。 电话:来源 - &gt; withVisible - &gt; eval - &gt; eval - &gt; 。呼叫 执行停止 Msg 11536,Level 16,State 1,Line 2 EXECUTE语句失败,因为它指定了WITH RESULT SETS子句 1个结果集,但该语句仅在运行时发送了0个结果集。

所以我想知道如何从SQL中的sp_execute_external_script中获取该输出。 MSDN并未涵盖R本身。 SQL抱怨说模型的输出不能“强制”到数据帧。我想知道R-Script中的哪些操作可以将其“取笑”成数据帧。

2 个答案:

答案 0 :(得分:1)

如果您想获得nvarchar,可以尝试以下方式:

EXEC sp_execute_external_script
@language = N'R'
, @script = N'
mymodel <- lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData);
coefficients <- paste(names(mymodel$coefficients), mymodel$coefficients, sep="=", collapse = " ");
'
, @input_data_1 = N'select DepVar, IndepVar1, IndepVar2 from myDemoData'
, @input_data_1_name = N'myDemoData'
, @output_data_1_name = N'coefficients'
WITH RESULT SETS (( coefficients nvarchar(max)));

这应该返回字符串

"(Intercept)=123.456 IndepVar1=25.456 IndepVar2=56.382"

答案 1 :(得分:0)

您不需要将模型转换为数据框本身以返回SQL。如果要将整个模型存储在数据库中,则可以在R中转换为原始向量,并将其作为T-SQL中的varbinary(max)输出参数返回。或者,您可以从模型中提取单个组件,如系数,错误作为单个/标量值,然后返回到SQL。

以下是将系数提取为数据帧的示例:

    execute sp_execute_external_script
      @language = N'R'
    , @script = N'
irisModel <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species, data = iris);
irisCoeff <- summary(irisModel)$coefficients;
OutputDataSet <- cbind(name = row.names(irisCoeff), data.frame(irisCoeff));
'
with result sets((Name nvarchar(100), "Estimate" float, "Std.Error" float, "t.value" float, "Pr.value" float))