Aracılığıyla paylaş


Python öğreticisi: Saklı yordama eklenmiş Python kullanarak tahminleri çalıştırma

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri Azure SQL Yönetimli Örnek

Bu beş bölümden oluşan öğretici serisinin beşinci bölümünde, önceki bölümde eğitip kaydettiğiniz modelleri nasıl kullanıma hazır hale getirmeniz gerektiğini öğreneceksiniz.

Bu senaryoda kullanıma hazır hale getirme, modelin puanlama için üretime dağıtılması anlamına gelir. Python kodunu bir saklı yordama ekleyebildiğiniz için SQL Server ile tümleştirme bunu oldukça kolaylaştırır. Yeni verilerle tahmin almak için bir uygulamadan saklı yordamı çağırın ve yeni verileri geçirin.

Öğreticinin bu bölümünde, bir Python modeline dayalı olarak tahminler oluşturmanın iki yöntemi gösterilmektedir: toplu puanlama ve satır satır puanlama.

  • Toplu puanlama: Birden çok giriş verisi satırı sağlamak için saklı yordama parametre olarak bir SELECT sorgusu işlemi sağlayın. Sonuç, giriş durumlarına karşılık gelen gözlemler tablosudur.
  • Bireysel puanlama: Giriş olarak tek bir parametre değerleri kümesi geçirin. Saklı yordam tek bir satır veya değer döndürür.

Puanlama için gereken tüm Python kodu depolanmış prosedürlerin bir parçası olarak sağlanır.

Bu makalede şunları yapacaksınız:

  • Toplu puanlama için saklı yordamlar oluşturma ve kullanma
  • Tek bir satır puanlama için saklı yordamlar oluşturma ve kullanma

Birinci bölümde önkoşulları yüklemiş ve örnek veritabanını geri yüklemişsinizdir.

İkinci bölümde örnek verileri incelediniz ve bazı çizimler oluşturacaksınız.

Üçüncü bölümde, bir Transact-SQL işlevi kullanarak ham verilerden özellik oluşturmayı öğrendinsiniz. Ardından bu işlevi saklı yordamdan çağırarak özellik değerlerini içeren bir tablo oluşturacaksınız.

Dördüncü bölümde, modülleri yüklemiş ve SQL Server saklı yordamını kullanarak modeli oluşturmak ve eğitmek için gerekli işlevleri çağırmıştınız.

Batch puanlama

Aşağıdaki betikler kullanılarak oluşturulan ilk iki saklı yordam, bir saklı yordam içerisine Python tahmin çağrısını sarmalamanın temel söz dizimini gösterir. Her iki saklı yordam da giriş olarak bir veri tablosu gerektirir.

  • Kullanılacak modelin adı saklı yordam için giriş parametresi olarak sağlanır. Saklı yordam, saklı yordamdaki SELECT deyimini kullanarak veritabanı tablosu nyc_taxi_models.table'dan serileştirilmiş modeli yükler.

  • Serileştirilmiş model, Python kullanılarak daha fazla işlem için Python değişkeninde mod depolanır.

  • Puanlanması gereken yeni durumlar, içinde @input_data_1belirtilen Transact-SQL sorgusundan alınır. Sorgu verileri okundukça, satırlar varsayılan veri çerçevesine InputDataSetkaydedilir.

  • Her iki saklı yordam da sklearn'daki işlevleri kullanarak AUC (eğrinin altındaki alan) doğruluk ölçümünü hesaplar. AUC gibi doğruluk ölçümleri yalnızca hedef etiketi de ( sıkıştırılmış sütun) sağladığınızda oluşturulabilir. Tahminler için hedef etiket (değişken y) gerekmez, ancak doğruluk ölçümü hesaplaması gerekir.

    Bu nedenle, puanlanacak veriler için hedef etiketleriniz yoksa, saklı yordamı değiştirerek AUC hesaplamalarını kaldırabilir ve özelliklerden yalnızca ipucu olasılıklarını döndürebilirsiniz (saklı yordamdaki değişken X ).

PredictTipSciKitPy

saklı yordam PredictTipSciKitPy oluşturmak için aşağıdaki T-SQL deyimlerini çalıştırın. Bu saklı yordam, scikit-learn paketini temel alan bir model gerektirir çünkü bu pakete özgü işlevleri kullanır.

Girişleri içeren veri çerçevesi lojistik regresyon modelinin predict_probaişlevine mod geçirilir. predict_proba İşlev (probArray = mod.predict_proba(X)), herhangi bir miktarda bir bahşişin verilme olasılığını temsil eden bir float döndürür.

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;
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"]])

probArray = mod.predict_proba(X)
probList = []
for i in range(len(probArray)):
  probList.append((probArray[i])[1])

probArray = numpy.asarray(probList)
fpr, tpr, thresholds = metrics.roc_curve(y, probArray)
aucResult = metrics.auc(fpr, tpr)
print ("AUC on testing data is: " + str(aucResult))

OutputDataSet = pandas.DataFrame(data = probList, 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

PredictTipRxPy

saklı yordamını PredictTipRxPyoluşturmak için aşağıdaki T-SQL deyimlerini çalıştırın. Bu saklı yordam aynı girişleri kullanır ve önceki saklı yordamla aynı puan türünü oluşturur, ancak SQL Server makine öğrenmesi ile sağlanan revoscalepy paketindeki işlevleri kullanır.

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;
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"]])

probArray = rx_predict(mod, X)
probList = probArray["tipped_Pred"].values 

probArray = numpy.asarray(probList)
fpr, tpr, thresholds = metrics.roc_curve(y, probArray)
aucResult = metrics.auc(fpr, tpr)
print ("AUC on testing data is: " + str(aucResult))

OutputDataSet = pandas.DataFrame(data = probList, 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

SELECT sorgusu kullanarak toplu puanlama çalıştırma

PredictTipSciKitPy ve PredictTipRxPy saklı yordamları iki giriş parametresi gerektirir:

  • Puanlama için verileri alan sorgu
  • Eğitilmiş modelin adı

Bu bağımsız değişkenleri saklı yordama geçirerek belirli bir modeli seçebilir veya puanlama için kullanılan verileri değiştirebilirsiniz.

  1. Puanlama için scikit-learn modelini kullanmak için PredictTipSciKitPy saklı yordamını çağırarak model adını ve sorgu dizesini giriş olarak geçirin.

    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;
    

    Saklı prosedür, giriş sorgusuna dahil edilen her yolculuk için tahmin edilen olasılık oranlarını döndürür.

    Sorguları çalıştırmak için SSMS (SQL Server Management Studio) kullanıyorsanız, olasılıklar Sonuçlar bölmesinde bir tablo olarak görünür. İletiler bölmesi doğruluk ölçümünü (AUC veya eğrinin altındaki alan) yaklaşık 0,56 değeriyle verir.

  2. Puanlama için revoscalepy modelini kullanmak için PredictTipRxPy saklı yordamını çağırın ve model adını ve sorgu dizesini giriş olarak geçirin.

    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;
    

Tek satırlı puanlama

Bazen toplu puanlama yerine tek bir vaka geçirmek, bir uygulamadan gelen değerleri almak ve bu değerlere göre tek bir sonuç döndürmek isteyebilirsiniz. Örneğin, saklı yordamı çağırmak ve kullanıcılar tarafından yazılan veya seçilen girişleri ona geçirmek için bir Excel çalışma sayfası, web uygulaması veya rapor ayarlayabilirsiniz.

Bu bölümde, iki saklı yordamı çağırarak tek tahmin oluşturmayı öğreneceksiniz:

  • PredictTipSingleModeSciKitPy , scikit-learn modeli kullanılarak tek satırlı puanlama için tasarlanmıştır.
  • PredictTipSingleModeRxPy , revoscalepy modeli kullanılarak tek satırlı puanlama için tasarlanmıştır.
  • Henüz bir model eğitmediyseniz beşinci bölüme dönün!

Her iki model de giriş olarak yolcu sayısı, seyahat mesafesi gibi bir dizi tek değer alır. Tablo değerli işlevi, fnEngineerFeaturesenlem ve boylam değerlerini girişlerden doğrudan uzaklık gibi yeni bir özelliğe dönüştürmek için kullanılır. Dördüncü bölüm bu tablo değerli fonksiyonun açıklamasını içerir.

Her iki saklı yordam da Python modelini temel alan bir puan oluşturur.

Uyarı

Bir dış uygulamadan saklı yordamı çağırdığınızda Python modelinin gerektirdiği tüm giriş özelliklerini sağlamanız önemlidir. Hataları önlemek için, veri türünü ve veri uzunluğunu doğrulamanın yanı sıra, giriş verilerini bir Python veri türüne dönüştürmeniz veya biçimlendirmeniz gerekebilir.

PredictTipSingleModeSciKitPy

Aşağıdaki saklı yordam PredictTipSingleModeSciKitPyscikit-learn modelini kullanarak puanlama gerçekleştirir.

DROP PROCEDURE IF EXISTS PredictTipSingleModeSciKitPy;
GO

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;

# 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)
probList = []
probList.append((mod.predict_proba(X)[0])[1])

# Create output data frame
OutputDataSet = pandas.DataFrame(data = probList, 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

PredictTipSingleModeRxPy

Aşağıdaki saklı yordam PredictTipSingleModeRxPy, revoscalepy modelini kullanarak puanlama gerçekleştirir.

DROP PROCEDURE IF EXISTS PredictTipSingleModeRxPy;
GO

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;
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)

probArray = rx_predict(mod, X)

probList = []
probList = probArray["tipped_Pred"].values

# Create output data frame
OutputDataSet = pandas.DataFrame(data = probList, 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

Modellerden puan oluşturma

Saklı yordamlar oluşturulduktan sonra, modellerin her birine dayalı bir puan oluşturmak kolaydır. Yeni bir Sorgu penceresi açın ve özellik sütunlarının her biri için parametreler sağlayın.

Bu özellik sütunları için gereken yedi değer sırasıyla şunlardır:

  • passenger_count
  • trip_distance
  • seyahat_süresi_saniye
  • alınma_enlemi
  • pickup_longitude
  • dropoff_latitude
  • dropoff_longitude

Örneğin:

  • Revoscalepy modelini kullanarak tahmin oluşturmak için şu deyimi çalıştırın:

    EXEC [dbo].[PredictTipSingleModeRxPy] 'revoscalepy_model', 1, 2.5, 631, 40.763958,-73.973373, 40.782139,-73.977303
    
  • scikit-learn modelini kullanarak puan oluşturmak için şu deyimi çalıştırın:

    EXEC [dbo].[PredictTipSingleModeSciKitPy] 'SciKit_model', 1, 2.5, 631, 40.763958,-73.973373, 40.782139,-73.977303
    

Her iki prosedürden alınan çıkış, belirtilen parametreler veya özelliklerle taksi yolculuğunda bir bahşişin ödenme olasılığıdır.

Sonuç

Bu eğitim serisinde, depolanmış yordamlara eklenmiş Python koduyla çalışmayı öğrendiniz. Transact-SQL ile tümleştirme, tahmin için Python modellerini dağıtmayı ve modeli yeniden eğitme işlemini kurumsal veri iş akışının bir parçası olarak birleştirmeyi çok daha kolay hale getirir.

Sonraki Adımlar

Bu makalede şunları yapacaksınız:

  • Toplu puanlama için oluşturulan ve kullanılan saklı prosedürler
  • Tek bir satır puanlama için oluşturulan ve kullanılan saklı yordamlar

Python hakkında daha fazla bilgi için bkz. SQL Server'da Python uzantısı.