From 48dd84f358a5ad558b82d295a63b85d2bed2a243 Mon Sep 17 00:00:00 2001 From: nelgson Date: Thu, 9 Nov 2017 14:29:13 -0800 Subject: [PATCH] Irid demo scripts updated --- .../r/iris/0-setup schema.sql | 32 +++++++ ...-native-scoring.sql => 1-R-iris-train.sql} | 37 +------- .../r/iris/2-R-iris-score.sql | 31 ++++++ .../r/iris/3-iris-native-scoring.sql | 22 +++++ .../machine-learning-services/r/iris/iris.sql | 94 ------------------- 5 files changed, 88 insertions(+), 128 deletions(-) create mode 100644 samples/features/machine-learning-services/r/iris/0-setup schema.sql rename samples/features/machine-learning-services/r/iris/{iris-native-scoring.sql => 1-R-iris-train.sql} (54%) create mode 100644 samples/features/machine-learning-services/r/iris/2-R-iris-score.sql create mode 100644 samples/features/machine-learning-services/r/iris/3-iris-native-scoring.sql delete mode 100644 samples/features/machine-learning-services/r/iris/iris.sql diff --git a/samples/features/machine-learning-services/r/iris/0-setup schema.sql b/samples/features/machine-learning-services/r/iris/0-setup schema.sql new file mode 100644 index 0000000000..1a6644d447 --- /dev/null +++ b/samples/features/machine-learning-services/r/iris/0-setup schema.sql @@ -0,0 +1,32 @@ + +CREATE DATABASE sqlr; +GO +USE sqlr; +GO +/* Step 1: Setup schema */ +drop table if exists iris_data, iris_models; +go +create table iris_data ( + id int not null identity primary key + , "Sepal.Length" float not null, "Sepal.Width" float not null + , "Petal.Length" float not null, "Petal.Width" float not null + , "Species" varchar(100) null +); +create table iris_models ( + model_name varchar(30) not null primary key, + model varbinary(max) not null, + native_model varbinary(max) not null +); +go + +/* Step 2: Populate test data from iris dataset in R */ +insert into iris_data +("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species") +execute sp_execute_external_script + @language = N'R' + , @script = N'iris_data <- iris;' + , @input_data_1 = N'' + , @output_data_1_name = N'iris_data'; +go + + diff --git a/samples/features/machine-learning-services/r/iris/iris-native-scoring.sql b/samples/features/machine-learning-services/r/iris/1-R-iris-train.sql similarity index 54% rename from samples/features/machine-learning-services/r/iris/iris-native-scoring.sql rename to samples/features/machine-learning-services/r/iris/1-R-iris-train.sql index 91a1240cef..2b252d416f 100644 --- a/samples/features/machine-learning-services/r/iris/iris-native-scoring.sql +++ b/samples/features/machine-learning-services/r/iris/1-R-iris-train.sql @@ -1,32 +1,7 @@ -Use sqlr; +USE sqlr; GO -/* Step 1: Setup schema */ -drop table if exists iris_data, iris_models; -go -create table iris_data ( - id int not null identity primary key - , "Sepal.Length" float not null, "Sepal.Width" float not null - , "Petal.Length" float not null, "Petal.Width" float not null - , "Species" varchar(100) null -); -create table iris_models ( - model_name varchar(30) not null primary key, - model varbinary(max) not null, - native_model varbinary(max) not null -); -go - -/* Step 2: Populate test data from iris dataset in R */ -insert into iris_data -("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species") -execute sp_execute_external_script - @language = N'R' - , @script = N'iris_data <- iris;' - , @input_data_1 = N'' - , @output_data_1_name = N'iris_data'; -go -/* Step 3: Create procedure for training model */ +/* Step 1: Create procedure for training model */ create or alter procedure generate_iris_model (@trained_model varbinary(max) OUTPUT, @native_trained_model varbinary(max) OUTPUT) as @@ -55,7 +30,7 @@ from iris_data' end; go -/* Step 3: Train & store a decision tree model that will predict species of flowers */ +/* Step 2: Train & store a decision tree model that will predict species of flowers */ declare @model varbinary(max), @native_model varbinary(max); exec generate_iris_model @model OUTPUT, @native_model OUTPUT; delete from iris_models where model_name = 'iris.dtree'; @@ -64,10 +39,4 @@ select model_name, datalength(model)/1024. as model_size_kb, datalength(native_m from iris_models; go -/* Step 4: Generate predictions using PREDICT function */ -declare @native_model varbinary(max) = - (select native_model from iris_models where model_name = 'iris.dtree'); -select p.*, d.Species as "Species.Actual", d.id - from PREDICT(MODEL = @native_model, DATA = dbo.iris_data as d) - with(setosa_Pred float, versicolor_Pred float, virginica_Pred float) as p; diff --git a/samples/features/machine-learning-services/r/iris/2-R-iris-score.sql b/samples/features/machine-learning-services/r/iris/2-R-iris-score.sql new file mode 100644 index 0000000000..d6378962c3 --- /dev/null +++ b/samples/features/machine-learning-services/r/iris/2-R-iris-score.sql @@ -0,0 +1,31 @@ +USE sqlr; +GO + +/* Create procedure for scoring using the decision tree model */ +create or alter procedure predict_iris_species (@model varchar(100)) +as +begin + declare @rx_model varbinary(max) = (select model from iris_models where model_name = @model); + -- Predict based on the specified model: + exec sp_execute_external_script + @language = N'R' + , @script = N' +# Unserialize model from SQL Server +irismodel<-unserialize(rx_model); + +# Predict species for new data using rxDTree model +OutputDataSet <-rxPredict(irismodel, iris_rx_data, extraVarsToWrite = c("Species", "id")); + ' + , @input_data_1 = N' +select id, "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" +from iris_data' + , @input_data_1_name = N'iris_rx_data' + , @params = N'@rx_model varbinary(max)' + , @rx_model = @rx_model + with result sets ( ("setosa_Pred" float, "versicolor_Pred" float, "virginica_Pred" float, "Species.Actual" varchar(100), "id" int)); +end; +go + +/* Test scoring of model */ +exec predict_iris_species 'iris.dtree'; +go diff --git a/samples/features/machine-learning-services/r/iris/3-iris-native-scoring.sql b/samples/features/machine-learning-services/r/iris/3-iris-native-scoring.sql new file mode 100644 index 0000000000..05e0533ab1 --- /dev/null +++ b/samples/features/machine-learning-services/r/iris/3-iris-native-scoring.sql @@ -0,0 +1,22 @@ +Use sqlr; +GO + +create or alter procedure native_predict_iris_species +as +begin + declare @native_model varbinary(max) = (select native_model from iris_models where model_name = 'iris.dtree'); + -- Predict using native scoring on the specified model: + /*Generate predictions using PREDICT function */ + +select p.*, d.Species as "Species.Actual", d.id + from PREDICT(MODEL = @native_model, DATA = dbo.iris_data as d) + with(setosa_Pred float, versicolor_Pred float, virginica_Pred float) as p; + +end; +go + +EXECUTE native_predict_iris_species; + + + + diff --git a/samples/features/machine-learning-services/r/iris/iris.sql b/samples/features/machine-learning-services/r/iris/iris.sql deleted file mode 100644 index d326fe9ed6..0000000000 --- a/samples/features/machine-learning-services/r/iris/iris.sql +++ /dev/null @@ -1,94 +0,0 @@ -USE sqlr; -GO -/* Step 1: Setup schema */ -drop table if exists iris_data, iris_models; -go -create table iris_data ( - id int not null identity primary key - , "Sepal.Length" float not null, "Sepal.Width" float not null - , "Petal.Length" float not null, "Petal.Width" float not null - , "Species" varchar(100) null -); -create table iris_models ( - model_name varchar(30) not null primary key, - model varbinary(max) not null, - native_model varbinary(max) not null -); -go - -/* Step 2: Populate test data from iris dataset in R */ -insert into iris_data -("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species") -execute sp_execute_external_script - @language = N'R' - , @script = N'iris_data <- iris;' - , @input_data_1 = N'' - , @output_data_1_name = N'iris_data'; -go - -/* Step 3: Create procedure for training model */ -create or alter procedure generate_iris_model -(@trained_model varbinary(max) OUTPUT, @native_trained_model varbinary(max) OUTPUT) -as -begin - execute sp_execute_external_script - @language = N'R' - , @script = N' -# Build decision tree model to predict species based on sepal/petal attributes -iris_model <- rxDTree(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_rx_data); - -# Serialize model to binary format for storage in SQL Server -trained_model <- as.raw(serialize(iris_model, connection=NULL)); - -# Serialize model to native binary format for scoring using PREDICT function in SQL Server -native_trained_model <- rxSerializeModel(iris_model, realtimeScoringOnly = TRUE) -' - , @input_data_1 = N' -select "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" -from iris_data' - , @input_data_1_name = N'iris_rx_data' - - , @params = N' -@trained_model varbinary(max) OUTPUT, @native_trained_model varbinary(max) OUTPUT' - , @trained_model = @trained_model OUTPUT - , @native_trained_model = @native_trained_model OUTPUT; -end; -go - -/* Step 3: Train & store a decision tree model that will predict species of flowers */ -declare @model varbinary(max), @native_model varbinary(max); -exec generate_iris_model @model OUTPUT, @native_model OUTPUT; -delete from iris_models where model_name = 'iris.dtree'; -insert into iris_models (model_name, model, native_model) values('iris.dtree', @model, @native_model); -select model_name, datalength(model)/1024. as model_size_kb, datalength(native_model)/1024. as native_model_size_kb - from iris_models; -go - -/* Step 4: Create procedure for scoring using the decision tree model */ -create or alter procedure predict_iris_species (@model varchar(100)) -as -begin - declare @rx_model varbinary(max) = (select model from iris_models where model_name = @model); - -- Predict based on the specified model: - exec sp_execute_external_script - @language = N'R' - , @script = N' -# Unserialize model from SQL Server -irismodel<-unserialize(rx_model); - -# Predict species for new data using rxDTree model -OutputDataSet <-rxPredict(irismodel, iris_rx_data, extraVarsToWrite = c("Species", "id")); - ' - , @input_data_1 = N' -select id, "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" -from iris_data' - , @input_data_1_name = N'iris_rx_data' - , @params = N'@rx_model varbinary(max)' - , @rx_model = @rx_model - with result sets ( ("setosa_Pred" float, "versicolor_Pred" float, "virginica_Pred" float, "Species.Actual" varchar(100), "id" int)); -end; -go - -/* Step 5: Test scoring of model */ -exec predict_iris_species 'iris.dtree'; -go