Dela via


Python-självstudie: Distribuera en modell för att kategorisera kunder med SQL-maskininlärning

Gäller för: SQL Server 2017 (14.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 Python till en databas med HJÄLP av SQL Server Machine Learning Services eller stordatakluster.

I del fyra i den här självstudieserien i fyra delar distribuerar du en klustringsmodell som utvecklats i Python 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 Python 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 Python-skriptet från valfri app. För att göra det kan du distribuera Python-skriptet i en databas genom att placera Python-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 det här avsnittet överför du Python-koden du just skrev till servern och implementerar klustring.

I den här artikeln får du lära dig att:

  • Skapa en lagrad procedur som genererar modellen
  • Utföra klustring på servern
  • 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 Python.

Förutsättningar

  • 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 ett och två 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
USE [tpcxbb_1gb]
GO

DROP procedure IF EXISTS [dbo].[py_generate_customer_return_clusters];
GO

CREATE procedure [dbo].[py_generate_customer_return_clusters]
AS

BEGIN
    DECLARE

-- Input query to generate the purchase history & return metrics
     @input_query NVARCHAR(MAX) = N'
SELECT
  ss_customer_sk AS customer,
  CAST( (ROUND(COALESCE(returns_count / NULLIF(1.0*orders_count, 0), 0), 7) ) AS FLOAT) AS orderRatio,
  CAST( (ROUND(COALESCE(returns_items / NULLIF(1.0*orders_items, 0), 0), 7) ) AS FLOAT) AS itemsRatio,
  CAST( (ROUND(COALESCE(returns_money / NULLIF(1.0*orders_money, 0), 0), 7) ) AS FLOAT) AS monetaryRatio,
  CAST( (COALESCE(returns_count, 0)) AS FLOAT) 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
 '

EXEC sp_execute_external_script
      @language = N'Python'
    , @script = N'

import pandas as pd
from sklearn.cluster import KMeans

#get data from input query
customer_data = my_input_data

#We concluded in step 2 in the tutorial that 4 would be a good number of clusters
n_clusters = 4

#Perform clustering
est = KMeans(n_clusters=n_clusters, random_state=111).fit(customer_data[["orderRatio","itemsRatio","monetaryRatio","frequency"]])
clusters = est.labels_
customer_data["cluster"] = clusters

OutputDataSet = customer_data
'
    , @input_data_1 = @input_query
    , @input_data_1_name = N'my_input_data'
             with result sets (("Customer" int, "orderRatio" float,"itemsRatio" float,"monetaryRatio" float,"frequency" float,"cluster" float));
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 med hjälp av proceduren.

--Create a table to store the predictions in

DROP TABLE IF EXISTS [dbo].[py_customer_clusters];
GO

CREATE TABLE [dbo].[py_customer_clusters] (
    [Customer] [bigint] NULL
  , [OrderRatio] [float] NULL
  , [itemsRatio] [float] NULL
  , [monetaryRatio] [float] NULL
  , [frequency] [float] NULL
  , [cluster] [int] NULL
  ,
    ) ON [PRIMARY]
GO

--Execute the clustering and insert results into table
INSERT INTO py_customer_clusters
EXEC [dbo].[py_generate_customer_return_clusters];

-- Select contents of the table to verify it works
SELECT * FROM py_customer_clusters;

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].[py_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 handledningen kan du ta bort tpcxbb_1gb-databasen.

Nästa steg

I del fyra i den här självstudieserien har du slutfört följande steg:

  • Skapa en lagrad procedur som genererar modellen
  • Utföra klustring på servern
  • Använda klustringsinformationen

Mer information om hur du använder Python i SQL-maskininlärning finns i: