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

Using sp_execute_external_script, how can I route the metadata of a trained model to output_data_1

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

例如,在 R 脚本的主体中,如果您发出:print(myModel); 它在 SSMS 输出中打印此 window(不是 output_data):

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

Coefficients:
  (Intercept)       IndepVar1  IndepVar2
      123.456       25.456     56.382

是否可以将其放入数据框中?那会更好,因为我还想获取 t 值和 R 平方并将其存储到 table。即使是 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 中遇到的错误是:

消息 39004,级别 16,状态 20,第 0 行 执行 'sp_execute_external_script' 期间出现 'R' 脚本错误 HRESULT 0x80004004。 消息 39019,级别 16,状态 1,第 0 行 发生外部脚本错误: as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) 错误: 无法将 class“"summary.rxLinMod"”强制转换为 data.frame 调用:source ... data.frame -> as.data.frame -> as.data.frame.default ScaleR 中的错​​误。检查输出以获取更多信息。 eval(expr, envir, enclos) 错误: ScaleR 中的错​​误。检查输出以获取更多信息。 调用:source -> withVisible -> eval -> eval -> .Call 执行暂停 消息 11536,级别 16,状态 1,第 2 行 EXECUTE 语句失败,因为指定了它的 WITH RESULT SETS 子句 1 个结果集,但语句在 运行 时间只发送了 0 个结果集。

所以我想知道如何从 SQL 中的 sp_execute_external_script 中获取输出。 MSDN 对 R 本身的介绍不多。 SQL 抱怨模型的输出不能 "coerced" 到数据框。我想知道可以在 R 脚本中进行哪些操作以将其 "tease" 放入数据帧中。

如果你想获得 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)));

这应该 return 字符串

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

您不需要将模型转换为数据框本身到 return 到 SQL。如果你想将整个模型存储在数据库中,那么你可以在 R 中转换为原始向量并 return 它作为 T-SQL 中的 varbinary(max) 输出参数。或者,您可以从模型中提取单个组件,例如系数、作为单个/标量值的误差以及 return 到 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))