Share via


R 자습서: 모델 학습 및 저장

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL Managed Instance

이 5부 자습서 시리즈의 4부에서는 R을 사용하여 기계 학습 모델을 학습시키는 방법을 알아봅니다. 이전 부분에서 만든 데이터 기능을 사용하여 모델을 학습시킨 다음, 학습된 모델을 SQL Server 테이블에 저장합니다. 이 경우 R 패키지는 이미 R Services(In-database)와 함께 설치되어 있으므로 모든 작업을 SQL에서 수행할 수 있습니다.

이 문서에서는 다음을 수행합니다.

  • SQL 저장 프로시저를 사용하여 모델 만들기 및 학습
  • 학습된 모델을 SQL 테이블에 저장

1부에서는 사전 요구 사항을 설치하고 샘플 데이터베이스를 복원했습니다.

2부에서는 샘플 데이터를 검토하고 몇 가지 플롯을 생성했습니다.

3부에서는 Transact-SQL 함수를 사용하여 원시 데이터에서 기능을 만드는 방법을 배웠습니다. 그런 다음 저장 프로시저에서 해당 함수를 호출하여 기능 값이 포함된 테이블을 만들었습니다.

5부에서는 4부에서 학습시키고 저장한 모델을 운영하는 방법을 알아봅니다.

저장 프로시저 만들기

T-SQL에서 R을 호출하는 경우 시스템 저장 프로시저 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을 호출하여 로지스틱 회귀 모델을 만듭니다.

      이진 변수 tippedlabel 또는 결과 열로 사용되며, 모델은 passenger_count, trip_distance, trip_time_in_secs, direct_distance 등의 기능 열을 사용하여 맞춰집니다.

    • R 변수 logitObj에 저장된 학습된 모델을 serialize한 후 출력 매개 변수로 반환합니다.

저장 프로시저를 사용하여 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의 메시지 창에서 R의 stdout 스트림에 파이프되는 메시지를 확인합니다. 예를 들면 다음과 같습니다.

    "외부 스크립트의 STDOUT 메시지: 읽은 행: 1193025, 총 처리된 행: 1193025, 총 청크 시간: 0.093초"

  3. 문이 완료되면 테이블 nyc_taxi_models를 엽니다. 데이터를 처리하고 모델을 맞추는 데 시간이 걸릴 수도 있습니다.

    ‘모델’ 열에 직렬화된 모델을 포함하고 ‘이름’ 열에 모델 이름 RTrainLogit_model을 포함하는 하나의 새 행이 추가된 것을 확인할 수 있습니다.

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

이 자습서의 다음 부분에서는 학습된 모델을 사용하여 예측을 생성합니다.

다음 단계

이 문서에서는 다음 작업을 수행합니다.

  • SQL 저장 프로시저를 사용하여 모델 만들기 및 학습
  • 학습된 모델을 SQL 테이블에 저장