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