Dela via


R-självstudie: Träna upp och spara modellen

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL Managed Instance

I del fyra i den här självstudieserien i fem delar får du lära dig hur du tränar en maskininlärningsmodell med hjälp av R. Du tränar modellen med hjälp av de datafunktioner som du skapade i föregående del och sparar sedan den tränade modellen i en SQL Server-tabell. I det här fallet är R-paketen redan installerade med R Services (In-Database), så allt kan göras från SQL.

I den här artikeln ska du:

  • Skapa och träna en modell med hjälp av en SQL-lagrad procedur
  • Spara den tränade modellen i en SQL-tabell

I del ett installerade du förhandskraven och återställde exempeldatabasen.

I del två granskade du exempeldata och genererade några diagram.

I del tre lärde du dig att skapa funktioner från rådata med hjälp av en Transact-SQL funktion. Sedan anropade du funktionen från en lagrad procedur för att skapa en tabell som innehåller funktionsvärdena.

I del fem får du lära dig hur du operationaliserar de modeller som du har tränat och sparat i del fyra.

Skapa den lagrade proceduren

När du anropar R från T-SQL använder du den system lagrade proceduren sp_execute_external_script. Men för processer som du upprepar ofta, till exempel omträning av en modell, är det lättare att kapsla in anropet till sp_execute_external_script i en annan lagrad procedur.

  1. Öppna ett nytt frågefönster i Management Studio.

  2. Kör följande instruktion för att skapa den lagrade proceduren RTrainLogitModel. Den här lagrade proceduren definierar indata och använder glm för att skapa en logistisk regressionsmodell.

    CREATE PROCEDURE [dbo].[RTrainLogitModel] (@trained_model varbinary(max) OUTPUT)
    
    AS
    BEGIN
      DECLARE @inquery nvarchar(max) = N'
        select tipped, fare_amount, passenger_count,trip_time_in_secs,trip_distance,
        pickup_datetime, dropoff_datetime,
        dbo.fnCalculateDistance(pickup_latitude, pickup_longitude,  dropoff_latitude, dropoff_longitude) as direct_distance
        from nyctaxi_sample
        tablesample (70 percent) repeatable (98052)
    '
    
      EXEC sp_execute_external_script @language = N'R',
                                      @script = N'
    ## Create model
    logitObj <- glm(tipped ~ passenger_count + trip_distance + trip_time_in_secs + direct_distance, data = InputDataSet, family = binomial)
    summary(logitObj)
    
    ## Serialize model 
    trained_model <- as.raw(serialize(logitObj, NULL));
    ',
      @input_data_1 = @inquery,
      @params = N'@trained_model varbinary(max) OUTPUT',
      @trained_model = @trained_model OUTPUT; 
    END
    GO
    
    • För att säkerställa att vissa data lämnas över för att testa modellen väljs 70% av data slumpmässigt från taxidatatabellen i träningssyfte.

    • SELECT-frågan använder den anpassade skalärfunktionen fnCalculateDistance för att beräkna det direkta avståndet mellan upphämtnings- och avlämningsplatserna. Resultatet av frågan lagras i standardvariabeln R-indata, InputDataset.

    • R-skriptet anropar R-funktionen glm för att skapa den logistiska regressionsmodellen.

      Den binära variabeln tipped används som etikett eller utfallskolumn, och modellen anpassas med hjälp av dessa egenskapskolumner: passenger_count, trip_distance, trip_time_in_secs och direct_distance.

    • Den tränade modellen, som sparas i R-variabeln logitObj, serialiseras och returneras som en utdataparameter.

Träna och distribuera R-modellen med hjälp av den lagrade proceduren

Eftersom den lagrade proceduren redan innehåller en definition av indata behöver du inte ange någon indatafråga.

  1. Om du vill träna och distribuera R-modellen anropar du den lagrade proceduren och infogar den i databastabellen nyc_taxi_models så att du kan använda den för framtida förutsägelser:

    DECLARE @model VARBINARY(MAX);
    EXEC RTrainLogitModel @model OUTPUT;
    INSERT INTO nyc_taxi_models (name, model) VALUES('RTrainLogit_model', @model);
    
  2. Titta på Meddelanden-fönstret i Management Studio för meddelanden som skulle skickas till R:s stdout-ström, som det här meddelandet:

    "STDOUT-meddelanden från externt skript: Rader Läs: 1193025, Totalt antal bearbetade rader: 1193025, Total segmenttid: 0,093 sekunder"

  3. När instruktionen har slutförts öppnar du tabellen nyc_taxi_models. Det kan ta en stund att bearbeta data och anpassa modellen.

    Du kan se att en ny rad har lagts till, som innehåller den serialiserade modellen i kolumnmodellen och modellnamnet RTrainLogit_model i kolumnnamnet.

    model                        name
    ---------------------------- ------------------
    0x580A00000002000302020....  RTrainLogit_model
    

I nästa del av den här självstudien använder du den tränade modellen för att generera förutsägelser.

Nästa steg

I den här artikeln kommer du att:

  • Skapat och tränat en modell med hjälp av en SQL-lagrad procedur
  • Sparade den tränade modellen i en SQL-tabell