AWS RedShift MLでSQLを使った機械学習をする
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になれた人からするととても手軽に感じるのではないでしょうか。
より機械学習を使うハードルがさがりそうです。