Tutorial: Como criar modelos de classificação multiclasse
Neste tutorial, você usa o Amazon Redshift ML para criar um modelo de machine learning que solucione problemas de classificação multiclasse. O algoritmo de classificação multiclasse enquadra os pontos de dados em uma das três ou mais classes. Em seguida, você implementa consultas usando a função SQL gerada pelo comando CREATE MODEL.
Você pode usar um comando CREATE MODEL para exportar dados de treinamento, treinar um modelo, importar o modelo e preparar uma função de previsão do Amazon Redshift. Use a operação CREATE MODEL para especificar dados de treinamento como uma tabela ou instrução SELECT.
Para acompanhar o tutorial, você usa o conjunto de dados público E-Commerce Sales Forecast
Exemplos de casos de uso
Você pode resolver outros problemas de classificação multiclasse com o Amazon Redshift ML, como prever o produto mais vendido de uma linha de produtos. Você também pode prever quais frutas uma imagem contém, como selecionar maçãs, peras ou laranjas.
Tarefas
-
Pré-requisitos
-
Etapa 1: Carregar dados do Amazon S3 para o Amazon Redshift
-
Etapa 2: Criar o modelo de machine learning
-
Etapa 3: Executar previsões com o modelo
Pré-requisitos
Para finalizar este tutorial, você deve concluir a configuração administrativa do Amazon Redshift ML.
Etapa 1: Carregar dados do Amazon S3 para o Amazon Redshift
Use o editor de consultas v2 do Amazon Redshift para executar as consultas a seguir. Estas consultas carregam os dados de exemplo no Amazon Redshift.
-
A consulta a seguir cria uma tabela chamada
ecommerce_sales
.CREATE TABLE IF NOT EXISTS ecommerce_sales ( invoiceno VARCHAR(30), stockcode VARCHAR(30), description VARCHAR(60), quantity DOUBLE PRECISION, invoicedate VARCHAR(30), unitprice DOUBLE PRECISION, customerid BIGINT, country VARCHAR(25) );
-
A consulta a seguir copia os dados de exemplo do conjunto de dados E-Commerce Sales Forecast
para a tabela ecommerce_sales
.COPY ecommerce_sales FROM 's3://redshift-ml-multiclass/ecommerce_data.txt' IAM_ROLE default DELIMITER '\t' IGNOREHEADER 1 REGION 'us-east-1' MAXERROR 100;
Dividir os dados
Quando você cria um modelo no Amazon Redshift ML, o SageMaker AI divide automaticamente os dados em conjuntos de treinamento e teste, para que o SageMaker AI possa determinar a precisão do modelo. Ao dividir manualmente os dados nesta etapa, você poderá verificar a precisão do modelo alocando um conjunto de previsões adicional.
Use a instrução SQL a seguir para dividir os dados em três conjuntos para treinamento, validação e previsão.
--creates table with all data CREATE TABLE ecommerce_sales_data AS ( SELECT t1.stockcode, t1.description, t1.invoicedate, t1.customerid, t1.country, t1.sales_amt, CAST(RANDOM() * 100 AS INT) AS data_group_id FROM ( SELECT stockcode, description, invoicedate, customerid, country, SUM(quantity * unitprice) AS sales_amt FROM ecommerce_sales GROUP BY 1, 2, 3, 4, 5 ) t1 ); --creates training set CREATE TABLE ecommerce_sales_training AS ( SELECT a.customerid, a.country, a.stockcode, a.description, a.invoicedate, a.sales_amt, (b.nbr_months_active) AS nbr_months_active FROM ecommerce_sales_data a INNER JOIN ( SELECT customerid, COUNT( DISTINCT( DATE_PART(y, CAST(invoicedate AS DATE)) || '-' || LPAD( DATE_PART(mon, CAST(invoicedate AS DATE)), 2, '00' ) ) ) AS nbr_months_active FROM ecommerce_sales_data GROUP BY 1 ) b ON a.customerid = b.customerid WHERE a.data_group_id < 80 ); --creates validation set CREATE TABLE ecommerce_sales_validation AS ( SELECT a.customerid, a.country, a.stockcode, a.description, a.invoicedate, a.sales_amt, (b.nbr_months_active) AS nbr_months_active FROM ecommerce_sales_data a INNER JOIN ( SELECT customerid, COUNT( DISTINCT( DATE_PART(y, CAST(invoicedate AS DATE)) || '-' || LPAD( DATE_PART(mon, CAST(invoicedate AS DATE)), 2, '00' ) ) ) AS nbr_months_active FROM ecommerce_sales_data GROUP BY 1 ) b ON a.customerid = b.customerid WHERE a.data_group_id BETWEEN 80 AND 90 ); --creates prediction set CREATE TABLE ecommerce_sales_prediction AS ( SELECT customerid, country, stockcode, description, invoicedate, sales_amt FROM ecommerce_sales_data WHERE data_group_id > 90);
Etapa 2: Criar o modelo de machine learning
Nesta etapa, você usa a instrução CREATE MODEL para criar seu modelo de machine learning usando a classificação multiclasse.
A consulta a seguir cria o modelo de classificação multiclasse com o conjunto de treinamento usando a operação CREATE MODEL. Substitua amzn-s3-demo-bucket por seu próprio bucket do Amazon S3.
CREATE MODEL ecommerce_customer_activity FROM ( SELECT customerid, country, stockcode, description, invoicedate, sales_amt, nbr_months_active FROM ecommerce_sales_training ) TARGET nbr_months_active FUNCTION predict_customer_activity IAM_ROLE default PROBLEM_TYPE MULTICLASS_CLASSIFICATION SETTINGS ( S3_BUCKET 'amzn-s3-demo-bucket', S3_GARBAGE_COLLECT OFF );
Nessa consulta, você especifica o tipo de problema como Multiclass_Classification
. O destino que você prevê para o modelo é nbr_months_active
. Quando o SageMaker AI termina de treinar o modelo, ele cria a função predict_customer_activity
, que você usará para fazer previsões no Amazon Redshift.
Mostrar o status do modelo de treinamento (opcional)
Você pode usar o comando SHOW MODEL para saber quando o modelo está pronto.
Use a consulta a seguir para retornar várias métricas do modelo, incluindo o estado e a precisão.
SHOW MODEL ecommerce_customer_activity;
Quando o modelo estiver pronto, a saída da operação anterior deverá mostrar que o Model State
é Ready
. Veja a seguir um exemplo de saída da operação anterior SHOW MODEL.
+--------------------------+-----------------------------------------------------------------------------------------------+ | Model Name | ecommerce_customer_activity | +--------------------------+-----------------------------------------------------------------------------------------------+ | Schema Name | public | | Owner | awsuser | | Creation Time | Fri, 17.06.2022 19:02:15 | | Model State | READY | | Training Job Status | MaxAutoMLJobRuntimeReached | | validation:accuracy | 0.991280 | | Estimated Cost | 7.897689 | | | | | TRAINING DATA: | | | Query | SELECT CUSTOMERID, COUNTRY, STOCKCODE, DESCRIPTION, INVOICEDATE, SALES_AMT, NBR_MONTHS_ACTIVE | | | FROM ECOMMERCE_SALES_TRAINING | | Target Column | NBR_MONTHS_ACTIVE | | | | | PARAMETERS: | | | Model Type | xgboost | | Problem Type | MulticlassClassification | | Objective | Accuracy | | AutoML Job Name | redshiftml-20220617190215268770 | | Function Name | predict_customer_activity | | Function Parameters | customerid country stockcode description invoicedate sales_amt | | Function Parameter Types | int8 varchar varchar varchar varchar float8 | | IAM Role | default-aws-iam-role | | S3 Bucket | amzn-s3-demo-bucket | | Max Runtime | 5400 | +--------------------------+-----------------------------------------------------------------------------------------------+
Etapa 3: Executar previsões com o modelo
A consulta a seguir mostra quais clientes se qualificam para seu programa de fidelidade do cliente. Se o modelo previr que o cliente ficará ativo por pelo menos sete meses, então ele selecionará o cliente para o programa de fidelidade.
SELECT customerid, predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) AS predicted_months_active FROM ecommerce_sales_prediction WHERE predicted_months_active >= 7 GROUP BY 1, 2 LIMIT 10;
Executar consultas de previsão nos dados de validação (opcional)
Execute as consultas de previsão a seguir nos dados de validação para ver o nível de precisão do modelo.
SELECT CAST(SUM(t1.match) AS decimal(7, 2)) AS predicted_matches, CAST(SUM(t1.nonmatch) AS decimal(7, 2)) AS predicted_non_matches, CAST(SUM(t1.match + t1.nonmatch) AS decimal(7, 2)) AS total_predictions, predicted_matches / total_predictions AS pct_accuracy FROM ( SELECT customerid, country, stockcode, description, invoicedate, sales_amt, nbr_months_active, predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) AS predicted_months_active, CASE WHEN nbr_months_active = predicted_months_active THEN 1 ELSE 0 END AS match, CASE WHEN nbr_months_active <> predicted_months_active THEN 1 ELSE 0 END AS nonmatch FROM ecommerce_sales_validation )t1;
Prever quantos clientes perderam a entrada (opcional)
A consulta a seguir compara o número de clientes que, segundo a previsão, ficarão ativos por apenas cinco ou seis meses. O modelo prevê que esses clientes perderão a oportunidade de serem incluídos no programa de fidelidade. A consulta então compara o número de clientes que quase conseguiram entrar no programa com o número previsto dos que estarão qualificados para o programa de fidelidade. Essa consulta pode ser usada para fundamentar uma decisão sobre se o limite do programa de fidelidade deve ou não ser reduzido. Você também pode determinar se há uma quantidade significativa de clientes que quase vão conseguir entrar no programa. Você pode então incentivar esses clientes a aumentar suas atividades para obter uma associação ao programa de fidelidade.
SELECT predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) AS predicted_months_active, COUNT(customerid) FROM ecommerce_sales_prediction WHERE predicted_months_active BETWEEN 5 AND 6 GROUP BY 1 ORDER BY 1 ASC LIMIT 10) UNION (SELECT NULL AS predicted_months_active, COUNT (customerid) FROM ecommerce_sales_prediction WHERE predict_customer_activity( customerid, country, stockcode, description, invoicedate, sales_amt ) >=7);
Tópicos relacionados
Para obter mais informações sobre o Amazon Redshift ML, consulte a seguinte documentação:
Para obter mais informações sobre machine learning, consulte a seguinte documentação:
-
What Is Fairness and Model Explainability for Machine Learning Predictions? (O que é equidade e explicabilidade de modelo para previsões de machine learning?)