Руководство по R. Обучение и сохранение модели

Область применения: SQL Server 2016 (13.x) и более поздних версий Управляемый экземпляр SQL Azure

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

Работая с этой статьей, вы узнаете о следующем.

  • Создание и обучение модели с помощью хранимой процедуры SQL
  • Сохранение обученной модели в таблице SQL

В первой части были установлены необходимые компоненты и восстановлена демонстрационная база данных.

Во второй части вы узнали, как проверить пример данных и создать несколько графиков.

В третьей части вы узнали, как создавать функции из необработанных данных с помощью функции Transact-SQL. Затем вы вызвали эту функцию из хранимой процедуры, чтобы создать таблицу, содержащую значения характеристик.

Из пятой части вы узнаете, как ввести в эксплуатацию модели, которые были обучены и сохранены в соответствии с инструкциями в четвертой части.

Создание хранимой процедуры

При вызове R из T-SQL используется системная хранимая процедура sp_execute_external_script. Однако для часто повторяемых процессов (например, повторное обучение модели) проще инкапсулировать вызов процедуры sp_execute_external_script в другую хранимую процедуру.

  1. В Management Studio откройте новое окно запроса .

  2. Выполните следующую инструкцию, чтобы создать хранимую процедуру RTrainLogitModel. Эта хранимая процедура определяет входные данные и использует glm для создания модели логистической регрессии.

    CREATE PROCEDURE [dbo].[RTrainLogitModel] (@trained_model varbinary(max) OUTPUT)
    
    AS
    BEGIN
      DECLARE @inquery nvarchar(max) = N'
        select tipped, fare_amount, passenger_count,trip_time_in_secs,trip_distance,
        pickup_datetime, dropoff_datetime,
        dbo.fnCalculateDistance(pickup_latitude, pickup_longitude,  dropoff_latitude, dropoff_longitude) as direct_distance
        from nyctaxi_sample
        tablesample (70 percent) repeatable (98052)
    '
    
      EXEC sp_execute_external_script @language = N'R',
                                      @script = N'
    ## Create model
    logitObj <- glm(tipped ~ passenger_count + trip_distance + trip_time_in_secs + direct_distance, data = InputDataSet, family = binomial)
    summary(logitObj)
    
    ## Serialize model 
    trained_model <- as.raw(serialize(logitObj, NULL));
    ',
      @input_data_1 = @inquery,
      @params = N'@trained_model varbinary(max) OUTPUT',
      @trained_model = @trained_model OUTPUT; 
    END
    GO
    
    • Чтобы оставить часть данных для тестирования модели, из таблицы данных по работе такси случайным образом выбирается 70 % данных, которые будут использованы для обучения.

    • Запрос SELECT использует пользовательскую скалярную функцию fnCalculateDistance для вычисления прямого расстояния между местами посадки и высадки. Результаты выполнения запроса сохраняются во входной переменной R по умолчанию InputDataset.

    • Этот скрипт R вызывает функцию R glm для создания модели логистической регрессии.

      Двоичная переменная tipped применяется в качестве столбца меток или результатов, и модель компонуется с использованием следующих столбцов характеристик: passenger_count, trip_distance, trip_time_in_secs и direct_distance.

    • Модель обучения, сохраненная в переменной R logitObj, сериализуется и возвращается в качестве выходного параметра.

Обучение и развертывание модели R с помощью хранимой процедуры

Поскольку хранимая процедура уже включает в себя определение входных данных, указывать входной запрос не требуется.

  1. Для обучения и развертывания модели R вызовите хранимую процедуру и вставьте ее в таблицу базы данных nyc_taxi_models, чтобы ее можно было использовать для будущих прогнозов:

    DECLARE @model VARBINARY(MAX);
    EXEC RTrainLogitModel @model OUTPUT;
    INSERT INTO nyc_taxi_models (name, model) VALUES('RTrainLogit_model', @model);
    
  2. Просмотрите окно "Сообщения" в Среде Management Studio для сообщений, которые будут переданы в поток stdout R, как показано в следующем сообщении:

    "Сообщения STDOUT из внешнего скрипта: строки считываются: 1193025, всего обработанных строк: 1193025, общее время блока: 0,093 секунды"

  3. После выполнения инструкции откройте таблицу nyc_taxi_models. Обработка данных и компоновка модели может занять некоторое время.

    Вы увидите, что была добавлена одна новая строка, которая содержит сериализованную модель в столбце model и имя модели RTrainLogit_model в столбце name.

    model                        name
    ---------------------------- ------------------
    0x580A00000002000302020....  RTrainLogit_model
    

В следующей части этого учебника обученная модель будет использоваться для создания прогнозов.

Следующие шаги

Работая с этой статьей, вы выполните следующие задачи:

  • Создание и обучение модели с помощью хранимой процедуры SQL
  • Обученная модель сохранена в таблице SQL