Aracılığıyla paylaş


Python öğreticisi: T-SQL kullanarak Python modelini eğitme ve kaydetme

Ş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 dördüncü bölümünde scikit-learn ve revoscalepy Python paketlerini kullanarak makine öğrenmesi modelini eğitmeyi öğreneceksiniz. Bu Python kitaplıkları SQL Server makine öğrenmesi ile zaten yüklüdür.

Sql Server saklı yordamını kullanarak modeli oluşturmak ve eğitmek için modülleri yükleyip gerekli işlevleri çağıracaksınız. Model, bu öğretici serisinin önceki bölümlerinde oluşturduğunuz veri özelliklerini gerektirir. Son olarak, eğitilen modeli bir SQL Server tablosuna kaydedeceksiniz.

Bu makalede şunları yapacaksınız:

  • SQL saklı yordamı kullanarak model oluşturmak ve eğitmek
  • Eğitilen modeli SQL tablosuna kaydetme

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.

Beşinci bölümde, dördüncü bölümde eğitip kaydettiğiniz modelleri nasıl kullanıma hazır hale getirmeniz gerektiğini öğreneceksiniz.

Örnek verileri eğitim ve test kümelerine bölme

  1. nyctaxi_sample tablosundaki verileri iki bölüme bölmek için PyTrainTestSplit adlı bir saklı yordam oluşturun: nyctaxi_sample_training ve nyctaxi_sample_testing.

    Oluşturmak için aşağıdaki kodu çalıştırın:

    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
    
  2. Özel bölme kullanarak verilerinizi bölmek için saklı yordamı çalıştırın ve eğitim kümesine ayrılacak veri yüzdesini temsil eden bir tamsayı parametresi sağlayın. Örneğin, aşağıdaki ifade verilerin %60'ını eğitim kümesine ayırır.

    EXEC PyTrainTestSplit 60
    GO
    

Lojistik regresyon modeli oluşturma

Veriler hazırlandıktan sonra modeli eğitmek için kullanabilirsiniz. Python kodu çalıştıran saklı yordamı, eğitim verileri tablosunu girdi olarak alıp çağırarak bunu yaparsınız. Bu öğreticide, her ikisi de ikili sınıflandırma modeli olan iki model oluşturursunuz:

  • PyTrainScikit saklanmış yordamı, scikit-learn paketini kullanarak bir ipucu tahmin modeli oluşturur.
  • TrainTipPredictionModelRxPy saklı yordamı, revoscalepy paketini kullanarak bir ipucu tahmin modeli oluşturur.

Her saklı yordam, lojistik regresyon modeli oluşturmak ve eğitmek için sağladığınız giriş verilerini kullanır. Tüm Python kodu, sistem saklı yordamına sp_execute_external_script ile sarmalanır.

Modeli yeni verilerde yeniden eğitmenizi kolaylaştırmak için çağrıyı sp_execute_external_script başka bir saklı yordama sarmalar ve yeni eğitim verilerini parametre olarak geçirirsiniz. Bu bölümde bu işlemde size yol gösterilir.

PyTrainScikit

  1. Management Studio'da yeni bir Sorgu penceresi açın ve PyTrainScikit saklı yordamını oluşturmak için aşağıdaki deyimi çalıştırın. Saklı yordam giriş verilerinin tanımını içerdiğinden giriş sorgusu sağlamanız gerekmez.

    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
    
  2. Eğitilen modeli nyc_taxi_models tablosuna eklemek için aşağıdaki SQL deyimlerini yürütün.

    DECLARE @model VARBINARY(MAX);
    EXEC PyTrainScikit @model OUTPUT;
    INSERT INTO nyc_taxi_models (name, model) VALUES('SciKit_model', @model);
    

    Verilerin işlenmesi ve modelin uygun şekilde tamamlanması birkaç dakika sürebilir. Python'ın stdout akışına aktarılacak iletiler, Management Studio'nun İletiler penceresinde görüntülenir. Örneğin:

    STDOUT message(s) from external script:
    C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
    
  3. Tablo nyc_taxi_models açın. Sütun modelinde seri hale getirilmiş modeli içeren yeni bir satırın eklendiğini görebilirsiniz.

    SciKit_model
    0x800363736B6C6561726E2E6C696E6561....
    

TrainTipPredictionModelRxPy

Bu saklı yordam revoscalepy Python paketini kullanır. R dilinin RevoScaleR paketi için sağlananlara benzer nesneler, dönüştürme ve algoritmalar içerir.

Revoscalepy kullanarak uzak işlem bağlamları oluşturabilir, işlem bağlamları arasında veri taşıyabilir, verileri dönüştürebilir ve lojistik ve doğrusal regresyon, karar ağaçları gibi popüler algoritmaları kullanarak tahmine dayalı modelleri eğitebilirsiniz. Daha fazla bilgi için bkz. SQL Server'da revoscalepy modülü ve revoscalepy işlev başvurusu.

  1. Management Studio'da yeni bir Sorgu penceresi açın ve Aşağıdaki deyimi çalıştırarak TrainTipPredictionModelRxPy saklı yordamını oluşturun. Saklı yordam giriş verilerinin tanımını zaten içerdiğinden, giriş sorgusu sağlamanız gerekmez.

    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
    

    Bu saklı yordam, model eğitiminin bir parçası olarak aşağıdaki adımları gerçekleştirir:

    • SELECT sorgusu, teslim alma ve bırakma konumları arasındaki doğrudan mesafeyi hesaplamak için özel skaler işlev fnCalculateDistance'ı uygular. Sorgunun sonuçları varsayılan Python giriş değişkeninde InputDatasetdepolanır.
    • İkili değişken tippedetiketi veya sonuç sütunu olarak kullanılır ve model şu özellik sütunları kullanılarak uygundur: passenger_count, trip_distance, trip_time_in_secs ve direct_distance.
    • Eğitilen model serileştirilir ve Python değişkeninde logitObjdepolanır. T-SQL anahtar sözcüğü OUTPUT'i ekleyerek, değişkenini saklı yordamın çıkışı olarak ekleyebilirsiniz. Sonraki adımda, bu değişken modelin ikili kodunu nyc_taxi_models bir veritabanı tablosuna eklemek için kullanılır. Bu mekanizma, modelleri depolamayı ve yeniden kullanmayı kolaylaştırır.
  2. Eğitilmiş revoscalepy modelini tablo nyc_taxi_models eklemek için saklanan yordamı aşağıda gösterildiği şekilde çalıştırın.

    DECLARE @model VARBINARY(MAX);
    EXEC TrainTipPredictionModelRxPy @model OUTPUT;
    INSERT INTO nyc_taxi_models (name, model) VALUES('revoscalepy_model', @model);
    

    Verilerin işlenmesi ve modelin uygun şekilde işlenmesi biraz zaman alabilir. Python'ın stdout akışına aktarılacak iletiler, Management Studio'nun İletiler penceresinde görüntülenir. Örneğin:

    STDOUT message(s) from external script:
    C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
    
  3. Tablo nyc_taxi_models açın. Sütun modelinde seri hale getirilmiş modeli içeren yeni bir satırın eklendiğini görebilirsiniz.

    revoscalepy_model
    0x8003637265766F7363616c....
    

Bu eğitimin sonraki bölümünde, tahminler yapmak için eğitilen modelleri kullanacaksınız.

Sonraki Adımlar

Bu makalede şunları yapacaksınız:

  • SQL saklı yordamı kullanarak model oluşturma ve eğitme
  • Eğitilen modeli sql tablosuna kaydetme