[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 6: Utilisation du modèle

Dès le début du tutoriel

Analyse Python en base de données pour les développeurs SQL

Étape précédente

Étape 5: Formation et enregistrement d'un modèle à l'aide de T-SQL

Étape 6: utiliser le modèle

Dans cette étape, vous apprendrez à utiliser le modèle formé à l'étape précédente. «Utiliser» signifie ici «déployer le modèle en production pour le scoring». Cela est facile à développer car le code Python est contenu dans la procédure stockée. Appelez simplement la procédure stockée pour effectuer de nouvelles prédictions d'observation à partir de votre application.

Il existe deux façons d'appeler le modèle Python à partir d'une procédure stockée:

Notation à l'aide du modèle scikit-learn

La procédure stockée PredictTipSciKitPy utilise le modèle scikit-learn.

La procédure stockée PredictTipSciKitPy est définie dans SQL Server à l'étape 2: Importer des données vers SQL Server à l'aide de PowerShell (http://qiita.com/qio9o9/items/98df36982f1fbecdf5e7).

  1. Dans l'Explorateur d'objets de Management Studio, développez Programmation> Procédures stockées.

  2. Cliquez avec le bouton droit sur PredictTipSciKitPy et sélectionnez Modifier pour ouvrir le script Transact-SQL dans une nouvelle fenêtre de requête.

    DROP PROCEDURE IF EXISTS PredictTipSciKitPy;
    GO
    
    CREATE PROCEDURE [dbo].[PredictTipSciKitPy](@model varchar(50), @inquery nvarchar(max))
    AS
    BEGIN
      DECLARE @lmodel2 varbinary(max) = (select model from nyc_taxi_models where name = @model);
    
      EXEC sp_execute_external_script 
    	@language = N'Python',
        @script = N'
    import pickle
    import numpy
    # import pandas
    from sklearn import metrics
    
    mod = pickle.loads(lmodel2)
    
    X = InputDataSet[["passenger_count", "trip_distance", "trip_time_in_secs", "direct_distance"]]
    y = numpy.ravel(InputDataSet[["tipped"]])
    
    prob_array = mod.predict_proba(X)
    prob_list = [item[1] for item in prob_array]
    
    prob_array = numpy.asarray(prob_list)
    fpr, tpr, thresholds = metrics.roc_curve(y, prob_array)
    auc_result = metrics.auc(fpr, tpr)
    print("AUC on testing data is:", auc_result)
    
    OutputDataSet = pandas.DataFrame(data=prob_list, columns=["predictions"])
    ',	
    	@input_data_1 = @inquery,
    	@input_data_1_name = N'InputDataSet',
    	@params = N'@lmodel2 varbinary(max)',
    	@lmodel2 = @lmodel2
      WITH RESULT SETS ((Score float));
    
    END
    GO
    

Scoring à l'aide du modèle Revoscalepy

La procédure stockée PredictTipRxPy utilise un modèle créé à l'aide de la bibliothèque revoscalepy. Cela fonctionne un peu comme la procédure PredictTipSciKitPy, mais avec quelques modifications de la fonction revoscalepy.

La procédure stockée PredictTipRxPy est définie dans SQL Server à l'étape 2: Importer des données vers SQL Server à l'aide de PowerShell (http://qiita.com/qio9o9/items/98df36982f1fbecdf5e7).

  1. Dans l'Explorateur d'objets de Management Studio, développez Programmation> Procédures stockées.

  2. Cliquez avec le bouton droit de la souris sur PredictTipRxPy et sélectionnez Modifier pour ouvrir le script Transact-SQL dans une nouvelle fenêtre de requête.

    DROP PROCEDURE IF EXISTS PredictTipRxPy;
    GO
    
    CREATE PROCEDURE [dbo].[PredictTipRxPy](@model varchar(50), @inquery nvarchar(max))
    AS
    BEGIN
      DECLARE @lmodel2 varbinary(max) = (select model from nyc_taxi_models where name = @model);
    
      EXEC sp_execute_external_script 
    	@language = N'Python',
        @script = N'
    import pickle
    import numpy
    # import pandas
    from sklearn import metrics
    from revoscalepy.functions.RxPredict import rx_predict
    
    mod = pickle.loads(lmodel2)
    X = InputDataSet[["passenger_count", "trip_distance", "trip_time_in_secs", "direct_distance"]]
    y = numpy.ravel(InputDataSet[["tipped"]])
    
    prob_array = rx_predict(mod, X)
    prob_list = prob_array["tipped_Pred"].values
    
    prob_array = numpy.asarray(prob_list)
    fpr, tpr, thresholds = metrics.roc_curve(y, prob_array)
    auc_result = metrics.auc(fpr, tpr)
    print("AUC on testing data is:", auc_result)
    OutputDataSet = pandas.DataFrame(data=prob_list, columns=["predictions"])
    ',	
    	@input_data_1 = @inquery,
    	@input_data_1_name = N'InputDataSet',
    	@params = N'@lmodel2 varbinary(max)',
    	@lmodel2 = @lmodel2
      WITH RESULT SETS ((Score float));
    
    END
    GO
    

Effectuer une notation par lots

Les procédures stockées «PredictTipSciKitPy» et «PredictTipRxPy» nécessitent deux paramètres d'entrée.

Dans cette section, vous apprendrez à transmettre ces arguments à une procédure stockée pour modifier facilement à la fois le modèle et les données utilisées pour le scoring.

  1. Définissez les données d'entrée et appelez la procédure stockée pour l'évaluation comme suit: Cet exemple utilise la procédure stockée PredictTipSciKitPy pour le scoring et transmet le nom du modèle et la chaîne de requête.

    DECLARE @query_string nvarchar(max) -- Specify input query
      SET @query_string='
      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_testing'
    EXEC [dbo].[PredictTipSciKitPy] 'SciKit_model', @query_string;
    

    sqldev-python-step6-1-gho9o9.png

    sqldev-python-step6-2-gho9o9.png

La procédure stockée renvoie une valeur prédite de la probabilité de recevoir une puce pour chaque enregistrement d'opération transmis dans le cadre d'une requête d'entrée. Les valeurs prévues sont affichées dans le volet des résultats de Management Studio. De plus, la métrique de précision ʻAUC (aire sous la courbe) `est sortie dans le volet des messages.

  1. Pour utiliser le modèle revoscalepy pour le scoring, appelez la procédure stockée PredictTipRxPy.

    DECLARE @query_string nvarchar(max) -- Specify input query
      SET @query_string='
      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_testing'
    EXEC [dbo].[PredictTipRxPy] 'revoscalepy_model', @query_string;
    

    sqldev-python-step6-3-gho9o9.png

    sqldev-python-step6-4-gho9o9.png

Effectuer une notation individuelle

Dans certains cas, au lieu du scoring par lots, vous souhaitez transmettre un seul cas et obtenir un seul résultat basé sur cette valeur. Par exemple, configurez une feuille de calcul Excel, une application Web ou un rapport Reporting Services pour appeler une procédure stockée en fonction de l'entrée utilisateur.

Dans cette section, vous apprendrez à appeler les procédures stockées «PredictTipSingleModeSciKitPy» et «PredictTipSingleModeRxPy» pour créer une seule prédiction.

Les procédures stockées «PredictTipSingleModeSciKitPy» et «PredictTipSingleModeRxPy» sont définies dans SQL Server via Étape 2: Importer des données dans SQL Server à l'aide de PowerShell.

  1. Dans l'Explorateur d'objets de Management Studio, développez Programmation> Procédures stockées.

  2. Cliquez avec le bouton droit sur "PredictTipSingleModeSciKitPy" ou "PredictTipSingleModeRxPy" et sélectionnez Modifier pour ouvrir le script Transact-SQL dans une nouvelle fenêtre de requête.

Ces procédures stockées utilisent les modèles scicit-learn et revoscalepy et effectuent le scoring comme suit:

Vous trouverez ci-dessous la procédure stockée PredictTipSingleModeSciKitPy qui effectue une évaluation à l'aide du modèle scikit-learn.

```SQL:PredictTipSingleModeSciKitPy
CREATE PROCEDURE [dbo].[PredictTipSingleModeSciKitPy](@model varchar(50), @passenger_count int = 0,
@trip_distance float = 0,
@trip_time_in_secs int = 0,
@pickup_latitude float = 0,
@pickup_longitude float = 0,
@dropoff_latitude float = 0,
@dropoff_longitude float = 0)
AS
BEGIN
    DECLARE @inquery nvarchar(max) = N'
    SELECT * FROM [dbo].[fnEngineerFeatures]( 
    @passenger_count,
    @trip_distance,
    @trip_time_in_secs,
    @pickup_latitude,
    @pickup_longitude,
    @dropoff_latitude,
    @dropoff_longitude)
    '
    DECLARE @lmodel2 varbinary(max) = (select model from nyc_taxi_models where name = @model);
    EXEC sp_execute_external_script 
        @language = N'Python',
        @script = N'
import pickle
import numpy
# import pandas

# Load model and unserialize
mod = pickle.loads(model)

# Get features for scoring from input data
X = InputDataSet[["passenger_count", "trip_distance", "trip_time_in_secs", "direct_distance"]]

# Score data to get tip prediction probability as a list (of float)
prob = [mod.predict_proba(X)[0][1]]

# Create output data frame
OutputDataSet = pandas.DataFrame(data=prob, columns=["predictions"])
',
    @input_data_1 = @inquery,
    @params = N'@model varbinary(max),@passenger_count int,@trip_distance float,
        @trip_time_in_secs int ,
        @pickup_latitude float ,
        @pickup_longitude float ,
        @dropoff_latitude float ,
        @dropoff_longitude float',
    @model = @lmodel2,
        @passenger_count =@passenger_count ,
        @trip_distance=@trip_distance,
        @trip_time_in_secs=@trip_time_in_secs,
        @pickup_latitude=@pickup_latitude,
        @pickup_longitude=@pickup_longitude,
        @dropoff_latitude=@dropoff_latitude,
        @dropoff_longitude=@dropoff_longitude
    WITH RESULT SETS ((Score float));
END
GO
```

Vous trouverez ci-dessous la procédure stockée PredictTipSingleModeRxPy qui effectue la notation à l'aide du modèle revoscalepy.

```SQL
CREATE PROCEDURE [dbo].[PredictTipSingleModeRxPy](@model varchar(50), @passenger_count int = 0,
@trip_distance float = 0,
@trip_time_in_secs int = 0,
@pickup_latitude float = 0,
@pickup_longitude float = 0,
@dropoff_latitude float = 0,
@dropoff_longitude float = 0)
AS
BEGIN
    DECLARE @inquery nvarchar(max) = N'
    SELECT * FROM [dbo].[fnEngineerFeatures]( 
    @passenger_count,
    @trip_distance,
    @trip_time_in_secs,
    @pickup_latitude,
    @pickup_longitude,
    @dropoff_latitude,
    @dropoff_longitude)
    '
    DECLARE @lmodel2 varbinary(max) = (select model from nyc_taxi_models where name = @model);
    EXEC sp_execute_external_script 
        @language = N'Python',
        @script = N'
import pickle
import numpy
# import pandas
from revoscalepy.functions.RxPredict import rx_predict

# Load model and unserialize
mod = pickle.loads(model)

# Get features for scoring from input data
x = InputDataSet[["passenger_count", "trip_distance", "trip_time_in_secs", "direct_distance"]]

# Score data to get tip prediction probability as a list (of float)

prob_array = rx_predict(mod, x)

prob_list = prob_array["tipped_Pred"].values

# Create output data frame
OutputDataSet = pandas.DataFrame(data=prob_list, columns=["predictions"])
',
    @input_data_1 = @inquery,
    @params = N'@model varbinary(max),@passenger_count int,@trip_distance float,
        @trip_time_in_secs int ,
        @pickup_latitude float ,
        @pickup_longitude float ,
        @dropoff_latitude float ,
        @dropoff_longitude float',
    @model = @lmodel2,
        @passenger_count =@passenger_count ,
        @trip_distance=@trip_distance,
        @trip_time_in_secs=@trip_time_in_secs,
        @pickup_latitude=@pickup_latitude,
        @pickup_longitude=@pickup_longitude,
        @dropoff_latitude=@dropoff_latitude,
        @dropoff_longitude=@dropoff_longitude
    WITH RESULT SETS ((Score float));
END
GO
```
  1. Ouvrez une nouvelle fenêtre de requête dans Management Studio et entrez la colonne de variable explicative pour appeler la procédure stockée.

    -- Call stored procedure PredictTipSingleModeSciKitPy to score using SciKit-Learn model
    EXEC [dbo].[PredictTipSingleModeSciKitPy] 'SciKit_model', 1, 2.5, 631, 40.763958,-73.973373, 40.782139,-73.977303
    -- Call stored procedure PredictTipSingleModeRxPy to score using revoscalepy model
    EXEC [dbo].[PredictTipSingleModeRxPy] 'revoscalepy_model', 1, 2.5, 631, 40.763958,-73.973373, 40.782139,-73.977303
    

Les sept valeurs des variables explicatives sont dans l'ordre suivant: - passenger_count - trip_distance - trip_time_in_secs - pickup_latitude - pickup_longitude - dropoff_latitude - dropoff_longitude

En conséquence, la probabilité que la puce soit payée dans l'opération avec les paramètres ci-dessus est renvoyée.

![sqldev-python-step6-5-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/27bc40a6-07ae-595d-fec1-4c030e6c04ab.png)

Résumé

Dans ce didacticiel, vous avez appris à utiliser du code Python intégré dans des procédures stockées. Nous avons constaté que l'intégration avec Transact-SQL rend encore plus facile le déploiement de modèles Python pour la prédiction et l'intégration de la reconversion des modèles dans le cadre d'un flux de travail de données d'entreprise.

Lien

Étape précédente

Étape 5: Formation et enregistrement d'un modèle à l'aide de T-SQL

Dès le début du tutoriel

Analyse Python en base de données pour les développeurs SQL

La source

Step 6: Operationalize the Model

Article connexe

Machine Learning Services with Python

Recommended Posts

[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 6: Utilisation du modèle
[Didacticiel d'analyse Python en base de données avec SQL Server 2017]
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 5: Formation et enregistrement des modèles à l'aide de T-SQL
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 2: importer des données dans SQL Server à l'aide de PowerShell
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 1: Télécharger des exemples de données
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 4: Extraction de fonctionnalités de données à l'aide de T-SQL
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 3: Exploration et visualisation des données
Derrière le flyer: utiliser Docker avec Python
Tutoriel de recommandation utilisant l'analyse d'association (implémentation python)
Travailler avec OpenStack à l'aide du SDK Python
Déployer et utiliser le modèle de prédiction créé en Python sur SQL Server
Résolution du modèle Lorenz 96 avec Julia et Python
Exécuter du SQL brut avec redash à l'aide de la source de données Python et afficher le résultat
Analyse de données avec python 2
Explication du concept d'analyse de régression à l'aide de python Partie 2
Analyse vocale par python
Calculer le coefficient de régression d'une analyse de régression simple avec python
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Analyse des composants principaux à l'aide de python de nim avec nimpy
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Analyse vocale par python
Analyse de données avec Python
Serveur local avec python
Accès ODBC à SQL Server depuis Linux avec Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
[Python] Régression LASSO avec contrainte d'équation utilisant la méthode du multiplicateur
Profitez du modèle Gray-Scott avec un code court utilisant le calcul matriciel
Touchez NoSQL avec Python à l'aide d'Oracle NoSQL Database Cloud Simulator
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
[Python] Analyse morphologique avec MeCab
[S3] CRUD avec S3 utilisant Python [Python]
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Utilisation de Quaternion avec Python ~ numpy-quaternion ~
[Python] Utilisation d'OpenCV avec Python (basique)
Analyse des émotions par Python (word2vec)
Analyse de squelette planaire avec Python
Analyse morphologique japonaise avec Python
Serveur HTTP facile avec Python
Calibrer le modèle avec PyCaret
Appelez l'API avec python3.
Analyse de données à l'aide de pandas python
Analyse des secousses musculaires avec Python
Utiliser OpenCV avec Python @Mac
Envoyer en utilisant Python avec Gmail
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
Compléter python avec emacs en utilisant company-jedi
Moyenne harmonique par Python (en utilisant SciPy)
Extraire le fichier xz avec python
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Analyse de la structure du squelette en trois dimensions avec Python
Utilisation de Rstan de Python avec PypeR
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Analyse d'impédance (EIS) avec python [impedance.py]
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Web scraping avec Python Première étape