2016-06-24 1 views
2

Je traite des données de fraude de carte de crédit qui réside dans ma machine virtuelle SQL Server 2016 RTM après avoir travaillé via le DeepDive Data Science tutorial on MSDN.
Je veux maintenant reproduire ce tutoriel en utilisant les procédures R et stockées T-SQL intégrées. Je suis capable d'exécuter les modèles de régression linéaire et logistique, d'imprimer les résultats sous forme de messages et de créer des procédures stockées pour les deux. Cependant, je suis confus quant à la façon dont la prédiction doit être scriptée dans R tout en utilisant la procédure sp_execute_external_script.

C'est ce que j'ai pour les modèles de régression linéaire et logistique.

Modification des scripts pour refléter les modifications que j'ai apportées après avoir consulté les commentaires/réponses. Aide de prise here et hereComment exécuter une prédiction (ou un scoring) dans SQL Server R intégré à l'aide de la procédure sp_execute_external_script?

Statistiques sommaires de la fraude de données:

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; 

régression linéaire Modèle:

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; 

Logi CSTI Modèle de régression:

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; 

Je veux prédire les scores basés sur le modèle de régression logistique.
Voici ce que j'ai jusqu'à présent:

Prévision/Notation:

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)); 

Auparavant, avant de modifier les scripts, l'erreur était objet 'logitObj' not found. C'était parce que je faisais référence à logitObj à l'intérieur rxPredict quand il a été défini en dehors de rxPredict.
J'ai apporté des modifications à mon script pour insérer logitObj dans une table et appeler cette table au rxPredict.
Tous les scripts ci-dessus reflètent ce changement. Mais voici la nouvelle erreur que je suis face:

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.


D'après ce que je comprends, R ne peut pas lire la @model variable. Juste pour vérifier, j'ai couru la requête [SELECT top 1 model FROM logit_trained_model] pour la variable @lmodel2 pour voir si elle rapporte quelque chose. Apparemment, ce n'est pas le cas. La table est juste une colonne nommée modèle sans données.

Comment y accéder?

+1

@Arun, je fais face à la même erreur. Comment obtenir la table 'logit_trained_model' (de l'exemple ci-dessus) remplie? Et cela aidera-t-il 'rxPredict' à lire les données de la variable' @ model'? J'ai à peu près le même code, sauf que mes modèles sont sérialisés _as.raw_. S'il vous plaît aidez avec ceci. – Minu

Répondre