R-интеграция с 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, уровень 16, состояние 20, строка 0 Произошла ошибка сценария «R» во время выполнения sp_execute_external_script с HRESULT 0x80004004. Msg 39019, уровень 16, состояние 1, строка 0 Произошла ошибка внешнего сценария: ошибка в as.data.frame.default (x [[i]], необязательный = TRUE, stringsAsFactors = stringsAsFactors): не удается принудить сводку класса "". rxLinMod "" в data.frame Вызовы: source ... data.frame -> as.data.frame -> as.data.frame.default Ошибка в ScaleR. Проверьте вывод для получения дополнительной информации. Ошибка в eval (expr, envir, enclos): ошибка в ScaleR. Проверьте вывод для получения дополнительной информации. Вызовы: source -> withVisible -> eval -> eval -> .Call Выполнение остановлено Msg 11536, уровень 16, состояние 1, строка 2 Оператор EXECUTE завершился неудачно, поскольку в его предложении WITH RESULT SETS указан 1 набор результатов, но только оператор отправил 0 наборов результатов во время выполнения.

Поэтому мне интересно, как получить этот вывод из sp_execute_external_script в SQL. MSDN не очень много рассказывает о самом R. SQL жалуется, что выходные данные модели не могут быть «принудительно преобразованы» во фрейм данных. Мне интересно, какие манипуляции в R-Script можно сделать, чтобы «дразнить» его в фрейм данных.

1
Rick Bellows 11 Май 2016 в 01:08

2 ответа

Лучший ответ

Если вы хотите получить 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
HubertL 11 Май 2016 в 00:23

Вам не нужно преобразовывать модель во фрейм данных как таковой, чтобы вернуться к SQL. Если вы хотите сохранить всю модель в базе данных, вы можете преобразовать его в необработанный вектор в R и вернуть его как выходной параметр varbinary (max) в T-SQL. В качестве альтернативы вы можете извлечь из модели отдельные компоненты, такие как коэффициенты, ошибки, как отдельные / скалярные значения, и вернуться к 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))
1
Umachandar - Microsoft 10 Июн 2016 в 21:27