私はDeepDive Data Science tutorial on MSDNを使って作業した後、私のSQL Server 2016 RTM仮想マシンにあるクレジットカード詐欺データを扱っています。
ここでは、T-SQL統合Rおよびストアドプロシージャを使用してこのチュートリアルを複製したいと考えています。私は、線形およびロジスティック回帰モデルを実行し、結果をメッセージとして出力し、両方のストアドプロシージャを作成することができます。しかし、私は、sp_execute_external_script
プロシージャを使用しているときに、予測をRでスクリプト化する方法について混乱しています。
これは私が線形およびロジスティック回帰モデルに対して持っているものです。
私がコメント/回答を見て行った変更を反映するようにスクリプトを編集する。ヘルプ詐欺データのhereとheresp_execute_external_scriptプロシージャを使用してSQL Server統合Rで予測(またはスコアリング)を実行するにはどうすればよいですか?
要約統計量から取ら:
CREATE PROC summary_proc
AS
begin
exec sp_execute_external_script
@language = N'R',
@script = N'
sumOut <- rxSummary(
formula = ~gender + balance + numTrans + numIntlTrans + creditLine,
data = ccFraud
)
print(sumOut)
OutputDataset <- data.frame(serialize(sumOut,NULL))
',
@input_data_1 = N'select * from [DeepDive].[db_datareader].[ccFraudSmall]',
@input_data_1_name = N'ccFraud',
@output_data_1_name = N'OutputDataset'
with result sets ((summary varbinary(max)));
END;
線形回帰モデル:
CREATE PROC linear_model
AS
begin
exec sp_execute_external_script
@language = N'R',
@script = N'
linModObj <- rxLinMod(
balance ~ gender + creditLine,
data = ccFraud
) ;
print(linModObj)
OutputDataset <- data.frame(serialize(linModObj, NULL));
',
@input_data_1 = N'select * from [DeepDive].[db_datareader].[ccFraud10]',
@input_data_1_name = N'ccFraud',
@output_data_1_name = N'OutputDataset'
with result sets ((linear_model varbinary(max)));
END;
ロジSTIC回帰モデル:
create table logit_trained_model (
model varbinary (255)
);
CREATE PROC logit_model
AS
begin
insert into logit_trained_model
exec sp_execute_external_script
@language = N'R',
@script = N'
logitObj <- rxLogit(
fraudRisk ~ state + gender + cardholder + balance + numTrans + numIntlTrans + creditLine,
data = ccFraud,
dropFirst = TRUE
);
print(logitObj)
OutputDataset <- data.frame(serialize(logitObj, NULL));
',
@input_data_1 = N'select * from [DeepDive].[db_datareader].[ccFraud10]',
@input_data_1_name = N'ccFraud',
@output_data_1_name = N'OutputDataset'
--with result sets ((logit_model varbinary(max)));
END;
私はロジット回帰モデルに基づいてスコアを予測します。
は、ここで私が今まで持っているものです。
予測/スコア:
CREATE PROC prediction
AS
begin
DECLARE @lmodel2 varbinary(max) = (SELECT top 1 model
FROM logit_trained_model);
exec sp_execute_external_script
@language = N'R',
@script = N'
logit_model_obj <- unserialize(as.raw(model));
print(summary(logit_model_obj))
OutputDataset <- rxPredict(
modelObject = logit_model_obj,
data = ccFraudScore,
outData = NULL,
predVarNames = "ccFraudLogitScore",
type = "link",
writeModelVars = TRUE,
extraVarsToWrite = "custID",
overwrite = TRUE
) ;
str(OutputDataset)
print(OutputDataset)
',
@input_data_1 = N'select * from [DeepDive].[db_datareader].[ccFraudScore10]',
@input_data_1_name = N'ccFraudScore',
@output_data_1_name = N'OutputDataset',
@params = N'@model varbinary(max)',
@model = @lmodel2
WITH RESULT SETS ((Score float));
以前は、スクリプトを編集する前に、エラーがオブジェクトのlogitObj」だったが見つかりません。これは、rxPredict
の外に定義したとき、私がlogitObj
をrxPredict
と呼んでいたためです。 logitObj
をテーブルに挿入するスクリプトを変更し、そのテーブルをrxPredict
で呼び出しました。
上記のすべてのスクリプトは、その変更を反映しています。しかし、ここで私が直面してる新しいエラーです:私が理解から
Msg 39004, Level 16, State 20, Line 76 A 'R' script error occurred during execution of 'sp_execute_external_script' with HRESULT 0x80004004. Msg 39019, Level 16, State 1, Line 76 An external script error occurred: Error in unserialize(as.raw(model)) : read error Calls: source -> withVisible -> eval -> eval -> unserialize Error in ScaleR. Check the output for more information. Error in eval(expr, envir, enclos) : Error in ScaleR. Check the output for more information. Calls: source -> withVisible -> eval -> eval -> .Call Execution halted Msg 11536, Level 16, State 1, Line 78 EXECUTE statement failed because its WITH RESULT SETS clause specified 1 result set(s), but the statement only sent 0 result set(s) at run time.
は、Rは、変数@model
を読み取ることができません。チェックするだけで、変数@lmodel2
のクエリ[SELECT top 1 model FROM logit_trained_model]
を実行して、何かを戻しているかどうかを確認しました。明らかに、そうではありません。テーブルは、データを持たないモデルという名前の列です。
どのようにすればいいですか?
@Arun、私は同じエラーが直面しています。上記の例の 'logit_trained_model'テーブルにデータを取り込むにはどうすればよいですか?そして '@ model'変数からデータを読み込む際に' rxPredict'を助けるでしょうか?私のモデルがシリアライズされていることを除いて、私はかなり同じコードを持っています。これで助けてください。 – Minu