Published on

October 2, 2017

Выполнение аналитики в базе данных SQL Server

SQL Server сделал значительные прогресс в интеграции языков машинного обучения и статистического анализа в свой движок базы данных. Начиная с SQL Server 2016, Microsoft представила интеграцию языка R, а в SQL Server 2017 был добавлен Python. Эти языки позволяют пользователям применять аналитику непосредственно к данным, обеспечивая возможность получения предсказаний практически в режиме реального времени с использованием различных алгоритмов машинного обучения.

В этой статье мы рассмотрим три метода, доступных для выполнения аналитики в базе данных SQL Server, а также их преимущества, недостатки и ограничения.

Метод 1: Построение модели машинного обучения непосредственно в SQL Server

Для начала нам необходимо обучить модель. Мы можем сделать это, создав модель машинного обучения непосредственно в SQL Server. Для этой демонстрации мы будем использовать набор данных об автомобилях, доступный из UC Irvine Machine Learning Repository. После очистки данных и загрузки их в таблицу, мы разделяем данные на обучающую и тестовую таблицы.

-- Выберите 10% строк в новую тестовую таблицу
SELECT TOP 10 PERCENT * 
INTO Automobile_test
FROM Automobile

-- Поместите оставшиеся 90% в таблицу для обучения
SELECT * 
INTO Automobile_train
FROM Automobile
EXCEPT
SELECT TOP 10 PERCENT * FROM Automobile

Затем мы создаем таблицу для хранения нашей обученной модели. Эта таблица будет содержать имя модели, версию и саму обученную модель, хранящуюся в виде VARBINARY(MAX).

CREATE TABLE models 
(
	model_name nvarchar(100) not null,
	model_version nvarchar(100) not null,
	model_object varbinary(max) not null
)

После того, как у нас есть место для хранения обученной модели, мы можем приступить к обучению модели. Мы включаем функцию внешних сценариев, которая позволяет нам писать код на языке R или Python непосредственно в запросе SQL Server. Затем мы используем язык программирования R для обучения модели и сохранения ее в таблице моделей.

DECLARE @model VARBINARY(MAX)
EXEC sp_execute_external_script 
	@language = N'R', 
	@script = N'
		automobiles.linmod <- rxLinMod(price ~ wheel_base + length + width + height + curb_weight + engine_size + horsepower, data = automobiles)
		model <- rxSerializeModel(automobiles.linmod, realtimeScoringOnly = FALSE)',
	@input_data_1 = N'
		SELECT * 
		FROM Automobile_Train',
	@input_data_1_name = N'automobiles',
	@params = N'@model varbinary(max) OUTPUT',
	@model = @model OUTPUT

INSERT models
(
	model_name, 
	model_version, 
	model_object
)
VALUES
(
	'automobiles.linmod',
	'v1', 
	@model
)

Метод 2: Предсказание с использованием sp_execute_external_script

Первый метод выполнения предсказаний в базе данных – использование того же метода, который мы использовали для обучения модели машинного обучения, sp_execute_external_script. Этот метод обеспечивает гибкость и не зависит от конкретных алгоритмов или функций. Мы можем использовать как R, так и Python, и даже импортировать библиотеки, такие как ggplot или dplyr. Однако для его использования необходимо включить функцию R в базе данных во время установки SQL Server.

DECLARE @lin_model_raw VARBINARY(MAX) = (SELECT model_object FROM models WHERE model_name = 'automobiles.linmod')

EXECUTE sp_execute_external_script
	@language = N'R',
	@script = N'
		model = rxUnserializeModel(lin_model);
		automobiles_prediction = rxPredict(model, automobiles_test)
		automobiles_pred_results <- cbind(automobiles_test, automobiles_prediction)',
	@input_data_1 = N'
		SELECT
			wheel_base,
			length,
			width,
			height,
			curb_weight,
			engine_size,
			horsepower,
			price 
		FROM Automobile_Test',
	@input_data_1_name = N'automobiles_test',
	@output_data_1_name = N'automobiles_pred_results',
	@params = N'@lin_model varbinary(max)',
	@lin_model = @lin_model_raw
WITH RESULT SETS (("wheel_base" FLOAT, "length" FLOAT, "width" FLOAT, "height" FLOAT, "curb_weight" FLOAT, "engine_size" FLOAT, "horsepower" FLOAT, "price" FLOAT, "predicted_price" FLOAT))

Метод 3: Предсказание с использованием sp_rxPredict

Второй метод выполнения предсказаний в базе данных – использование sp_rxPredict, библиотеки на основе CLR, оптимизированной для быстрых предсказаний в режиме реального времени. Для этого метода требуется включение интеграции CLR и отметка базы данных как доверенной. Он поддерживает только алгоритмы RevoScaleR и MicrosoftML и предполагает наличие предварительно обученной модели в SQL Server.

DECLARE @lin_model_raw VARBINARY(MAX) = (SELECT model_object FROM models WHERE model_name = 'automobiles.linmod')

EXEC sp_rxPredict 
	@model = @lin_model_raw,
	@inputData = N'
		SELECT
			wheel_base,
			length,
			width,
			height,
			curb_weight,
			engine_size,
			horsepower,
			price 
		FROM Automobile_Test'

Метод 4: Предсказание с использованием PREDICT

Третий метод выполнения предсказаний в базе данных – использование функции PREDICT, введенной в SQL Server 2017. Этот метод позволяет легко интегрировать его в синтаксис T-SQL и не требует включения функции машинного обучения в базе данных. Однако он поддерживает только алгоритмы RevoScaleR и доступен только в SQL Server 2017.

DECLARE @lin_model_raw VARBINARY(MAX) = (SELECT model_object FROM models WHERE model_name = 'automobiles.linmod')

SELECT 
	a.*, 
	p.*
FROM PREDICT(MODEL = @lin_model_raw, DATA = dbo.Automobile_test as a)
WITH("price_Pred" float) as p;

Вывод

В заключение, мы рассмотрели три метода, доступных в SQL Server 2016 и 2017 для выполнения предсказаний в базе данных. Каждый метод имеет свои преимущества и недостатки:

  • sp_execute_external_script: Поддерживает как R, так и Python, обеспечивает гибкость, но требует включения функции R в базе данных
Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.