Delen via


R-zelfstudie: Model trainen en opslaan

Van toepassing op: SQL Server 2016 (13.x) en latere versies van Azure SQL Managed Instance

In deel vier van deze vijfdelige zelfstudiereeks leert u hoe u een machine learning-model traint met behulp van R. U traint het model met behulp van de gegevensfuncties die u in het vorige deel hebt gemaakt en slaat het getrainde model vervolgens op in een SQL Server-tabel. In dit geval zijn de R-pakketten al geïnstalleerd met R Services (In-Database), zodat alles kan worden gedaan vanuit SQL.

In dit artikel gaat u het volgende doen:

  • Een model maken en trainen met behulp van een op SQL opgeslagen procedure
  • Het getrainde model opslaan in een SQL-tabel

In deel 1 hebt u de vereisten geïnstalleerd en de voorbeelddatabase hersteld.

In deel twee hebt u de voorbeeldgegevens gecontroleerd en enkele plots gegenereerd.

In deel drie hebt u geleerd hoe u functies maakt op basis van onbewerkte gegevens met behulp van een Transact-SQL-functie. Vervolgens hebt u die functie aangeroepen vanuit een opgeslagen procedure om een tabel te maken die de functiewaarden bevat.

In deel vijf leert u hoe u de modellen kunt operationeel maken die u hebt getraind en opgeslagen in deel vier.

De opgeslagen procedure maken

Wanneer u R aanroept vanuit T-SQL, gebruikt u de door het systeem opgeslagen procedure sp_execute_external_script. Voor processen die u vaak herhaalt, zoals het opnieuw trainen van een model, is het echter eenvoudiger om de aanroep in sp_execute_external_script een andere opgeslagen procedure in te kapselen.

  1. Open in Management Studio een nieuw queryvenster .

  2. Voer de volgende instructie uit om de opgeslagen procedure RTrainLogitModel te maken. Deze opgeslagen procedure definieert de invoergegevens en maakt gebruik van glm om een logistiek regressiemodel te maken.

    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
    
    • Om ervoor te zorgen dat sommige gegevens overblijven om het model te testen, worden 70% van de gegevens willekeurig geselecteerd in de tabel met taxigegevens voor trainingsdoeleinden.

    • De SELECT-query maakt gebruik van de aangepaste scalaire functie fnCalculateDistance om de directe afstand tussen de ophaal- en afgiftelocaties te berekenen. De resultaten van de query worden opgeslagen in de standaard R-invoervariabele. InputDataset

    • Het R-script roept de R-functie glm aan om het logistieke regressiemodel te maken.

      De binaire variabele die wordt getypt , wordt gebruikt als de kolom met labels of resultaten en het model past bij de volgende functiekolommen: passenger_count, trip_distance, trip_time_in_secs en direct_distance.

    • Het getrainde model, opgeslagen in de R-variabele logitObj, wordt geserialiseerd en geretourneerd als uitvoerparameter.

Het R-model trainen en implementeren met behulp van de opgeslagen procedure

Omdat de opgeslagen procedure al een definitie van de invoergegevens bevat, hoeft u geen invoerquery op te geven.

  1. Als u het R-model wilt trainen en implementeren, roept u de opgeslagen procedure aan en voegt u het in de databasetabel in nyc_taxi_models, zodat u het kunt gebruiken voor toekomstige voorspellingen:

    DECLARE @model VARBINARY(MAX);
    EXEC RTrainLogitModel @model OUTPUT;
    INSERT INTO nyc_taxi_models (name, model) VALUES('RTrainLogit_model', @model);
    
  2. Bekijk het berichtenvenster van Management Studio voor berichten die worden doorgesluisd naar de stdoutstream van R, zoals dit bericht:

    "STDOUT-bericht(en) uit extern script: Rijen gelezen: 1193025, Totaalrijen verwerkt: 1193025, Totale segmenttijd: 0,093 seconden"

  3. Wanneer de instructie is voltooid, opent u de tabel nyc_taxi_models. Het verwerken van de gegevens en het aanpassen van het model kan enige tijd duren.

    U ziet dat er één nieuwe rij is toegevoegd, die het geserialiseerde model in het kolommodel bevat en de modelnaam RTrainLogit_model in de kolomnaam.

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

In het volgende deel van deze zelfstudie gebruikt u het getrainde model om voorspellingen te genereren.

Volgende stappen

In dit artikel gaat u als volgt te werk:

  • Een model gemaakt en getraind met behulp van een op SQL opgeslagen procedure
  • Het getrainde model opgeslagen in een SQL-tabel