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

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

Clock Icon2021.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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.