Partilhar via


Guia de início rápido: crie e avalie um modelo preditivo em Python com aprendizado de máquina SQL

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores Instância Gerenciada SQL do Azure

Neste guia de início rápido, você criará e treinará um modelo preditivo usando Python. Você salvará o modelo em uma tabela em sua instância do SQL Server e usará o modelo para prever valores de novos dados usando os Serviços de Aprendizado de Máquina do SQL Server, os Serviços de Aprendizado de Máquina de Instância Gerenciada do SQL do Azure ou os Clusters de Big Data do SQL Server.

Você criará e executará dois procedimentos armazenados em execução em SQL. O primeiro usa o clássico conjunto de dados de flores Iris e gera um modelo Naïve Bayes para prever uma espécie de Iris com base nas características florais. O segundo procedimento é para pontuação - chama o modelo gerado no primeiro procedimento para produzir um conjunto de previsões com base em novos dados. Ao colocar o código Python em um procedimento armazenado SQL, as operações estão contidas no SQL, são reutilizáveis e podem ser chamadas por outros procedimentos armazenados e aplicativos cliente.

Ao concluir este guia de início rápido, você aprenderá:

  • Como incorporar código Python em um procedimento armazenado
  • Como passar entradas para o seu código através de entradas no procedimento armazenado
  • Como os procedimentos armazenados são usados para operacionalizar modelos

Pré-requisitos

Você precisa dos seguintes pré-requisitos para executar este início rápido.

Criar um procedimento armazenado que gera modelos

Nesta etapa, você criará um procedimento armazenado que gera um modelo para prever resultados.

  1. Abra o Azure Data Studio, conecte-se à sua instância SQL e abra uma nova janela de consulta.

  2. Conecte-se ao banco de dados irissql.

    USE irissql
    GO
    
  3. Copie o código a seguir para criar um novo procedimento armazenado.

    Quando executado, este procedimento chama sp_execute_external_script para iniciar uma sessão Python.

    As entradas necessárias para o seu código Python são passadas como parâmetros de entrada neste procedimento armazenado. A saída será um modelo treinado, baseado na biblioteca scikit-learn Python para o algoritmo de aprendizado de máquina.

    Este código usa pickle para serializar o modelo. O modelo será treinado usando dados das colunas 0 a 4 da tabela iris_data .

    Os parâmetros que você vê na segunda parte do procedimento articulam entradas de dados e saídas de modelo. Tanto quanto possível, é desejável que o código Python em execução em um procedimento armazenado tenha entradas e saídas bem definidas que mapeiam para entradas e saídas do procedimento armazenado passadas no momento da execução.

    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. Verifique se o procedimento armazenado existe.

    Se o script T-SQL da etapa anterior foi executado sem erro, um novo procedimento armazenado chamado generate_iris_model será criado e adicionado ao banco de dados irissql . Você pode encontrar procedimentos armazenados no Pesquisador de Objetos do Azure Data Studio, em Programação.

Executar o procedimento para criar e treinar modelos

Nesta etapa, você executa o procedimento para executar o código incorporado, criando um modelo treinado e serializado como uma saída.

Os modelos armazenados para reutilização no banco de dados são serializados como um fluxo de bytes e armazenados em uma coluna VARBINARY(MAX) em uma tabela de banco de dados. Depois que o modelo é criado, treinado, serializado e salvo em um banco de dados, ele pode ser chamado por outros procedimentos ou pela função PREDICT T-SQL na pontuação de cargas de trabalho.

  1. Execute o seguinte script para executar o procedimento. A instrução específica para executar um procedimento armazenado está EXECUTE na quarta linha.

    Este script em particular exclui um modelo existente com o mesmo nome ("Naive Bayes") para abrir espaço para novos modelos criados ao executar novamente o mesmo procedimento. Sem a exclusão do modelo, ocorre um erro informando que o objeto já existe. O modelo é armazenado em uma tabela chamada iris_models, provisionada quando você criou o banco de dados irissql .

    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. Verifique se o modelo foi inserido.

    SELECT * FROM dbo.iris_models
    

    Results

    model_name modelo
    Bayes ingênuo 0x800363736B6C6561726E2E6E616976655F62617965730A...

Criar e executar um procedimento armazenado para gerar previsões

Agora que você criou, treinou e salvou um modelo, passe para a próxima etapa: criar um procedimento armazenado que gera previsões. Você fará isso chamando sp_execute_external_script para executar um script Python que carrega o modelo serializado e fornece novos dados de entrada para avaliação.

  1. Execute o código a seguir para criar o procedimento armazenado que executa a pontuação. Em tempo de execução, este procedimento carregará um modelo binário, usará colunas [1,2,3,4] como entradas e especificará colunas [0,5,6] como saída.

    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. Execute o procedimento armazenado, dando o nome do modelo "Naive Bayes" para que o procedimento saiba qual modelo usar.

    EXECUTE predict_species 'Naive Bayes';
    GO
    

    Quando você executa o procedimento armazenado, ele retorna um data.frame do Python. Esta linha de T-SQL especifica o esquema para os resultados retornados: WITH RESULT SETS ( ("id" int, "SpeciesId" int, "SpeciesId.Predicted" int));. Você pode inserir os resultados em uma nova tabela ou devolvê-los a um aplicativo.

    Conjunto de resultados da execução do procedimento armazenado

    Os resultados são 150 previsões sobre espécies usando características florais como insumos. Para a maioria das observações, as espécies previstas correspondem às espécies reais.

    Este exemplo foi simplificado usando o conjunto de dados de íris do Python para treinamento e pontuação. Uma abordagem mais típica envolveria a execução de uma consulta SQL para obter os novos dados e passá-los para Python como InputDataSet.

Conclusion

Neste exercício, você aprendeu como criar procedimentos armazenados dedicados a diferentes tarefas, onde cada procedimento armazenado usou o procedimento sp_execute_external_script armazenado do sistema para iniciar um processo Python. As entradas para o processo Python são passadas para sp_execute_external como parâmetros. Tanto o próprio script Python quanto as variáveis de dados em um banco de dados são passados como entradas.

Geralmente, você só deve planejar usar o Azure Data Studio com código Python polido ou código Python simples que retorna saída baseada em linha. Como ferramenta, o Azure Data Studio dá suporte a linguagens de consulta como T-SQL e retorna conjuntos de linhas nivelados. Se seu código gera saída visual como um gráfico de dispersão ou histograma, você precisa de uma ferramenta separada ou aplicativo de usuário final que possa renderizar a imagem fora do procedimento armazenado.

Para alguns desenvolvedores Python que estão acostumados a escrever scripts completos que lidam com uma variedade de operações, organizar tarefas em procedimentos separados pode parecer desnecessário. Mas o treinamento e a pontuação têm casos de uso diferentes. Ao separá-los, você pode colocar cada tarefa em um cronograma e permissões de escopo diferentes para cada operação.

Um benefício final é que os processos podem ser modificados usando parâmetros. Neste exercício, o código Python que criou o modelo (chamado "Naive Bayes" neste exemplo) foi passado como uma entrada para um segundo procedimento armazenado chamando o modelo em um processo de pontuação. Este exercício usa apenas um modelo, mas você pode imaginar como parametrizar o modelo em uma tarefa de pontuação tornaria esse script mais útil.

Próximos passos

Para obter mais informações sobre tutoriais para Python com aprendizado de máquina SQL, consulte: