Sdílet prostřednictvím


Rychlý start: Vytvoření a určení skóre prediktivního modelu v Pythonu pomocí strojového učení SQL

Platí pro: SQL Server 2017 (14.x) a novější verze Azure SQL Managed Instance

V tomto rychlém startu vytvoříte a vytrénujete prediktivní model pomocí Pythonu. Model uložíte do tabulky v instanci SQL Serveru a pak použijete model k predikci hodnot z nových dat pomocí služeb SQL Server Machine Learning Services, Azure SQL Managed Instance Machine Learning Services nebo clusterů SQL Server Big Data.

Vytvoříte a spustíte dvě uložené procedury spuštěné v SQL. První používá klasickou datovou sadu iris květin a vygeneruje model Naïve Bayes k predikci druhu Iris na základě vlastností květin. Druhým postupem je bodování – volá model vygenerovaný v prvním postupu k výstupu sady predikcí na základě nových dat. Umístěním kódu Pythonu do uložené procedury SQL jsou operace obsaženy v SQL, jsou opakovaně použitelné a dají se volat jinými uloženými procedurami a klientskými aplikacemi.

Po dokončení tohoto rychlého startu se naučíte:

  • Jak vložit kód Pythonu do uložené procedury
  • Jak předat vstupy do kódu prostřednictvím parametrů uložené procedury
  • Jak se uložené procedury používají k zprovoznění modelů

Požadavky

Ke spuštění tohoto rychlého startu potřebujete následující požadavky.

Vytvoření uložené procedury, která generuje modely

V tomto kroku vytvoříte uloženou proceduru, která vygeneruje model pro predikci výsledků.

  1. Otevřete Azure Data Studio, připojte se k instanci SQL a otevřete nové okno dotazu.

  2. Připojte se k databázi irissql.

    USE irissql
    GO
    
  3. Zkopírujte následující kód a vytvořte novou uloženou proceduru.

    Po spuštění tento postup volá sp_execute_external_script ke spuštění relace Pythonu.

    Vstupy potřebné kódem Pythonu se předávají jako vstupní parametry pro tuto uloženou proceduru. Výstupem bude natrénovaný model založený na knihovně Python scikit-learn pro algoritmus strojového učení.

    Tento kód používá pickle k serializaci modelu. Model bude trénován pomocí dat ze sloupců 0 až 4 z tabulky iris_data .

    Parametry, které vidíte v druhé části procedury, vyjadřují vstupy dat a výstupy modelu. Co nejvíce chcete, aby kód Pythonu spuštěný v uložené proceduře měl jasně definované vstupy a výstupy, které se mapují na uložené vstupy procedur a výstupy předávané za běhu.

    CREATE PROCEDURE generate_iris_model (@trained_model VARBINARY(max) OUTPUT)
    AS
    BEGIN
        EXECUTE sp_execute_external_script @language = N'Python'
            , @script = N'
    import pickle
    from sklearn.naive_bayes import GaussianNB
    GNB = GaussianNB()
    trained_model = pickle.dumps(GNB.fit(iris_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]], iris_data[["SpeciesId"]].values.ravel()))
    '
            , @input_data_1 = N'select "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "SpeciesId" from iris_data'
            , @input_data_1_name = N'iris_data'
            , @params = N'@trained_model varbinary(max) OUTPUT'
            , @trained_model = @trained_model OUTPUT;
    END;
    GO
    
  4. Ověřte, že uložená procedura existuje.

    Pokud se skript T-SQL z předchozího kroku spustil bez chyby, vytvoří se nová uložená procedura s názvem generate_iris_model a přidá se do databáze irissql . Uložené procedury najdete v Průzkumníku objektů azure Data Studio v části Programovatelnost.

Proveďte postup pro vytvoření a natrénování modelů

V tomto kroku spustíte proceduru pro spuštění vloženého kódu a vytvoříte natrénovaný a serializovaný model jako výstup.

Modely uložené pro opakované použití v databázi jsou serializovány jako bajtový datový proud a uloženy ve sloupci VARBINARY(MAX) v tabulce databáze. Jakmile se model vytvoří, vytrénuje, serializuje a uloží do databáze, může být volán jinými postupy nebo funkcí PREDICT T-SQL v bodovacích úlohách.

  1. Spuštěním následujícího skriptu spusťte proceduru. Konkrétní příkaz pro provedení uložené procedury je EXECUTE na čtvrtém řádku.

    Tento konkrétní skript odstraní existující model se stejným názvem ("Naive Bayes") a vytvoří místo pro nové, které vytvoříte opětovným spuštěním stejného postupu. Bez odstranění modelu dojde k chybě, která hlásí, že objekt již existuje. Model je uložený v tabulce s názvem iris_models, která se zřizuje při vytváření databáze irissql .

    DECLARE @model varbinary(max);
    DECLARE @new_model_name varchar(50)
    SET @new_model_name = 'Naive Bayes'
    EXECUTE generate_iris_model @model OUTPUT;
    DELETE iris_models WHERE model_name = @new_model_name;
    INSERT INTO iris_models (model_name, model) values(@new_model_name, @model);
    GO
    
  2. Ověřte, že byl model vložen.

    SELECT * FROM dbo.iris_models
    

    Results

    model_name model
    Naive Bayes 0x800363736B6C6561726E2E6E616976655F62617965730A...

Vytvoření a spuštění uložené procedury pro generování předpovědí

Teď, když jste vytvořili, vytrénovali a uložili model, přejděte k dalšímu kroku: vytvoření uložené procedury, která generuje předpovědi. Uděláte to tak, že zavoláte sp_execute_external_script ke spuštění skriptu Pythonu, který načte serializovaný model a poskytne mu nové vstupy dat pro určení skóre.

  1. Spuštěním následujícího kódu vytvořte uloženou proceduru, která provádí vyhodnocování. V době běhu tento postup načte binární model, použije sloupce [1,2,3,4] jako vstupy a zadá sloupce [0,5,6] jako výstup.

    CREATE PROCEDURE predict_species (@model VARCHAR(100))
    AS
    BEGIN
        DECLARE @nb_model VARBINARY(max) = (
                SELECT model
                FROM iris_models
                WHERE model_name = @model
                );
    
        EXECUTE sp_execute_external_script @language = N'Python'
            , @script = N'
    import pickle
    irismodel = pickle.loads(nb_model)
    species_pred = irismodel.predict(iris_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]])
    iris_data["PredictedSpecies"] = species_pred
    OutputDataSet = iris_data[["id","SpeciesId","PredictedSpecies"]] 
    print(OutputDataSet)
    '
            , @input_data_1 = N'select id, "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "SpeciesId" from iris_data'
            , @input_data_1_name = N'iris_data'
            , @params = N'@nb_model varbinary(max)'
            , @nb_model = @nb_model
        WITH RESULT SETS((
                    "id" INT
                  , "SpeciesId" INT
                  , "SpeciesId.Predicted" INT
                    ));
    END;
    GO
    
  2. Spusťte uloženou proceduru a pojmenujte model "Naive Bayes", aby procedura věděla, který model se má použít.

    EXECUTE predict_species 'Naive Bayes';
    GO
    

    Když spustíte uloženou proceduru, vrátí datový rámec Pythonu. Tento řádek T-SQL určuje schéma pro vrácené výsledky: WITH RESULT SETS ( ("id" int, "SpeciesId" int, "SpeciesId.Predicted" int));. Výsledky můžete vložit do nové tabulky nebo je vrátit do aplikace.

    Sada výsledků ze spuštění uložené procedury

    Výsledky jsou 150 předpovědí o druhu používajících květinové charakteristiky jako vstupy. U většiny pozorování odpovídá predikovaný druh skutečnému druhu.

    Tento příklad byl jednoduchý pomocí datové sady Iris Pythonu pro trénování i vyhodnocování. Typický přístup by zahrnoval spuštění dotazu SQL pro získání nových dat a předání do Pythonu jako InputDataSet.

Conclusion

V tomto cvičení jste se dozvěděli, jak vytvořit uložené procedury vyhrazené pro různé úlohy, kde každá uložená procedura používala systémovou uloženou proceduru sp_execute_external_script ke spuštění procesu Pythonu. Vstupy do procesu Pythonu se předávají sp_execute_external jako parametry. Skript Pythonu i datové proměnné v databázi se předávají jako vstupy.

Obecně byste měli plánovat použití nástroje Azure Data Studio s leštěným kódem Pythonu nebo jednoduchým kódem Pythonu, který vrací výstup založený na řádcích. Azure Data Studio jako nástroj podporuje dotazovací jazyky, jako je T-SQL, a vrací ploché sady řádků. Pokud váš kód generuje vizuální výstup, jako je bodový graf nebo histogram, potřebujete samostatný nástroj nebo aplikaci koncového uživatele, která může vykreslit obrázek mimo uloženou proceduru.

Pro některé vývojáře Pythonu, kteří jsou zvyklí psaní všeobsažených skriptů, které zpracovávají celou řadu operací, může zdát zbytečné organizovat úlohy do samostatných procedur. Ale školení a bodování mají různé případy použití. Když je oddělíte, můžete každou úlohu umístit do jiného harmonogramu a určit rozsah oprávnění pro každou operaci.

Poslední výhodou je, že procesy je možné upravit pomocí parametrů. V tomto cvičení se kód Pythonu, který v tomto příkladu vytvořil model (pojmenovaný Naive Bayes), předal jako vstup do druhé uložené procedury, která model volá v procesu vyhodnocování. Toto cvičení používá pouze jeden model, ale můžete si představit, jak by parametrizace modelu v úloze hodnocení mohla učinit tento skript užitečnějším.

Další kroky

Další informace o kurzech pro Python s využitím strojového učení SQL najdete tady: