AWS RedShift MLでSQLを使った機械学習をする

2021.06.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Introduction

ここですでに言及されてますが、
RedshiftでSQL使って機械学習モデル作成から予測まで可能なAmazon Redshift ML が一般公開されました。
概要はこのあたりでも解説してますので、
本稿ではこのAWS blogでいっているサンプルを実際に動かしてみます。

Try

ではRedshift MLをつかった機械学習モデルの作成と予測をやってみます。
ここでもやっているように、direct marketing dataset
を使います。
このデータは銀行のダイレクトマーケティングキャンペーンに関連するデータで、
「顧客が定期預金の申し込みしたか」の結果予測を目的としてモデルを作成します。

Prepare

Redshift Cluster作成時にIAMを指定するので、まずはIAMロールを作成します。
Redshift MLでは裏側でSagemakerを使っているとのことで、
Redshift権限、Sagemaker権限、データをS3からLOADするのでS3権限を付与したロールを作成しました。

あとは、IAM 信頼ポリシーで下記のように、

  • sagemaker.amazonaws.com
  • redshift.amazonaws.com

を許可します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "sagemaker.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },

    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "redshift.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Create Redshift Cluster

ロールを作成したらRedshiftクラスターを作成します。
名前やデータベース名、ユーザー名などを指定しましょう。

クラスターのアクセス許可で、さきほど作成したIAMのarnを指定します。

Set Example Dataset

データセットを用意します。
ここからdirect marketing dataset を取得しましょう。

S3 bucketを作成し、そこにbank-additional-full.csvをアップロードします。
このbucketはRedshiftからデータをアンロードし、トレーニング結果を保存するために使用します。

Redshiftのクエリエディタで下記SQLを実行し、
データロード用のテーブルを作成します。

CREATE TABLE direct_marketing (
    age DECIMAL NOT NULL,
    job VARCHAR NOT NULL,
    marital VARCHAR NOT NULL,
    education VARCHAR NOT NULL,
    credit_default VARCHAR NOT NULL,
    housing VARCHAR NOT NULL,
    loan VARCHAR NOT NULL,
    contact VARCHAR NOT NULL,
    month VARCHAR NOT NULL,
    day_of_week VARCHAR NOT NULL,
    duration DECIMAL NOT NULL,
    campaign DECIMAL NOT NULL,
    pdays DECIMAL NOT NULL,
    previous DECIMAL NOT NULL,
    poutcome VARCHAR NOT NULL,
    emp_var_rate DECIMAL NOT NULL,
    cons_price_idx DECIMAL NOT NULL,
    cons_conf_idx DECIMAL NOT NULL,
    euribor3m DECIMAL NOT NULL,
    nr_employed DECIMAL NOT NULL,
    y BOOLEAN NOT NULL
);

COPYでデータをテーブルにロードします。さきほど作成したIAMロールを使います。

COPY direct_marketing 
FROM 's3://<データセットをアップロードしたbucket>/bank-additional-full.csv' 
DELIMITER ',' IGNOREHEADER 1
IAM_ROLE '<さきほど作成したIAMロールのarn>'
REGION '<your region>';

そしてモデルを作成。
※実行するとけっこう時間がかかる

CREATE MODEL direct_marketing
FROM direct_marketing
TARGET y
FUNCTION predict_direct_marketing
IAM_ROLE '<さきほど作成したIAMロールのarn>'
SETTINGS (
  S3_BUCKET '<データセットをアップロードしたbucket>'
);

各パラメータはAWS blogを参照。
実行がおわったら下記コマンドでモデル状態の確認をしましょう。

SHOW MODEL direct_marketing

Model StateがREADYなら準備完了です。

Predict via SQL

モデルが準備できたので、SQLによる予測を実行します。
トレーニングに使用したものと同じデータにモデルを適用したときの、
真陽性・真陰性・偽陽性・偽陰性の数をcountしてみます。

SELECT predict_direct_marketing, y, COUNT(*)
  FROM (SELECT predict_direct_marketing(
                   age, job, marital, education, credit_default, housing,
                   loan, contact, month, day_of_week, duration, campaign,
                   pdays, previous, poutcome, emp_var_rate, cons_price_idx,
                   cons_conf_idx, euribor3m, nr_employed), y
          FROM direct_marketing)
 GROUP BY predict_direct_marketing, y;

結果が表示されました。
これで再現率や適合率、F1値なども簡単に出せますね。

Summary

今回はここにある解説をそのままやってみました。
学習データを用意してSQLをいくつか実行するだけでモデル作成、
トレーニングからデプロイ、予測まで実行できたので、
SQLになれた人からするととても手軽に感じるのではないでしょうか。
より機械学習を使うハードルがさがりそうです。

References