Microsoft SQl Server ML Services: Пакет RevoScaleR
1
2
3
4
5
6
7
8
9
|
EXECUTE sp_execute_external_script @language=N'R'
,@script = N'require("RevoScaleR")
formula=strength~cement+ash+age+water
Model_1=rxLinMod(formula,data=inputDataSet)
Model=data.frame(payload = as.raw(serialize(Model_1, connection=NULL)))'
,@input_data_1 = N'Select strength,cement,ash,age,water from [dbo].[concrete]; '
, @output_data_1_name = N'Model'
,@input_data_1_name = N'inputDataSet'
WITH RESULT SETS (([concreteModel] varbinary(max) NOT NULL ));
|
От второй до пятой строки расположен соответствующий код R, который хранится в параметре @script. Код содержит ссылку на пакет RevoScaler с использованием функции require. Нет необходимости устанавливать этот пакет, поскольку он существует в службах ML / R. Вторая строка кода R - это создание формулы. Наша цель - предсказать силу взаимодействия относительно некоторых других переменных. Формула, которая может создать это, - это формула = прочность ~ цемент + зола + возраст + вода, которая хранит формулу в переменной «формула». В третьей строке создайте модель, используя функцию rxLinMod, чтобы создать линейную модель из формулы. Наконец, последняя строка сохраняет формулу в выходной переменной с именем «Model».
@ input_data_1 хранит данные, собранные из базы данных SQL, используя SQL-запрос «N’Select strength,cement,ash,age,water from [dbo].[concrete]». Наконец, выходная переменная «Model» будет хранить линейную модель.
После создания модели мы хотим сохранить модель для будущего, чтобы повторно использовать ее для прогнозирования новых данных. Чтобы сохранить модель, мы используем следующие коды:
1 2 3 4 5 6 7 8 |
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[LinearModel]') AND [type] IN (N'U')) BEGIN CREATE TABLE [dbo].[LinearModel]( [Model] [varbinary](MAX) NULL ); END |
Затем нам нужно вставить модель в таблицу «LinearModel».
1 2 3 4 5 6 7 8 9 |
Insert into [dbo].[LinearModel] EXECUTE sp_execute_external_script @language=N'R' ,@script = N'require("RevoScaleR") formula=strength~cement+ash+age+water Model_1=rxLinMod(formula,data=inputDataSet) Model=data.frame(payload = as.raw(serialize(Model_1, connection=NULL)))' ,@input_data_1 = N'Select strength,cement,ash,age,water from [dbo].[concrete]; ' , @output_data_1_name = N'Model' ,@input_data_1_name = N'inputDataSet' |
Модель уже сохранена в базе данных. Теперь в другой хранимой процедуре мы будем использовать модель.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
declare @rx_model varbinary(max) = (select [Model] from [dbo].[LinearModel] ); exec sp_execute_external_script @language = N'R' , @script = N' require("RevoScaleR"); cdr_model<-unserialize(rx_model); predictions <- rxPredict(modelObject = cdr_model, data = PredictionData) prediction <-as.data.frame(predictions);' , @input_data_1 = N'Select strength,cement,ash,age,water from [dbo].[concrete]' , @input_data_1_name = N'PredictionData' , @output_data_1_name=N'prediction' , @params = N'@rx_model varbinary(max)' , @rx_model = @rx_model with result sets (("prediction" float not null )) ; |
Существует еще один вход для процедуры хранения, который не является только набором данных, он содержит входные данные для моделей, которые мы уже сохранили в базе данных.
При запуске хранимой процедуры был показан следующий результат:
Существуют и другие модели регрессионного анализа цели, такие как rxLogit, которые используют для логистической регрессии, rxGlm, которые обобщают линейную модель на данные и т. д. Более того, для других типов анализа, такого как прогнозирование группы (классификации), существуют некоторые алгоритмы, такие как rxDTree, rxBTree, rxDForest и rxNaiveBayes