SageMaker Studio のAutopilot で赤ワインデータの品質分類を試してみた
はじめに
おはようございます、もきゅりんです。
皆さん、SageMaker 使ってますか?
そして、SageMaker と SageMaker Studio の違いを知ってますか?
はい、自分はよく知りませんでした!
ということで、 SageMaker Studio を使う機会があったため、調べながら使ってみました。
なお、表題のワインデータの結果だけが気になるだけの方は、目次から 結果 に飛んで頂ければと思います。
どこで利用できるのか?
現状は以下リージョンで利用できます。
- 米国東部 (オハイオ) us-east-2
- 米国東部 (バージニア北部) us-east-1
- 米国西部 (オレゴン北部) us-west-2
- 中国 (北京) cn-north-1
- 中国 (寧夏) cn-northwest-1
- 欧州 (アイルランド) eu-west-1
ので、今回はバージニア北部で対応します。
SageMaker と何が違うのか?
下記のように SageMaker のさまざまな機能が統合・強化されていること、そして注目されている機能の1つ、自動学習(Autopilot)があること です。
- ノートブックの利便性がさらに改善されている (Amazon SageMaker Studio Notebooks)
- モデルの学習を実験 (Experiments) という単位で整理 - 追跡 - 比較 - 評価できる
- 分類モデルと回帰モデルを自動で学習できる (Autopilot)
- 学習プロセスでのデバッグ機能がより便利になっている (Debugger)
- デプロイしたモデルの継続的なモニタリングが組み込まれている (Model Monitor)
弊社記事でも Autopilot を試してみた、はいくつかあります。
[Autopilotも便利すぎ!] Amazon SageMaker Studio 使ってみた – 機械学習 on AWS Advent Calendar 2019
Amazon SageMaker Studioを使って機械学習をやってみる
SageMaker Studio の取り組み方について
自分は以下のような進め方がスムーズかと思いました。
- ローカルなどの手軽な環境で何らかのモデルで学習と推定を行うプロセスを行う
- SageMaker を使って 1 を行ってみる
- 2 をSageMakerStudio で行ってみる
理由として、SageMaker をさらに便利に利用できる、というコンセプトが SageMakerStudio だと思いますので、いきなり3を使うと、戸惑いそうな気がします。
(自分は、SageMaker は何度か使っていましたが、ちょっと戸惑いました。)
そして、1 をAWSを使って効率的に実行できるというコンセプトが SageMaker だと思うので、まずは 1、そして 2 、という順で行うのが自然かと思います。
もちろん、特に理解や使い方に支障を感じない方は、どこからでも良いと思います!
今回やること
本題です。
Autopilot の使い方や概要はすでに挙げたブログでも行われています。
なので、このブログでは、自動学習とか言っているけど、結果はどうなんだ?と。
出力された推定は良い結果なのか?と。
それを、以前に組み込みモデルの XGBoost で対応した赤ワインの品質分類でやってみようじゃないかというのが主旨になります。
おワインの品質を AmazonSageMaker のXGBoostで予測してみた
結果
結果を述べると、特徴量エンジニアリングをまったくやらず、ぶっこんだ組み込みの XGBoost
モデルより若干良かったです。 *1
2度実験を行ってみて、正解率は 0.6460 と 0.659 でした。
テストデータに対して 両方とも 0.6792 でした。
同じデータの学習させた結果が結構異なっており、実験は自動で処理できるので、何回も行わせることで、うまく進むと非常に正解率の高いモデルをほぼ作業なしで出来る可能性があるかも、と思いました。
(何度かの結果から何らかの傾向を分析して、そこからは手動でハイパーパラメータを微調整するとか)
0.6460の結果のハイパーパラメータ
0.659の結果のハイパーパラメータ
やってみる
前提
- AWS CLIが使える状態
- 各必要なサービスを利用できる権限を持つこと
下記の順に進めていきます。
Autopilot を使った場合の SageMaker Studioの簡単な進め方
- Amazon S3 バケットを作成する
- ユーザーおよびIAMロールを作成する
- SageMaker Studio Notebooks を開く
- データをダウンロード、調査、および変換する
- Autopilot でモデルをトレーニングする
- モデルをデプロイする
- モデルを検証する
- Amazon SageMaker エンドポイントをインターネット向けアプリケーションに統合する
- クリーンアップ
とりあえずS3バケットを作成しておきます。
aws s3 mb s3://YOUR_BUCKET_NAME --region us-east-1
SageMaker Studio からノートブックを起動する
SageMaker Studio から遷移します。
先ほど作成したS3バケットの権限を付与したロールを作成します。
ノートブックを立ち上げる
File からでも Launcher からでも作成します。
そしたら簡単なコードを書いていきます。
データをロードして確認
import pandas as pd import seaborn as sns import numpy as np import urllib.request
urllib.request.urlretrieve("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", 'red_wine') df = pd.read_csv('./red_wine',sep=';',)
データ内容を簡単に確認します。
df.info()
SageMaker の形式に合わせて教師ラベルを1列目にします。
df = df[df.columns[::-1]]
訓練データ、テストデータ、検証データの分割します。
train_set, valid_set, test_set = np.split(df.sample(frac=1, random_state=42), [int(.7*len(df)), int(.85*len(df))])
データを csv形式にして保存します。
train_set.to_csv('train.csv', index=False, header=True, sep=',')
訓練データをS3バケットにアップロードします。
環境変数とロールを確認
%%time import os import boto3 from sagemaker import get_execution_role role = get_execution_role() region = boto3.Session().region_name bucket='YOUR_BUCKET_NAME' prefix = 'autopilot/redwine' bucket_path = 'https://s3-{}.amazonaws.com/{}'.format(region,bucket) data_partition_name = 'train' key = "{}/{}/data".format(prefix,data_partition_name)
データのアップロード
boto3.Session().resource('s3').Bucket(bucket).Object(key).upload_file(data_partition_name + '.csv')
Autopilot 実験を作成する
実験名を記入して、データをアップロードしたS3の情報を入力します。
今回は赤ワインの品質 quality
がターゲットです。
出力データは output
に実行するようにします。
解決したい問題 (1~10の品質) と目的の指標 (正解率) をそれぞれ入力して
最後に create Experiment
を押下します。
ここから、1時間以上かかりますので別の作業をしましょう。
エンドポイントを作成する
完了したらベストモデルから右クリックやボタンからエンドポイントを作成します。
実験タブ->実験名->右クリック->Describe AutoML Job -> Objective からも進めます。
今回は最小のスペックで良いです。
モニタリングも必要としませんのでそのままにしておきます。
単発推論してみる
先ほど作成したエンドポイントにテストデータを投げてみます。
1番目のデータなので、答えは 7
ですね。
runtime_client = boto3.client('runtime.sagemaker') endpoint_name = 'ENDPOINT_NAME' s = test_set.to_csv(header=False, index=False).split()[0] l = s.split(',') l.pop(0) # yフィールドのデータ削除 single_data = ','.join(l)
response = runtime_client.invoke_endpoint(EndpointName = endpoint_name, ContentType = 'text/csv', Body = single_data.encode()) result = response['Body'].read().decode('ascii') print('Predicted result is {}'.format(result))
正解率の算出
次はテストデータと推論データとの正解率を算出します。
テストデータから教師ラベルを削除して csv 形式で保存します。
test_data = test_set.drop('quality', axis=1) test_data.to_csv('test_data.csv', index=False, header=False, sep=',')
results = [] with open('test_data.csv', 'r') as f: for i in range(240): single_test = f.readline() response = runtime_client.invoke_endpoint(EndpointName = endpoint_name, ContentType = 'text/csv', Body = single_test) result = response['Body'].read().decode('ascii') results.append(result)
推論結果を書き込みます。
with open('test_wine_results', mode='w') as f: f.writelines(results)
# 正解ラベルのみ取得 np_test_set = test_set.values np_test_set y_test = np_test_set[:,0]
y_pred = np.loadtxt('./test_wine_results')
from sklearn.metrics import accuracy_score acc = accuracy_score(y_test, y_pred) acc
5. 後片付け
不用なインスタンスは削除しましょう。
(ノートブックからのエンドポイント削除の仕方がわからなかったので、コンソールから消しました。)
S3バケットも忘れずサヨナラしておきましょう。
aws s3 rb s3://YOUR_BUCKET_NAME --force --region us-east-1
最後に
自動学習は、すべてのデータで対応できるものではないのは当然ですし、そもそもビジネスで利用するためには、 モデル学習させるまでの方が、より道のりは長く、厳しいものだとは思いますが、 使い方をうまく選べば面白いことできそう、と個人的には感じました。
(ある程度、モデルのロジックやモデルの学習するプロセスの考え方を抑えたエンジニアがこれを使って、ある程度の推定結果を出力できるモデルのデプロイをする、あるいは、その結果内容、またはOption の GenerateCandidateDefinitionsOnly
を指定して、さらに熟練者がハイパーパラメータの調整、特徴量をうまく加工してあげるなどして推定をさらに改善する、みたいな二段構えとか。)
テーブルデータは扱いやすいので、ドシドシ Autopilot 試してみると楽しいと思います。(試してみたいです。)
今回は Autopilot を使ってみましたが、Autopilot を使わない SageMaker Studio の対応もしようと思っています。
以上です。
どなたかのお役に立てば幸いです。
参考:
脚注
- 比較しているモデルとランダムシードが異なること、SageMaker Studio では1000以上の学習データが必須のため、比較モデルが学習しているサイズ(959)とに差があるため、完全に同一データでの比較にはなっていないことに留意下さい。 ↩