다음을 통해 공유


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

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

5부로 구성된 이 자습서 시리즈의 4부에서는 R을 사용하여 기계 학습 모델을 학습시키는 방법을 알아봅니다. 이전 부분에서 만든 데이터 기능을 사용하여 모델을 학습한 다음 학습된 모델을 SQL Server 테이블에 저장합니다. 이 경우 R 패키지는 R 서비스(데이터베이스 내)와 함께 이미 설치되어 있으므로 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에 저장된 훈련된 모델은 직렬화되어 출력 매개 변수로 반환됩니다.

저장 프로시저를 사용하여 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 테이블에 저장 완료