В продолжение предыдущей статьи поговорим о том, как использовать SQL Server Machine Learning Services. В этой статье приведены варианты использования на языке R.
Для чего должна быть установлена R 4.2.1(https://cran.r-project.org/src/base/R-4/).
Также нам потребуется пакет e1071, его можно установить в R Gui (меню) Пакеты -> Установить пакет.
Если же у вас тоже windows и это не будет работать как и у меня, скачивайте пакет c CRAN и выбирайте Пакеты -> Установить пакеты из локальных файлов, а затем скаченный архив.
Некоторые пакеты требуют установки всех зависимостей, поэтому лучше устранить ошибки загрузки пакетов, если они у вас есть. Список ошибок и пути их решения описаны в блоге у Алексея Селезнева.
Для знакомства с возможностями SQL Server в машинном обучении используется датасет с пассажирами Титаника с Kaggle.
Это самое популярное состязание и есть очень много статей и примеров кода для работы с датасетом, поэтому даже если вы совсем не знаете R получится построить простые модели и визуализацию для датасета.
Идея SQL Server сервисов машинного обучения в том, чтобы работать с данными в БД и анализировать их никуда не выгружая, для нашего эксперимента нужно будет наоборот загрузить данные из csv в SQL Server.
Скачиваем csv файлы с Kaggle.
В SQL Server Management Studio запускаем скрипт создания БД titanic:
CREATE DATABASE titanic;
На созданной БД выбираем правой кнопкой в студии “Задачи -> Импорт неструктурированного файла”:
Далее указываем путь к файлу с датасетом train.csv Титаника (таблицу инструмент создаст), и проходим Далее без изменения структуры таблицы или столбцов.
Тоже самое проделываем со вторым файлом test.csv.
Запустим простые скрипты, которые считают процент выживших среди мужчин и женщин:
EXEC sp_execute_external_script @language =N'R'
, @script=N'total_women <- sum(train_data$Sex == ''female'')
# Get the total number of women who survived
survived_women <- sum(train_data[which(train_data$Sex == ''female''), "Survived"])
rate_women = survived_women/total_women
print(total_women)
print(survived_women)
print(rate_women)'
, @input_data_1 =N'SELECT * from dbo.train'
, @input_data_1_name = N'train_data';
GO
EXEC sp_execute_external_script @language =N'R'
, @script=N'# Get the total number of men on the titanic
total_men <- sum(train_data$Sex == ''male'')
# Get the total number of women who survived
survived_men <- sum(train_data[which(train_data$Sex == ''male''), "Survived"])
rate_men = survived_men/total_men
paste("% of men who survived:", rate_men * 100)
print(total_men)
print(survived_men)
print(rate_men)'
, @input_data_1 =N'SELECT * from dbo.train'
, @input_data_1_name = N'train_data';
GO
Далее нам потребуются библиотеки R. Иногда SQL Server не видит библиотек, даже если вы установили их через R приложение:
Для того, чтобы понять есть ли нужная библиотека в доступе SQL Server запустите скрипт:
EXEC sp_execute_external_script @language = N'R', @script = N'OutputDataSet <- data.frame(installed.packages())'
Если нужной библиотеки не нашлось, то нужно перейти в каталог SQL Server и установить ее с помощью R.exe (подробнее описано https://www.mssqltips.com/sqlservertip/4760/common-issues-with-r-services-packages/)
У меня SQL Server находится по пути E:\Microsoft SQL Server\MSSQL15.MSSQL2019\R_SERVICES\bin
В норме это будет C:\Program files\Microsoft SQL Server\MSSQL15.<instance_name>\R_SERVICES\bin
В окне R.exe запустите команду установки пакетов (Install Packages from Repositories or Local Files)
install.packages("название пакета", "директория MS SQL Server R Library")
В моем случае это:
install.packages("e1071", "E:\\Microsoft SQL Server\\MSSQL15.MSSQL2019\\R_SERVICES\\library", dependencies=TRUE, repos='http://cran.rstudio.com/')
Проверяем наличие пакета в SSMS:
Запускаем создание модели:
EXEC sp_execute_external_script
@language = N'R'
, @script = N'
library(e1071);
fit <-naiveBayes(as.factor(Survived) ~ Pclass + Sex + SibSp + Parch, data=train_data);
trained_model <- data.frame(payload = as.raw(serialize(fit, connection=NULL)));
'
, @input_data_1 = N'SELECT * from dbo.train'
, @input_data_1_name = N'train_data'
, @output_data_1_name = N'trained_model'
WITH RESULT SETS ((model varbinary(max)));
Получаем модель и можем ее использовать на тестовых данных из таблицы test, которая получена из загрузки test.csv.
Далее используем несколько входных данных. Для того, чтобы к вашему инстансу можно было подключиться включите TCP/IP
Затем создайте пользователя для подключения к БД
CREATE LOGIN [usrdemo] WITH PASSWORD=N'usrdemo', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER [usrdemo] FOR LOGIN [usrdemo] WITH DEFAULT_SCHEMA=[dbo]
GO
Запускаем создание модели, а затем предсказание на данных из датасета test
USE titanic;
DECLARE @rscript NVARCHAR(MAX),
@sqlscript NVARCHAR(MAX);
SET @rscript = N'
library(e1071);
# train data from InputDataSet
train_data <- InputDataSet
# test from table
conn <- "Driver={SQL Server};Server=VKS\\MSSQL2019;Database=titanic;Uid=usrdemo;Pwd=usrdemo"
query <- "SELECT * FROM dbo.test;"
test_data <- RxSqlServerData(connectionString = conn, sqlQuery = query)
test_data <- rxDataStep(test_data)
fit <-naiveBayes(as.factor(Survived) ~ Pclass + Sex + SibSp + Parch, data=train_data);
trained_model <- data.frame(payload = as.raw(serialize(fit, connection=NULL)));
pred <- predict(fit, test_data, writeModelVars = TRUE)
submission <- data.frame(PassengerId = test_data$PassengerId, Survived = pred)
';
SET @sqlscript = N'SELECT * FROM dbo.train;';
EXEC sp_execute_external_script
@language = N'R',
@script = @rscript,
@input_data_1 = @sqlscript,
@output_data_1_name = N'submission'
WITH RESULT SETS ((PassengerId int, Survived BIT));
GO
Далее можно поэкспериментировать с датасетом - обогатить другими полями и добавить их в формулу, чтобы предсказание получилось более точным.
Также с помощью R можно делать визуализацию данных, но об этом мы поговорим на открытом уроке.