다음을 통해 공유


빠른 시작: Python에서 SQL 기계 학습을 사용하여 예측 모델 만들기 및 점수 매기기

적용 대상: SQL Server 2017(14.x) 이상 Azure SQL Managed Instance

이 빠른 시작에서는 Python을 사용하여 예측 모델을 만들고 학습합니다. SQL Server 인스턴스의 테이블에 모델을 저장한 다음 SQL Server Machine Learning Services, Azure SQL Managed Instance Machine Learning Services 또는 SQL Server 빅 데이터 클러스터로 새로운 데이터에서 값을 예측하는 데이터 해당 모델을 사용합니다.

SQL에서 실행되는 두 개의 저장 프로시저를 만들고 실행합니다. 첫 번째는 고전적인 아이리스 꽃 데이터 세트를 사용하고 꽃 특성을 기반으로 아이리스 종을 예측하는 Naïve Bayes 모델을 생성합니다. 두 번째 저장 프로시저는 첫 번째 프로시저에서 생성된 모델을 호출하여 새 데이터를 기반으로 예측 세트를 출력합니다. SQL 저장 프로시저에 Python 코드를 배치하면 작업이 SQL에 포함되고 재사용 가능하며 다른 저장 프로시저 및 클라이언트 애플리케이션에서 호출할 수 있습니다.

이 빠른 시작을 완료하면 다음을 배울 수 있습니다.

  • 저장 프로시저에 Python 코드를 포함하는 방법
  • 저장 프로시저의 입력을 통해 코드에 입력을 전달하는 방법
  • 저장 프로시저를 사용하여 모델을 조작하는 방법

필수 조건

이 빠른 시작을 실행하려면 다음과 같은 필수 구성 요소가 필요합니다.

모델을 생성하는 저장 프로시저 만들기

이 단계에서는 결과를 예측하기 위한 모델을 생성하는 저장 프로시저를 만듭니다.

  1. Azure Data Studio를 열고 SQL 인스턴스에 연결한 다음 새 쿼리 창을 엽니다.

  2. irissql 데이터베이스에 연결합니다.

    USE irissql
    GO
    
  3. 다음 코드를 복사하여 새 저장 프로시저를 만듭니다.

    이 프로시저를 실행하면 Python 세션을 시작하는 sp_execute_external_script가 호출됩니다.

    Python 코드에 필요한 입력은 이 저장 프로시저에서 입력 매개 변수로 전달됩니다. 출력은 기계 학습 알고리즘을 위한 Python scikit-learn 라이브러리를 기반으로 하는 훈련된 모델입니다.

    이 코드는 pickle을 사용하여 모델을 직렬화합니다. 모델은 iris_data 테이블의 0에서 4까지의 열에서 데이터를 사용하여 학습됩니다.

    프로시저의 두 번째 부분에서 볼 수 있는 매개 변수는 데이터 입력 및 모델 출력을 명확하게 표현합니다. 가능한 한 저장 프로시저에서 실행되는 Python 코드에는 런타임에 전달된 저장 프로시저 입력 및 출력에 매핑되는 명확하게 정의된 입력 및 출력이 있어야 합니다.

    CREATE PROCEDURE generate_iris_model (@trained_model VARBINARY(max) OUTPUT)
    AS
    BEGIN
        EXECUTE sp_execute_external_script @language = N'Python'
            , @script = N'
    import pickle
    from sklearn.naive_bayes import GaussianNB
    GNB = GaussianNB()
    trained_model = pickle.dumps(GNB.fit(iris_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]], iris_data[["SpeciesId"]].values.ravel()))
    '
            , @input_data_1 = N'select "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "SpeciesId" from iris_data'
            , @input_data_1_name = N'iris_data'
            , @params = N'@trained_model varbinary(max) OUTPUT'
            , @trained_model = @trained_model OUTPUT;
    END;
    GO
    
  4. 저장 프로시저가 있는지 확인합니다.

    이전 단계의 T-SQL 스크립트가 오류 없이 실행된 경우 generate_iris_model이라는 새 저장 프로시저가 생성되어 irissql 데이터베이스에 추가됩니다. 프로그래밍 기능의 Azure Data Studio 개체 탐색기 저장 프로시저를 찾을 수 있습니다.

프로시저를 실행하여 모델을 만들고 학습

이 단계에서는 프로시저를 실행하여 포함된 코드를 실행하여 학습되고 직렬화된 모델을 출력으로 만듭니다.

데이터베이스에서 다시 사용하기 위해 저장된 모델은 바이트 스트림으로 직렬화되어 데이터베이스 테이블의 VARBINARY(MAX) 열에 저장됩니다. 모델이 생성되고, 학습되고, 직렬화되고, 데이터베이스에 저장된 후에는 다른 프로시저 또는 채점 워크로드의 PREDICT T-SQL 함수를 사용하여 모델을 호출할 수 있습니다.

  1. 다음 스크립트를 실행하여 프로시저를 실행합니다. 저장 프로시저를 실행하기 위한 특정 문은 네 번째 줄의 EXECUTE에 있습니다.

    이 특정 스크립트는 동일한 프로시저를 다시 실행하여 생성되는 모델의 공간을 마련하기 위해 이름이 같은("Naive Bayes") 기존 모델을 삭제합니다. 모델을 삭제하지 않으면 해당 객체가 이미 존재한다는 오류가 발생합니다. 모델은 irissql 데이터베이스를 만들 때 프로비전된 iris_models 테이블에 저장됩니다.

    DECLARE @model varbinary(max);
    DECLARE @new_model_name varchar(50)
    SET @new_model_name = 'Naive Bayes'
    EXECUTE generate_iris_model @model OUTPUT;
    DELETE iris_models WHERE model_name = @new_model_name;
    INSERT INTO iris_models (model_name, model) values(@new_model_name, @model);
    GO
    
  2. 모델이 삽입되었는지 확인합니다.

    SELECT * FROM dbo.iris_models
    

    결과

    model_name model
    Naive Bayes 0x800363736B6C6561726E2E6E616976655F62617965730A...

예측을 생성하기 위한 저장 프로시저 만들기 및 실행

이제 모델을 만들고, 학습하고, 저장했으므로 예측을 생성하는 저장 프로시저를 만드는 다음 단계로 이동합니다. 직렬화된 모델을 로드하고 점수를 매기기 위해 새 데이터 입력을 제공하는 Python 스크립트를 실행하도록 sp_execute_external_script를 호출하여 이 작업을 수행합니다.

  1. 다음 코드를 실행하여 채점을 수행하는 저장 프로시저를 만듭니다. 런타임에 이 프로시저는 이진 모델을 로드하고, 열 [1,2,3,4]를 입력으로 사용하고, 열 [0,5,6]을 출력으로 지정합니다.

    CREATE PROCEDURE predict_species (@model VARCHAR(100))
    AS
    BEGIN
        DECLARE @nb_model VARBINARY(max) = (
                SELECT model
                FROM iris_models
                WHERE model_name = @model
                );
    
        EXECUTE sp_execute_external_script @language = N'Python'
            , @script = N'
    import pickle
    irismodel = pickle.loads(nb_model)
    species_pred = irismodel.predict(iris_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]])
    iris_data["PredictedSpecies"] = species_pred
    OutputDataSet = iris_data[["id","SpeciesId","PredictedSpecies"]] 
    print(OutputDataSet)
    '
            , @input_data_1 = N'select id, "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "SpeciesId" from iris_data'
            , @input_data_1_name = N'iris_data'
            , @params = N'@nb_model varbinary(max)'
            , @nb_model = @nb_model
        WITH RESULT SETS((
                    "id" INT
                  , "SpeciesId" INT
                  , "SpeciesId.Predicted" INT
                    ));
    END;
    GO
    
  2. 프로시저에서 사용할 모델을 알 수 있도록 모델 이름 "Naive Bayes"를 지정하여 저장 프로시저를 실행합니다.

    EXECUTE predict_species 'Naive Bayes';
    GO
    

    저장 프로시저를 실행하면 Python data.frame이 반환됩니다. 이 T-SQL 줄은 반환된 결과 WITH RESULT SETS ( ("id" int, "SpeciesId" int, "SpeciesId.Predicted" int));에 대한 스키마를 지정합니다. 결과를 새 테이블에 삽입하거나 애플리케이션에 반환할 수 있습니다.

    저장 프로시저 실행 결과 집합

    결과는 꽃의 특성을 입력으로 사용한 종에 대한 150개의 예측입니다. 대부분의 관찰에서, 예측된 종은 실제 종과 일치합니다.

    이 예제는 학습 및 채점에 Python 아이리스 데이터 세트를 사용하여 간단하게 만들었습니다. 보다 일반적인 방법은 SQL 쿼리를 실행하여 새 데이터를 가져오고, Python에 InputDataSet로 전달하는 것입니다.

결론

이 연습에서는 각 저장 프로시저가 시스템 저장 프로시저 sp_execute_external_script를 사용하여 Python 프로세스를 시작하는 다양한 작업 전용 저장 프로시저 생성 방법에 대해 배웠습니다. Python 프로세스에 대한 입력은 매개 변수로 sp_execute_external에 전달됩니다. Python 스크립트 자체와 데이터베이스의 데이터 변수는 모두 입력으로 전달됩니다.

일반적으로 세련된 Python 코드 또는 행 기반 출력을 반환하는 간단한 Python 코드에서만 Azure Data Studio를 사용할 계획입니다. 도구로서 Azure Data Studio는 T-SQL과 같은 쿼리 언어를 지원하고 일반 행 집합을 반환합니다. 코드에서 산점도 또는 히스토그램과 같은 시각적 출력을 생성하는 경우 저장 프로시저 외부에서 이미지를 렌더링할 수 있는 별도의 도구 또는 최종 사용자 애플리케이션이 필요합니다.

다양한 작업을 처리하는 포괄적인 스크립트를 작성하는 데 익숙한 일부 Python 개발자의 경우 작업을 별도의 절차로 구성하는 것이 불필요해 보일 수 있습니다. 하지만 학습과 채점의 사용 사례는 서로 다릅니다. 둘을 구분하면 각 작업을 서로 다른 일정에 배치하고 각 작업의 권한 범위를 지정할 수 있습니다.

최종 이점은 매개 변수를 사용하여 프로세스를 수정할 수 있다는 것입니다. 이 연습에서는 모델을 만든 Python 코드(이 예제에서는 "Naive Bayes")가 채점 프로세스에서 모델을 호출하는 두 번째 저장 프로시저에 입력으로 전달되었습니다. 이 연습에서는 하나의 모델만 사용하지만, 채점 작업에서 모델을 매개 변수화하면 해당 스크립트가 얼마나 더 유용해질지 상상할 수 있습니다.

다음 단계

SQL 기계 학습을 사용하는 Python 자습서에 대한 자세한 내용은 다음을 참조하세요.