チュートリアル: 複数クラス分類モデルの構築 - Amazon Redshift

チュートリアル: 複数クラス分類モデルの構築

このチュートリアルでは、Amazon Redshift ML を使用して、複数クラス分類の問題を解決する機械学習モデルを作成します。多クラス分類アルゴリズムは、データポイントを 3 つ以上のクラスのいずれかに分類します。次に、CREATE MODEL コマンドが生成する SQL 関数を使用してクエリを実装します。

CREATE MODEL コマンドを使用して、トレーニングデータのエクスポート、モデルのトレーニング、モデルのインポート、Amazon Redshift 予測関数の準備を行うことができます。トレーニングデータをテーブルまたは SELECT ステートメントとして指定するには、CREATE MODEL オペレーションを使用します。

このチュートリアルでは、パブリックデータセットの E-Commerce Sales Forecast を使用します。これには、英国のオンライン小売業者の販売データが含まれます。生成するモデルは、特別なカスタマーロイヤルティプログラムで最もアクティブなカスタマーをターゲットにします。多クラス分類では、このモデルを使用して、カスタマーが 13 か月間でアクティブになる月数を予測できます。予測機能は、プログラムへの加入期間が 7 か月以上続くと予測されるカスタマーを指定します。

ユースケースの例

Amazon Redshift ML では、製品ラインからベストセラー製品を予測するなど、その他の多クラス分類の問題を解決できます。また、リンゴ、ナシ、オレンジの選択など、画像に含まれる果物を予測することもできます。

タスク

  • 前提条件

  • ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする

  • ステップ 2: 機械学習モデルを作成する

  • ステップ 3: モデルを使用して予測を実行する

前提条件

このチュートリアルを完了するには、Amazon Redshift ML の「管理の設定」を完了している必要があります。

ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする

Amazon Redshift クエリエディタv2 を使用する次のクエリを実行します。これらのクエリは、サンプルデータを Amazon Redshift にロードします。

  1. 次のクエリでは、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) );
  2. 次のクエリは、サンプルデータを E-Commerce Sales Forecast データセットから 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;

データを分割する

Amazon Redshift ML でモデルを作成すると、SageMaker はデータをトレーニングセットとテストセットに自動的に分割し、SageMaker がモデルの精度を判断できるようにします。このステップでデータを手動で分割することにより、追加の予測セットを割り当てることでモデルの精度を検証できます。

次の SQL ステートメントを使用して、データをトレーニング、検証、および予測の 3 つのセットに分割します。

--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);

ステップ 2: 機械学習モデルを作成する

このステップでは、CREATE MODEL ステートメントを使用して、多クラス分類を使用して機械学習モデルを作成します。

次のクエリは、CREATE MODEL オペレーションを使用して、トレーニングセットを含む多クラス分類モデルを作成します。DOC-EXAMPLE-BUCKET を 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 '<DOC-EXAMPLE-BUCKET>', S3_GARBAGE_COLLECT OFF );

このクエリでは、問題タイプを Multiclass_Classification に指定します。モデルについて予測するターゲットは nbr_months_active です。SageMaker がモデルのトレーニングを終了すると、predict_customer_activity 関数が作成されます。これは、Amazon Redshift で予測を行うために使用します。

モデルトレーニングのステータスを表示する (オプション)

SHOW MODEL コマンドを使用して、モデルの準備が完了したことを知ることができます。

次のクエリを使用して、モデルの状態や精度など、モデルのさまざまなメトリクスを返します。

SHOW MODEL ecommerce_customer_activity;

モデルの準備が整うと、前のオペレーションの出力は Model StateReady であることが表示されます。次は 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 | DOC-EXAMPLE-BUCKET | | Max Runtime | 5400 | +--------------------------+-----------------------------------------------------------------------------------------------+

ステップ 3: モデルを使用して予測を実行する

次のクエリは、どのカスタマーがカスタマーロイヤルティプログラムの対象となるかを示します。モデルは、カスタマーが少なくとも 7 か月間アクティブになると予測する場合、ロイヤルティプログラムにそのカスタマーを選択します。

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;

検証データに対して予測クエリを実行する (オプション)

検証データに対して次の予測クエリを実行して、モデルの精度レベルを確認します。

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;

エントリを逃した顧客の数を予測する(オプション)

次のクエリは、5 か月または 6 か月間のみアクティブであると予測されるカスタマーの数を比較します。このモデルは、これらのカスタマーがロイヤルティプログラムに選ばれないと予測しています。次に、クエリは、プログラムをわずかな差で逃す数と、ロイヤルティプログラムの対象となると予測される数を比較します。このクエリは、ロイヤルティプログラムのしきい値を下げるかどうかの決定を通知するために使用できます。また、プログラムをわずかな差で逃すカスタマーの数が多数存在するかどうかについても判断できます。これにより、これらのカスタマーに対して、ロイヤルティプログラムのメンバーシップを取得するための活動を増やすように促すことができます。

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);

Amazon Redshift ML の詳細については、次のドキュメントを参照してください。

機械学習の詳細については、以下のドキュメントを参照してください。