Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              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 fyra delar distribuerar du en klustringsmodell som utvecklats i R till en databas med SQL Server Machine Learning Services eller i stordatakluster.
I del fyra i den här självstudieserien i fyra delar distribuerar du en klustermodell, utvecklad i R, till en databas med hjälp av SQL Server Machine Learning Services.
I del fyra i den här självstudieserien i fyra delar distribuerar du en klustringsmodell som utvecklats i R till en databas med SQL Server R Services.
I del fyra i den här självstudieserien i fyra delar distribuerar du en klustringsmodell som utvecklats i R till en databas med Hjälp av Azure SQL Managed Instance Machine Learning Services.
För att kunna utföra klustring regelbundet, när nya kunder registrerar sig, måste du kunna anropa R-skriptet från valfri app. För att göra det kan du distribuera R-skriptet i en databas genom att placera R-skriptet i en SQL-lagrad procedur. Eftersom din modell körs i databasen kan den enkelt tränas mot data som lagras i databasen.
I den här artikeln får du lära dig att:
- Skapa en lagrad procedur som genererar modellen
 - Utföra klustring
 - Använda klustringsinformationen
 
I del ett installerade du förhandskraven och återställde exempeldatabasen.
I del två lärde du dig hur du förbereder data från en databas för att utföra klustring.
I del tre lärde du dig att skapa och träna en K-Means-klustermodell i R.
Prerequisites
- Del fyra i den här självstudieserien förutsätter att du har uppfyllt förutsättningarna för del ett och slutfört stegen i del två och del tre.
 
Skapa en lagrad procedur som genererar modellen
Kör följande T-SQL-skript för att skapa den lagrade proceduren. Proceduren återskapar de steg som du utvecklade i del två och tre i den här självstudieserien:
- klassificera kunder baserat på deras inköps- och returhistorik
 - generera fyra kluster av kunder med hjälp av en K-Means-algoritm
 
Proceduren lagrar resulterande kundklustermappningar i databastabellen customer_return_clusters.
USE [tpcxbb_1gb]
DROP PROC IF EXISTS generate_customer_return_clusters;
GO
CREATE procedure [dbo].[generate_customer_return_clusters]
AS
/*
  This procedure uses R to classify customers into different groups
  based on their purchase & return history.
*/
BEGIN
    DECLARE @duration FLOAT
    , @instance_name NVARCHAR(100) = @@SERVERNAME
    , @database_name NVARCHAR(128) = db_name()
-- Input query to generate the purchase history & return metrics
    , @input_query NVARCHAR(MAX) = N'
SELECT ss_customer_sk AS customer,
    round(CASE 
            WHEN (
                    (orders_count = 0)
                    OR (returns_count IS NULL)
                    OR (orders_count IS NULL)
                    OR ((returns_count / orders_count) IS NULL)
                    )
                THEN 0.0
            ELSE (cast(returns_count AS NCHAR(10)) / orders_count)
            END, 7) AS orderRatio,
    round(CASE 
            WHEN (
                    (orders_items = 0)
                    OR (returns_items IS NULL)
                    OR (orders_items IS NULL)
                    OR ((returns_items / orders_items) IS NULL)
                    )
                THEN 0.0
            ELSE (cast(returns_items AS NCHAR(10)) / orders_items)
            END, 7) AS itemsRatio,
    round(CASE 
            WHEN (
                    (orders_money = 0)
                    OR (returns_money IS NULL)
                    OR (orders_money IS NULL)
                    OR ((returns_money / orders_money) IS NULL)
                    )
                THEN 0.0
            ELSE (cast(returns_money AS NCHAR(10)) / orders_money)
            END, 7) AS monetaryRatio,
    round(CASE 
            WHEN (returns_count IS NULL)
                THEN 0.0
            ELSE returns_count
            END, 0) AS frequency
FROM (
    SELECT ss_customer_sk,
        -- return order ratio
        COUNT(DISTINCT (ss_ticket_number)) AS orders_count,
        -- return ss_item_sk ratio
        COUNT(ss_item_sk) AS orders_items,
        -- return monetary amount ratio
        SUM(ss_net_paid) AS orders_money
    FROM store_sales s
    GROUP BY ss_customer_sk
    ) orders
LEFT OUTER JOIN (
    SELECT sr_customer_sk,
        -- return order ratio
        count(DISTINCT (sr_ticket_number)) AS returns_count,
        -- return ss_item_sk ratio
        COUNT(sr_item_sk) AS returns_items,
        -- return monetary amount ratio
        SUM(sr_return_amt) AS returns_money
    FROM store_returns
    GROUP BY sr_customer_sk
    ) returned ON ss_customer_sk = sr_customer_sk
 '
EXECUTE sp_execute_external_script
      @language = N'R'
    , @script = N'
# Define the connection string
connStr <- paste("Driver=SQL Server; Server=", instance_name,
                 "; Database=", database_name,
                 "; uid=Username;pwd=Password; ",
                 sep="" )
# Input customer data that needs to be classified.
# This is the result we get from the query.
library(RODBC)
ch <- odbcDriverConnect(connStr);
customer_data <- sqlQuery(ch, input_query)
sqlDrop(ch, "customer_return_clusters")
## create clustering model
clust <- kmeans(customer_data[,2:5],4)
## create clustering output for table
customer_cluster <- data.frame(cluster=clust$cluster,customer=customer_data$customer,orderRatio=customer_data$orderRatio,
			itemsRatio=customer_data$itemsRatio,monetaryRatio=customer_data$monetaryRatio,frequency=customer_data$frequency)
## write cluster output to DB table
sqlSave(ch, customer_cluster, tablename = "customer_return_clusters")
## clean up
odbcClose(ch)
'
    , @input_data_1 = N''
    , @params = N'@instance_name nvarchar(100), @database_name nvarchar(128), @input_query nvarchar(max), @duration float OUTPUT'
    , @instance_name = @instance_name
    , @database_name = @database_name
    , @input_query = @input_query
    , @duration = @duration OUTPUT;
END;
GO
Utföra klustring
Nu när du har skapat den lagrade proceduren kör du följande skript för att utföra klustring.
--Empty table of the results before running the stored procedure
TRUNCATE TABLE customer_return_clusters;
--Execute the clustering
--This will load the table customer_return_clusters with cluster mappings
EXECUTE [dbo].[generate_customer_return_clusters];
Kontrollera att det fungerar och att vi faktiskt har en lista över kunder och deras klustermappningar.
--Select data from table customer_return_clusters
--to verify that the clustering data was loaded
SELECT TOP (5) *
FROM customer_return_clusters;
Här är resultatet.
cluster  customer  orderRatio  itemsRatio  monetaryRatio  frequency
1        29727     0           0           0              0
4        26429     0           0           0.041979       1
2        60053     0           0           0.065762       3
2        97643     0           0           0.037034       3
2        32549     0           0           0.031281       4
Använda klustringsinformationen
Eftersom du har lagrat klustringsproceduren i databasen kan den utföra klustring effektivt mot kunddata som lagras i samma databas. Du kan köra proceduren när dina kunddata uppdateras och använda den uppdaterade klustringsinformationen.
Anta att du vill skicka ett kampanjmeddelande till kunder i kluster 0, gruppen som var inaktiv (du kan se hur de fyra klustren beskrevs i del tre i den här självstudien). Följande kod väljer e-postadresserna till kunder i kluster 0.
USE [tpcxbb_1gb]
--Get email addresses of customers in cluster 0 for a promotion campaign
SELECT customer.[c_email_address], customer.c_customer_sk
  FROM dbo.customer
  JOIN
  [dbo].[customer_clusters] as c
  ON c.Customer = customer.c_customer_sk
  WHERE c.cluster = 0
Du kan ändra c.cluster-värdet för att returnera e-postadresser för kunder i andra kluster.
Rensa resurser
När du är klar med den här handledningen kan du ta bort databasen tpcxbb_1gb.
Nästa steg
I del fyra i den här självstudieserien lärde du dig att:
- Skapa en lagrad procedur som genererar modellen
 - Utföra klustring med SQL-maskininlärning
 - Använda klustringsinformationen
 
Mer information om hur du använder R i Machine Learning Services finns i: