2016-06-24 9 views
2

私はDeepDive Data Science tutorial on MSDNを使って作業した後、私のSQL Server 2016 RTM仮想マシンにあるクレジットカード詐欺データを扱っています。
ここでは、T-SQL統合Rおよびストアドプロシージャを使用してこのチュートリアルを複製したいと考えています。私は、線形およびロジスティック回帰モデルを実行し、結果をメッセージとして出力し、両方のストアドプロシージャを作成することができます。しかし、私は、sp_execute_external_scriptプロシージャを使用しているときに、予測をRでスクリプト化する方法について混乱しています。

これは私が線形およびロジスティック回帰モデルに対して持っているものです。

私がコメント/回答を見て行った変更を反映するようにスクリプトを編集する。ヘルプ詐欺データのhereheresp_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の外に定義したとき、私がlogitObjrxPredictと呼んでいたためです。
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]を実行して、何かを戻しているかどうかを確認しました。明らかに、そうではありません。テーブルは、データを持たないモデルという名前の列です。

どのようにすればいいですか?

+1

@Arun、私は同じエラーが直面しています。上記の例の 'logit_trained_model'テーブルにデータを取り込むにはどうすればよいですか?そして '@ model'変数からデータを読み込む際に' rxPredict'を助けるでしょうか?私のモデルがシリアライズされていることを除いて、私はかなり同じコードを持っています。これで助けてください。 – Minu

答えて

関連する問題