Sestavení modelu R a uložení na SQL Server (názorný postup)
platí pro: SQL Server 2016 (13.x) a novější verze
V tomto kroku se dozvíte, jak vytvořit model strojového učení a uložit ho na SQL Serveru. Uložením modelu můžete provádět jeho volání přímo z Transact-SQL kódu pomocí uložené systémové procedury sp_execute_external_script nebo funkce PREDICT (T-SQL).
Požadavky
Tento krok předpokládá probíhající relaci R na základě předchozích kroků v tomto návodu. Používá připojovací řetězce a objekty zdroje dat vytvořené v těchto krocích. Ke spuštění skriptu se používají následující nástroje a balíčky.
- Rgui.exe ke spuštění příkazů jazyka R
- Management Studio pro spuštění T-SQL
- Balíček ROCR
- Balíček RODBC
Vytvoření uložené procedury pro ukládání modelů
Tento krok používá uloženou proceduru k uložení natrénovaného modelu na SQL Server. Vytvoření uložené procedury pro provedení této operace usnadňuje úlohu.
Spuštěním následujícího kódu T-SQL v oknech dotazu v sadě Management Studio vytvořte uloženou proceduru.
USE [NYCTaxi_Sample]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'PersistModel')
DROP PROCEDURE PersistModel
GO
CREATE PROCEDURE [dbo].[PersistModel] @m nvarchar(max)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
insert into nyc_taxi_models (model) values (convert(varbinary(max),@m,2))
END
GO
Poznámka
Pokud se zobrazí chyba, ujistěte se, že vaše přihlášení má oprávnění k vytváření objektů. Explicitní oprávnění k vytváření objektů můžete udělit spuštěním příkazu T-SQL takto: exec sp_addrolemember 'db_owner', '<user_name>'
.
Vytvoření klasifikačního modelu pomocí rxLogit
Model je binární klasifikátor, který předpovídá, jestli řidič taxislužby pravděpodobně dostane tip na konkrétní jízdu nebo ne. K trénování klasifikátoru tipu pomocí logistické regrese použijete zdroj dat, který jste vytvořili v předchozí lekci.
Voláním funkce rxLogit, která je součástí balíčku RevoScaleR, vytvořte logistický regresní model.
system.time(logitObj <- rxLogit(tipped ~ passenger_count + trip_distance + trip_time_in_secs + direct_distance, data = featureDataSource));
Volání, které sestaví model, je uzavřeno do funkce system.time. To vám umožní získat čas potřebný k sestavení modelu.
Po sestavení modelu ho můžete zkontrolovat pomocí funkce
summary
a zobrazit koeficienty.summary(logitObj);
Výsledky
*Logistic Regression Results for: tipped ~ passenger_count + trip_distance + trip_time_in_secs +* direct_distance* *Data: featureDataSource (RxSqlServerData Data Source)* *Dependent variable(s): tipped* *Total independent variables: 5* *Number of valid observations: 17068* *Number of missing observations: 0* *-2\*LogLikelihood: 23540.0602 (Residual deviance on 17063 degrees of freedom)* *Coefficients:* *Estimate Std. Error z value Pr(>|z|)* *(Intercept) -2.509e-03 3.223e-02 -0.078 0.93793* *passenger_count -5.753e-02 1.088e-02 -5.289 1.23e-07 \*\*\** *trip_distance -3.896e-02 1.466e-02 -2.658 0.00786 \*\** *trip_time_in_secs 2.115e-04 4.336e-05 4.878 1.07e-06 \*\*\** *direct_distance 6.156e-02 2.076e-02 2.966 0.00302 \*\** *---* *Signif. codes: 0 '\*\*\*' 0.001 '\*\*' 0.01 '\*' 0.05 '.' 0.1 ' ' 1* *Condition number of final variance-covariance matrix: 48.3933* *Number of iterations: 4*
Použití modelu logistické regrese pro bodování
Teď, když je model sestavený, můžete jej použít k predikci, jestli řidič pravděpodobně dostane tip během konkrétní jízdy nebo ne.
Nejprve pomocí funkce RxSqlServerData definujte objekt zdroje dat pro uložení výsledku vyhodnocování.
scoredOutput <- RxSqlServerData( connectionString = connStr, table = "taxiScoreOutput" )
Pro zjednodušení tohoto příkladu je vstup do logistického regresního modelu stejný zdroj dat funkce (
sql_feature_ds
), který jste použili k trénování modelu. Obvykle můžete mít nějaká nová data, pomocí kterých můžete skóre získat, nebo jste si možná vyhradili některá data pro testování a trénování.Výsledky předpovědi budou uloženy v tabulce taxiscoreOutput. Všimněte si, že schéma pro tuto tabulku není definováno při jeho vytvoření pomocí rxSqlServerData. Schéma se získá z výstupu rxPredict.
Pokud chcete vytvořit tabulku, ve které jsou uložené predikované hodnoty, musí mít přihlášení SQL, ve kterém běží datová funkce rxSqlServer, oprávnění DDL v databázi. Pokud přihlášení nemůže vytvořit tabulky, příkaz selže.
Voláním funkce rxPredict vygenerujte výsledky.
rxPredict(modelObject = logitObj, data = featureDataSource, outData = scoredOutput, predVarNames = "Score", type = "response", writeModelVars = TRUE, overwrite = TRUE)
Pokud se příkaz úspěšně spustí, zabere to nějaký čas. Po dokončení můžete otevřít aplikaci SQL Server Management Studio a ověřit, že byla vytvořena tabulka a zda obsahuje sloupec Skóre a další očekávaný výstup.
Přesnost modelu vykreslování
Pokud chcete získat představu o přesnosti modelu, můžete k vykreslení provozní křivky přijímače použít funkci rxRoc. Vzhledem k tomu, že rxRoc je jednou z nových funkcí poskytovaných balíčkem RevoScaleR, který podporuje vzdálené výpočetní kontexty, máte dvě možnosti:
Pomocí funkce rxRoc můžete spustit vykreslení ve vzdáleném výpočetním kontextu a pak ho vrátit do místního klienta.
Data můžete také importovat do klientského počítače R a pomocí dalších funkcí vykreslování jazyka R vytvořit graf výkonu.
V této části budete experimentovat s oběma technikami.
Spuštění grafu ve vzdáleném výpočetním kontextu (SQL Server)
Zavolejte funkci rxRoc a zadejte data definovaná dříve jako vstup.
scoredOutput = rxImport(scoredOutput); rxRoc(actualVarName= "tipped", predVarNames = "Score", scoredOutput);
Toto volání vrátí hodnoty použité při výpočtu grafu ROC. Sloupec s názvem je označen , který obsahuje skutečné výsledky, jež se snažíte předpovědět, zatímco sloupec Skóre obsahuje předpověď.
Pokud chcete graf skutečně vykreslit, můžete objekt ROC uložit a pak ho nakreslit pomocí funkce vykreslení. Graf se vytvoří ve vzdáleném výpočetním kontextu a vrátí se do prostředí R.
scoredOutput = rxImport(scoredOutput); rocObjectOut <- rxRoc(actualVarName= "tipped", predVarNames = "Score", scoredOutput); plot(rocObjectOut);
Zobrazte graf tak, že otevřete grafické zařízení jazyka R nebo kliknete na okno Plot v RStudio.
Vytvoření grafů v místním výpočetním kontextu pomocí dat z SQL Serveru
Výpočetní kontext můžete ověřit místním spuštěním rxGetComputeContext()
na příkazovém řádku. Návratová hodnota by měla být RxLocalSeq Compute Context.
Pro místní výpočetní kontext je proces velmi stejný. Pomocí funkce rxImport přenesete zadaná data do místního prostředí R.
scoredOutput = rxImport(scoredOutput)
Pomocí dat v místní paměti načtete balíček ROCR a pomocí prediktivní funkce z balíčku vytvoříte nové předpovědi.
library('ROCR'); pred <- prediction(scoredOutput$Score, scoredOutput$tipped);
Vygenerujte místní graf na základě hodnot uložených ve výstupní proměnné
pred
.acc.perf = performance(pred, measure = 'acc'); plot(acc.perf); ind = which.max( slot(acc.perf, 'y.values')[[1]] ); acc = slot(acc.perf, 'y.values')[[1]][ind]; cutoff = slot(acc.perf, 'x.values')[[1]][ind];
Poznámka
Grafy můžou vypadat jinak, a to v závislosti na tom, kolik datových bodů jste použili.
Nasazení modelu
Jakmile vytvoříte model a zjistíte, že funguje dobře, pravděpodobně ho budete chtít nasadit na místo, kde uživatelé nebo lidé ve vaší organizaci mohou model používat, nebo model můžete pravidelně přetrénovat a překalibrovat. Tento proces se někdy označuje jako operacionalizace modelu. V SQL Serveru se zprovoznění dosahuje vložením kódu R do uložené procedury. Vzhledem k tomu, že kód se nachází v postupu, lze volat z jakékoli aplikace, která se může připojit k SQL Serveru.
Než budete moct model volat z externí aplikace, musíte model uložit do databáze použité pro produkční prostředí. Vytrénované modely jsou uloženy v binární podobě v jednom sloupci typu varbinary(max).
Typický pracovní postup nasazení se skládá z následujících kroků:
- Serializace modelu do šestnáctkového řetězce
- Přenos serializovaného objektu do databáze
- Uložení modelu ve sloupci varbinary(max)
V této části se dozvíte, jak pomocí uložené procedury zachovat model a zpřístupnit ho pro předpovědi. Uložená procedura použitá v této části je PersistModel. Definice PersistModel je v požadavky.
Přepněte zpět do místního prostředí R, pokud ho ještě nepoužíváte, serializujte model a uložte ho do proměnné.
rxSetComputeContext("local"); modelbin <- serialize(logitObj, NULL); modelbinstr=paste(modelbin, collapse="");
Otevřete připojení ODBC pomocí RODBC. Pokud už máte balíček načtený, můžete vynechat volání RODBC.
library(RODBC); conn <- odbcDriverConnect(connStr);
Zavolejte uloženou proceduru PersistModel na SQL Serveru k přenosu serializovaného objektu do databáze a uložení binární reprezentace modelu ve sloupci.
q <- paste("EXEC PersistModel @m='", modelbinstr,"'", sep=""); sqlQuery (conn, q);
Pomocí nástroje Management Studio ověřte, že model existuje. V Průzkumníku objektů klikněte pravým tlačítkem na tabulku nyc_taxi_models a zvolte Vybrat prvních 1000 řádků. Ve výsledcích byste měli vidět binární reprezentaci ve sloupci modelů .
Uložení modelu do tabulky vyžaduje pouze příkaz INSERT. Je však často jednodušší, když je obalena do uložené procedury, jako je například PersistModel.
Další kroky
V další a poslední lekci se dozvíte, jak provádět bodování proti uloženému modelu pomocí jazyka Transact-SQL.