Tutorial do Python: Treinar e salvar um modelo do Python usando o T-SQL
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores Instância Gerenciada de SQL do Azure
Na parte quatro desta série de tutoriais de cinco partes, você aprenderá a treinar um modelo de machine learning usando os pacotes do Python scikit-learn e revoscalepy. Essas bibliotecas do Python já estão instaladas com o aprendizado de máquina do SQL Server.
Você carregará os módulos e chamará as funções necessárias para criar e treinar o modelo usando um procedimento armazenado do SQL Server. O modelo requer os recursos de dados que você desenvolveu em partes anteriores desta série de tutoriais. Por fim, você salvará o modelo treinado em uma tabela SQL Server.
Neste artigo, você vai:
- Criar e treinar um modelo usando um procedimento armazenado do SQL
- Salvar o modelo treinado em uma tabela SQL
Na parte um, você instalou os pré-requisitos e restaurou o banco de dados de exemplo.
Na parte dois, você explorou os dados de exemplo e gerou alguns gráficos.
Na parte três, você aprendeu a criar recursos a partir de dados brutos usando uma função do Transact-SQL. Em seguida, você chamou essa função por meio de um procedimento armazenado para criar uma tabela que contém os valores do recurso.
Na parte cinco, você aprenderá a operacionalizar os modelos treinados e salvos na parte quatro.
Divida os dados de exemplo em conjuntos de teste e treinamento
Crie um procedimento armazenado chamado PyTrainTestSplit para dividir os dados na tabela nyctaxi_sample em duas partes: nyctaxi_sample_training e nyctaxi_sample_testing.
Execute o seguinte código para criá-lo:
DROP PROCEDURE IF EXISTS PyTrainTestSplit; GO CREATE PROCEDURE [dbo].[PyTrainTestSplit] (@pct int) AS DROP TABLE IF EXISTS dbo.nyctaxi_sample_training SELECT * into nyctaxi_sample_training FROM nyctaxi_sample WHERE (ABS(CAST(BINARY_CHECKSUM(medallion,hack_license) as int)) % 100) < @pct DROP TABLE IF EXISTS dbo.nyctaxi_sample_testing SELECT * into nyctaxi_sample_testing FROM nyctaxi_sample WHERE (ABS(CAST(BINARY_CHECKSUM(medallion,hack_license) as int)) % 100) > @pct GO
Para dividir seus dados usando uma divisão personalizada, execute o procedimento armazenado e forneça um parâmetro de número inteiro que represente o percentual de dados alocados ao conjunto de treinamento. Por exemplo, a instrução a seguir alocará 60% dos dados ao conjunto de treinamento.
EXEC PyTrainTestSplit 60 GO
Criar um modelo de regressão logística
Depois da preparação dos dados, você pode usá-los para treinar um modelo. Você faz isso chamando um procedimento armazenado que executa algum código Python usando a tabela de dados de treinamento como entrada. Para este tutorial, você cria dois modelos, ambos modelos de classificação binária:
- O procedimento armazenado PyTrainScikit cria um modelo de previsão de gorjeta usando o pacote Scikit-learn.
- O procedimento armazenado TrainTipPredictionModelRxPy cria um modelo de previsão de gorjeta usando o pacote revoscalepy.
Cada procedimento armazenado usa os dados de entrada que você fornece para criar e treinar um modelo de regressão logística. Todo o código Python é encapsulado no procedimento armazenado do sistema, sp_execute_external_script
.
Para facilitar o novo treinamento do modelo em novos dados, você encapsula a chamada para sp_execute_external_script
em outro procedimento armazenado e passa os novos dados de treinamento como um parâmetro. Esta seção guiará você pelo processo.
PyTrainScikit
No Management Studio, abra uma nova janela de Consulta e execute a instrução a seguir para criar o procedimento armazenado PyTrainScikit. O procedimento armazenado contém uma definição dos dados de entrada, assim, você não precisa fornecer uma consulta de entrada.
DROP PROCEDURE IF EXISTS PyTrainScikit; GO CREATE PROCEDURE [dbo].[PyTrainScikit] (@trained_model varbinary(max) OUTPUT) AS BEGIN EXEC sp_execute_external_script @language = N'Python', @script = N' import numpy import pickle from sklearn.linear_model import LogisticRegression ##Create SciKit-Learn logistic regression model X = InputDataSet[["passenger_count", "trip_distance", "trip_time_in_secs", "direct_distance"]] y = numpy.ravel(InputDataSet[["tipped"]]) SKLalgo = LogisticRegression() logitObj = SKLalgo.fit(X, y) ##Serialize model trained_model = pickle.dumps(logitObj) ', @input_data_1 = N' select tipped, fare_amount, passenger_count, trip_time_in_secs, trip_distance, dbo.fnCalculateDistance(pickup_latitude, pickup_longitude, dropoff_latitude, dropoff_longitude) as direct_distance from nyctaxi_sample_training ', @input_data_1_name = N'InputDataSet', @params = N'@trained_model varbinary(max) OUTPUT', @trained_model = @trained_model OUTPUT; ; END; GO
Execute as seguintes instruções SQL para inserir o modelo treinado na tabela nyc_taxi_models.
DECLARE @model VARBINARY(MAX); EXEC PyTrainScikit @model OUTPUT; INSERT INTO nyc_taxi_models (name, model) VALUES('SciKit_model', @model);
O processamento dos dados e o ajuste do modelo poderão levar alguns minutos. As mensagens que serão redirecionadas para o fluxo stdout do Python são exibidas na janela Mensagens do Management Studio. Por exemplo:
STDOUT message(s) from external script: C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
Abra a tabela nyc_taxi_models. Você pode ver que uma nova linha foi adicionada, que contém o modelo serializado na coluna modelo.
SciKit_model 0x800363736B6C6561726E2E6C696E6561....
TrainTipPredictionModelRxPy
Esse procedimento armazenado usa o pacote Python revoscalepy. Ele contém objetos, transformação e algoritmos semelhantes aos fornecidos para o pacote RevoScaleR da linguagem R.
Usando revoscalepy, você pode criar contextos de computação remota, mover dados entre contextos de computação, transformar dados e treinar modelos de previsão usando algoritmos populares, como regressão logística e linear, árvores de decisão e muito mais. Para obter mais informações, confira o módulo revoscalepy no SQL Server e a referência de função revoscalepy.
No Management Studio, abra uma nova janela de Consulta e execute a instrução a seguir para criar o procedimento armazenado TrainTipPredictionModelRxPy. Como o procedimento armazenado já inclui uma definição dos dados de entrada, você não precisa fornecer uma consulta de entrada.
DROP PROCEDURE IF EXISTS TrainTipPredictionModelRxPy; GO CREATE PROCEDURE [dbo].[TrainTipPredictionModelRxPy] (@trained_model varbinary(max) OUTPUT) AS BEGIN EXEC sp_execute_external_script @language = N'Python', @script = N' import numpy import pickle from revoscalepy.functions.RxLogit import rx_logit ## Create a logistic regression model using rx_logit function from revoscalepy package logitObj = rx_logit("tipped ~ passenger_count + trip_distance + trip_time_in_secs + direct_distance", data = InputDataSet); ## Serialize model trained_model = pickle.dumps(logitObj) ', @input_data_1 = N' select tipped, fare_amount, passenger_count, trip_time_in_secs, trip_distance, dbo.fnCalculateDistance(pickup_latitude, pickup_longitude, dropoff_latitude, dropoff_longitude) as direct_distance from nyctaxi_sample_training ', @input_data_1_name = N'InputDataSet', @params = N'@trained_model varbinary(max) OUTPUT', @trained_model = @trained_model OUTPUT; ; END; GO
Esse procedimento armazenado executa as seguintes etapas como parte do treinamento do modelo:
- A consulta SELECT aplica a função escalar personalizada fnCalculateDistance para calcular a distância direta entre os locais de embarque e desembarque de passageiros. Os resultados da consulta são armazenados na variável de entrada padrão do Python,
InputDataset
. - A variável binária tipped é usada como a coluna label ou de resultado e o modelo é ajustado com o uso destas colunas de recursos: passenger_count, trip_distance, trip_time_in_secse direct_distance.
- O modelo treinado é serializado e armazenado na variável do Python
logitObj
. Ao adicionar a palavra-chave OUTPUT do T-SQL, você pode adicionar a variável como uma saída do procedimento armazenado. Na próxima etapa, essa variável é usada para inserir o código binário do modelo em uma tabela de banco de dados nyc_taxi_models. Esse mecanismo torna mais fácil armazenar e reutilizar modelos.
- A consulta SELECT aplica a função escalar personalizada fnCalculateDistance para calcular a distância direta entre os locais de embarque e desembarque de passageiros. Os resultados da consulta são armazenados na variável de entrada padrão do Python,
Execute o procedimento armazenado da seguinte maneira para inserir o modelo treinado revoscalepy na tabela nyc_taxi_models.
DECLARE @model VARBINARY(MAX); EXEC TrainTipPredictionModelRxPy @model OUTPUT; INSERT INTO nyc_taxi_models (name, model) VALUES('revoscalepy_model', @model);
O processamento dos dados e o ajuste do modelo poderão levar algum tempo. As mensagens que serão redirecionadas para o fluxo stdout do Python são exibidas na janela Mensagens do Management Studio. Por exemplo:
STDOUT message(s) from external script: C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
Abra a tabela nyc_taxi_models. Você pode ver que uma nova linha foi adicionada, que contém o modelo serializado na coluna modelo.
revoscalepy_model 0x8003637265766F7363616c....
Na próxima parte deste tutorial, você usará os modelos treinados para criar previsões.
Próximas etapas
Neste artigo você:
- Criou e treinou um modelo usando um procedimento armazenado do SQL
- Salvou o modelo treinado em uma tabela SQL