Megosztás a következőn keresztül:


Python-oktatóanyag: Python-modell betanítása és mentése a T-SQL használatával

A következőkre vonatkozik: Sql Server 2017 (14.x) és újabb verziók Felügyelt Azure SQL-példány

Az ötrészes oktatóanyag-sorozat negyedik részében megtanulhatja, hogyan taníthat be gépi tanulási modellt a Python-csomagok scikit-learn és revoscalepy használatával. Ezek a Python-kódtárak már telepítve vannak az SQL Server gépi tanulással.

Betölti a modulokat, és meghívja a szükséges függvényeket a modell létrehozásához és betanítása egy SQL Server által tárolt eljárás használatával. A modellhez az oktatóanyag-sorozat korábbi részeiben megtervezett adatfunkciók szükségesek. Végül a betanított modellt egy SQL Server-táblába menti.

Ebben a cikkben a következőket fogja megismerni:

  • Modell létrehozása és betanítása TÁROLT SQL-eljárással
  • A betanított modell mentése SQL-táblába

Az első részben telepítette az előfeltételeket, és visszaállította a mintaadatbázist.

A második részben megvizsgálta a mintaadatokat, és létrehozott néhány diagramot.

A harmadik részben megtanulta, hogyan hozhat létre funkciókat nyers adatokból egy Transact-SQL függvény használatával. Ezt követően egy tárolt eljárásból meghívta ezt a függvényt, hogy létrehozhasson egy táblát, amely tartalmazza a funkcióértékeket.

Az ötödik részben megtanulhatja, hogyan lehet üzembe helyezni a negyedik részben betanított és mentett modelleket.

A mintaadatok felosztása betanítási és tesztelési csoportokra

  1. Hozzon létre egy PyTrainTestSplit nevű tárolt eljárást a nyctaxi_sample táblában lévő adatok két részre osztásához: nyctaxi_sample_training és nyctaxi_sample_testing.

    A létrehozáshoz futtassa a következő kódot:

    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. Ha egyéni felosztással szeretné megosztani az adatokat, futtassa a tárolt eljárást, és adjon meg egy egész szám paramétert, amely a betanítási csoporthoz lefoglalandó adatok százalékos arányát jelöli. Az alábbi utasítás például az adatok 60%-át osztja ki a tanuló halmazhoz.

    EXEC PyTrainTestSplit 60
    GO
    

Logisztikai regressziós modell létrehozása

Az adatok előkészítése után használhatja egy modell betanítására. Ezt úgy teheti meg, hogy meghív egy tárolt eljárást, amely valamilyen Python-kódot futtat, a betanítási adattábla bemeneteként. Ebben az oktatóanyagban két modellt hoz létre, mindkettő bináris besorolási modellt:

  • A pyTrainScikit tárolt eljárás egy tipp-előrejelzési modellt hoz létre a scikit-learn csomag használatával.
  • A TrainTipPredictionModelRxPy tárolt eljárás egy tipp-előrejelzési modellt hoz létre a revoscalepy-csomag használatával.

Minden tárolt eljárás a megadott bemeneti adatokat használja egy logisztikai regressziós modell létrehozásához és betanításához. Minden Python-kód be van csomagolva a rendszer által tárolt eljárásba, sp_execute_external_script.

A modell új adatokon való újratanításának megkönnyítése érdekében a hívást egy másik tárolt eljárásba kell burkolni sp_execute_external_script , és paraméterként átadni az új betanítási adatokat. Ez a szakasz végigvezeti ezen a folyamaton.

PyTrainScikit

  1. A Management Studióban nyisson meg egy új lekérdezési ablakot, és futtassa a következő utasítást a PyTrainScikit tárolt eljárás létrehozásához. A tárolt eljárás tartalmazza a bemeneti adatok definícióját, ezért nem kell bemeneti lekérdezést megadnia.

    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. A betanított modell nyc_taxi_models táblázatba való beszúrásához futtassa a következő SQL-utasításokat.

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

    Az adatok feldolgozása és a modell illesztése eltarthat néhány percig. Azok az üzenetek, amelyeket a Python stdout streamjének küldenének, megjelennek a Management Studio Üzenetek ablakában. Például:

    STDOUT message(s) from external script:
    C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
    
  3. Nyissa meg a táblázatot nyc_taxi_models. Láthatja, hogy egy új sor lett hozzáadva, amely az oszlopmodell szerializált modelljét tartalmazza.

    SciKit_model
    0x800363736B6C6561726E2E6C696E6561....
    

TrainTipPredictionModelRxPy

Ez a tárolt eljárás a revoscalepy Python-csomagot használja. Olyan objektumokat, átalakításokat és algoritmusokat tartalmaz, mint az R nyelv RevoScaleR-csomagjában .

A revoscalepy használatával távoli számítási környezeteket hozhat létre, adatokat helyezhet át a számítási környezetek között, átalakíthatja az adatokat, és prediktív modelleket taníthat be olyan népszerű algoritmusokkal, mint a logisztikai és lineáris regresszió, döntési fák stb. További információt az SQL Server revoscalepy moduljában és a revoscalepy függvényreferenciájában talál.

  1. A Management Studióban nyisson meg egy új lekérdezési ablakot, és futtassa a következő utasítást a TrainTipPredictionModelRxPy tárolt eljárás létrehozásához. Mivel a tárolt eljárás már tartalmazza a bemeneti adatok definícióját, nem kell bemeneti lekérdezést megadnia.

    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
    

    Ez a tárolt eljárás a következő lépéseket hajtja végre a modellbetanítás részeként:

    • A SELECT lekérdezés az fnCalculateDistance egyéni skaláris függvényt alkalmazza a felvételi és lerakási helyek közötti közvetlen távolság kiszámításához. A lekérdezés eredményei az alapértelmezett Python bemeneti változóban vannak tárolva. InputDataset
    • A billentett bináris változót címke - vagy eredményoszlopként használja a rendszer, és a modell a következő funkcióoszlopok használatával illeszkedik: passenger_count, trip_distance, trip_time_in_secs és direct_distance.
    • A betanított modell szerializálva van, és a Python változóban logitObjvan tárolva. A T-SQL-kulcsszó KIMENETének hozzáadásával hozzáadhatja a változót a tárolt eljárás kimeneteként. A következő lépésben ezt a változót használja a modell bináris kódjának beszúrására egy adatbázistábla nyc_taxi_models. Ez a mechanizmus megkönnyíti a modellek tárolását és újbóli használatát.
  2. Futtassa a tárolt eljárást az alábbiak szerint, hogy a betanított revoscalepy modellt beszúrja a nyc_taxi_models táblázatba.

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

    Az adatok feldolgozása és a modell illesztése eltarthat egy ideig. Azok az üzenetek, amelyeket a Python stdout streamjének küldenének, megjelennek a Management Studio Üzenetek ablakában. Például:

    STDOUT message(s) from external script:
    C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy
    
  3. Nyissa meg a táblázatot nyc_taxi_models. Láthatja, hogy egy új sor lett hozzáadva, amely az oszlopmodell szerializált modelljét tartalmazza.

    revoscalepy_model
    0x8003637265766F7363616c....
    

Az oktatóanyag következő részében a betanított modellek használatával fog előrejelzéseket létrehozni.

Következő lépések

Ebben a cikkben a következőt találja:

  • Modell létrehozása és betanítása tárolt SQL-eljárással
  • A betanított modell mentése SQL-táblába