Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2017 (14.x) a novější verze
Azure SQL Managed Instance
Ve čtvrté části této pětidílné série kurzů se dozvíte, jak trénovat model strojového učení pomocí balíčků Pythonu scikit-learn a revoscalepy. Tyto knihovny Pythonu jsou už nainstalované pomocí strojového učení SQL Serveru.
Moduly načtete a zavoláte potřebné funkce k vytvoření a trénování modelu pomocí uložené procedury SQL Serveru. Model vyžaduje datové funkce, které jste v předchozích částech této série kurzů zpracovali. Nakonec uložíte natrénovaný model do tabulky SQL Serveru.
V tomto článku:
- Vytvoření a trénování modelu pomocí uložené procedury SQL
- Uložení natrénovaného modelu do tabulky SQL
V první části jste nainstalovali požadavky a obnovili ukázkovou databázi.
Ve druhé části jste prozkoumali ukázková data a vygenerovali několik grafů.
Ve třetí části jste se naučili vytvářet funkce z nezpracovaných dat pomocí funkce Transact-SQL. Potom jste tuto funkci volali z uložené procedury a vytvořili tabulku obsahující hodnoty funkcí.
V 5. části se dozvíte, jak zprovoznit modely, které jste natrénovali a uložili ve čtvrté části.
Rozdělení ukázkových dat na trénovací a testovací sady
Vytvořte uloženou proceduru s názvem PyTrainTestSplit , která rozdělí data v tabulce nyctaxi_sample na dvě části: nyctaxi_sample_training a nyctaxi_sample_testing.
Spuštěním následujícího kódu ho vytvořte:
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 GOPokud chcete data rozdělit pomocí vlastního rozdělení, spusťte uloženou proceduru a zadejte celočíselnou hodnotu, která představuje procento dat, která se mají přidělit trénovací sadě. Například následující příkaz by přidělil trénovací sadě 60% dat.
EXEC PyTrainTestSplit 60 GO
Sestavení modelu logistické regrese
Jakmile jsou data připravená, můžete je použít k trénování modelu. Uděláte to tak, že zavoláte uloženou proceduru, která spustí nějaký kód Pythonu, který se zadává jako vstup do trénovací tabulky dat. Pro účely tohoto kurzu vytvoříte dva modely, oba binární klasifikační modely:
- Uložená procedura PyTrainScikit vytvoří prediktivní model tipu pomocí balíčku scikit-learn .
- Uložená procedura TrainTipPredictionModelRxPy vytvoří prediktivní model tipu pomocí balíčku revoscalepy .
Každá uložená procedura používá vstupní data, která poskytnete k vytvoření a trénování modelu logistické regrese. Veškerý kód Pythonu je zabalen do systémové uložené procedury, sp_execute_external_script.
Pokud chcete usnadnit přetrénování modelu na nová data, zabalíte volání do sp_execute_external_script jiné uložené procedury a předáte nová trénovací data jako parametr. Tato část vás provede tímto procesem.
PyTrainScikit
V sadě Management Studio otevřete nové okno dotazu a spuštěním následujícího příkazu vytvořte uloženou proceduru PyTrainScikit. Uložená procedura obsahuje definici vstupních dat, takže nemusíte zadávat vstupní dotaz.
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; GOSpuštěním následujících příkazů SQL vložte natrénovaný model do tabulky nyc_taxi_models.
DECLARE @model VARBINARY(MAX); EXEC PyTrainScikit @model OUTPUT; INSERT INTO nyc_taxi_models (name, model) VALUES('SciKit_model', @model);Zpracování dat a přizpůsobení modelu může trvat několik minut. Zprávy, které by se směrovaly do streamu stdout Pythonu, se zobrazí v okně Zprávy v sadě Management Studio. Například:
STDOUT message(s) from external script: C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepyOtevřete tabulku nyc_taxi_models. Můžete vidět, že byl přidán jeden nový řádek, který obsahuje serializovaný model v modelu sloupce.
SciKit_model 0x800363736B6C6561726E2E6C696E6561....
TrainTipPredictionModelRxPy
Tato uložená procedura používá balíček Pythonu revoscalepy . Obsahuje objekty, transformace a algoritmy podobné těm, které jsou k dispozici pro balíček RevoScaleR jazyka R.
Pomocí revoscalepy můžete vytvářet vzdálené výpočetní kontexty, přesouvat data mezi výpočetními kontexty, transformovat data a trénovat prediktivní modely pomocí oblíbených algoritmů, jako jsou logistická a lineární regrese, rozhodovací stromy a další. Další informace naleznete v tématu modul revoscalepy v SQL Serveru a referenční příručka funkcí revoscalepy.
V sadě Management Studio otevřete nové okno dotazu a spuštěním následujícího příkazu vytvořte uloženou proceduru TrainTipPredictionModelRxPy. Protože uložená procedura již obsahuje definici vstupních dat, nemusíte zadávat vstupní dotaz.
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; GOTato uložená procedura provádí v rámci trénování modelu následující kroky:
- Dotaz SELECT použije vlastní skalární funkci fnCalculateDistance k výpočtu přímé vzdálenosti mezi umístěními vyzvednutí a odkládacím umístěním. Výsledky dotazu jsou uloženy ve výchozí vstupní proměnné Pythonu.
InputDataset - Binární proměnná tipped se používá jako popisek nebo sloupec výsledku a model je přizpůsoben pomocí těchto sloupců vlastností: passenger_count, trip_distance, trip_time_in_secs a direct_distance.
- Trénovaný model je serializován a uložen v proměnné
logitObjPythonu . Přidáním klíčového slova T-SQL OUTPUT můžete proměnnou přidat jako výstup uložené procedury. V dalším kroku se tato proměnná použije k vložení binárního kódu modelu do databázové tabulky nyc_taxi_models. Tento mechanismus usnadňuje ukládání a opakované použití modelů.
- Dotaz SELECT použije vlastní skalární funkci fnCalculateDistance k výpočtu přímé vzdálenosti mezi umístěními vyzvednutí a odkládacím umístěním. Výsledky dotazu jsou uloženy ve výchozí vstupní proměnné Pythonu.
Spuštěním uložené procedury následujícím způsobem vložte natrénovaný model revoscalepy do tabulky nyc_taxi_models.
DECLARE @model VARBINARY(MAX); EXEC TrainTipPredictionModelRxPy @model OUTPUT; INSERT INTO nyc_taxi_models (name, model) VALUES('revoscalepy_model', @model);Zpracování dat a přizpůsobení modelu může nějakou dobu trvat. Zprávy, které by se směrovaly do streamu stdout Pythonu, se zobrazí v okně Zprávy v sadě Management Studio. Například:
STDOUT message(s) from external script: C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepyOtevřete tabulku nyc_taxi_models. Můžete vidět, že byl přidán jeden nový řádek, který obsahuje serializovaný model v modelu sloupce.
revoscalepy_model 0x8003637265766F7363616c....
V další části tohoto kurzu použijete vytrénované modely k vytváření předpovědí.
Další kroky
V tomto článku:
- Vytvoření a trénování modelu pomocí uložené procedury SQL
- Uložili jste natrénovaný model do tabulky SQL.