[Amazon SageMaker Data Wrangler] 機械学習用データを簡単で最速に準備できる機能を使ってみた

2020.12.22

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

はじめに

おはようございます、もきゅりんです。

Introducing Amazon SageMaker Data Wrangler – The fastest and easiest way to prepare data for machine learning

本稿では、AWS re:Invent 2020 で発表された Amazon SageMaker Data Wrangler(以下、Data Wrangler)の Demo: Data Wrangler Titanic Dataset Walkthrough を行います。

よく知られているように、機械学習を実行するには、データ準備で一番時間がかかります。データのクレンジングから探索、補完、修正、結合、変換、増分など、データの準備が推論結果に直結するため、対応しなければならない作業は数多くあります。

Data Wrangler は、Amazon S3、Amazon Athena、Amazon Redshift、AWS LakeFormation、Amazon SageMaker FeatureStore などの複数のデータソースから選択して、コードを記述しなくても組み込みのデータ変換を利用して、上記のような機械学習を行うためのデータ準備をすばやく対応できる機能です。

下記に弊社速報ブログがあります。

【速報】データを上手に飼いならせ!SageMaker Data Wranglerが登場! #reinvent | Developers.IO

やること

  1. Data Wrangler Data Flow を作成する
  2. タイタニックのデータセットをS3にアップロード
  3. Data Wrangler 分析を使用してデータセットを分析する
  4. Data Wrangler データ変換を使用してデータフローを定義
  5. Data Wrangler ジョブの作成に使用できるJupyterNotebookにフローをエクスポート
  6. データを処理し、SageMakerトレーニングジョブを開始して XGBoost BinaryClassifier をトレーニングする

前提条件

  • SageMaker Studioにオンボードしていること

SageMaker Studioの開始方法はOnboard to Amazon SageMaker Studio - Amazon SageMaker を参照下さい。(手っ取り早く進めたい場合は、クイックスタートを使用します。)

1. Data Wrangler Data Flow を作成する

SageMaker Studio を開き New data flow を作成します。

.flow の名前を変更しておきます。

インスタンス(m5.4xlarge)が起動しているので、下記メッセージが消えるまで待ちます。

Connecting to engine
Establishing connection to engine...

初めて起動するときに約5分かかる場合があるようです。

準備ができました。

2. タイタニックのデータセットをS3にアップロード

Titanic dataset をDLしてS3バケットにアップロードします。ファイルの種類は、CSVです。

AmazonS3に正常にアップロードしたら、Data Wrangler にインポートします。データセットの最初の行がヘッダーであることを指定するには、[ヘッダーをテーブルに追加]を選択します。

3. Data Wrangler 分析を使用してデータセットを分析する

準備タブから分析を追加します。

データのサマリーを表示します。よく pandasdescribe とかで表示させるやつですね。

テーブル名を設定し、previewを押下してsaveします。

4. Data Wrangler データ変換を使用してデータフローを定義

準備に戻り、特徴量となるデータを整形していきます。

まず、トレーニングに使用したくない列を削除します。 pandas を使うことも、GUIから対応することもできます。

pandas の場合は、Custom Transform からPython (Pandas) をドロップリストから選択して下記を入力します。

cols = ['name', 'ticket', 'cabin', 'sibsp', 'parch', 'home.dest','boat', 'body']
df = df.drop(cols, axis=1)

こちらは GUI で対応しています。

値が欠落している行を削除

One-Hot encoding

Custom Transform からPython (Pandas) をドロップリストから選択して下記を入力します。

import pandas as pd

dummies = []
cols = ['pclass','sex','embarked']
for col in cols:
    dummies.append(pd.get_dummies(df[col]))
    
encoded = pd.concat(dummies, axis=1)

df = pd.concat((df, encoded),axis=1)

学習に使うデータを抽出

Custom Transform から SQL (PySpark SQL) をドロップリストから選択して下記を入力します。

SELECT survived, age, fare, 1, 2, 3, female, male, C, Q, S FROM df;

5. Data Wrangler ジョブの作成に使用できるJupyterNotebookにフローをエクスポート

データフローの作成が終了したら、いくつかのエクスポートオプションがありますが、データラングラージョブノートブックにエクスポートします。

Export タブから最後のステップを選択して Export step から Data Wrangler Job を選択します。

kernelが起動したら、Start ProcessingJob セクションまで実行します。

CloudWatch Logs (/aws/sagemaker/ProcessingJobs) でも進捗状況を確認することができます。

6. データを処理し、SageMakerトレーニングジョブを開始して XGBoost BinaryClassifier をトレーニングする

同じノートブックで、データをプルし、最小限のデータ準備したデータを使用して XGBoost Classifier をトレーニングします。

!pip install --upgrade awscli awswrangler boto sklearn xgboost
!aws s3 rm {output_path} --recursive  --exclude "*" --include "*_SUCCESS*"

AmazonS3からS3プレフィックス内のすべてのCSVファイルを再帰的に読み取ります。データを特徴量 (X) とラベル (y) に分割します。

import awswrangler as wr
import pandas as pd


df = wr.s3.read_csv(path=output_path, dataset=True)
X, y = df.iloc[:,:-1],df.iloc[:,-1]

ハイパーパラメータを設定してクロスバリデーションを行います。

import xgboost as xgb

dmatrix = xgb.DMatrix(data=X, label=y)

params = {"objective":"binary:logistic",'learning_rate': 0.1, 'max_depth': 5, 'alpha': 10}

xgb.cv(
    dtrain=dmatrix, 
    params=params, 
    nfold=3,
    num_boost_round=50,
    early_stopping_rounds=10,
    metrics="rmse", 
    as_pandas=True, 
    seed=123)

何か判りにくいので、図を描いてみました。

from matplotlib import pyplot as plt
history = xgb.cv(
    dtrain=dmatrix,
    params=params,
    nfold=3,
    num_boost_round=50,
    early_stopping_rounds=10,
    metrics="rmse",
    as_pandas=True,
    seed=123)

train_metric = history['train-rmse-mean']
plt.plot(train_metric, label='train-rmse-mean')
metric = history['test-rmse-mean']
plt.plot(metric, label='test-rmse-mean')
plt.grid()
plt.legend()
plt.xlabel('rounds')
plt.ylabel('rmse-mean')
plt.show()

さいごに

とりあえずデモで紹介されていたタイタニックデータをやってみました。

データ準備において、各ステップを別々に管理、可視化ができるのが素敵です。

1つのデータソースからよりも、S3のデータレイクを軸とした、複数のさまざまな AWSのデータソースからデータを結合したりすることで、さらなるビジネス価値を SageMaker Data Wrangler から生み出せそうだと感じました。

そして、非データサイエンティスト、非データエンジニアがGUI操作で簡単に特徴量エンジニアリングができるようになる期待を感じさせるサービスです。

[Amazon SageMaker JumpStart] RasNet50でファインチューニングしてみました | Developers.IO もそうですが、どんどん機械学習は身近になってきていますね。

数年後には、営業マンがExcelで関数を触って分析するように、機械学習モデルを選択して分析をする世の中かもしれません。

以上です。

どなたかのお役に立てば幸いです。