VantageのデータをAWS SageMakerでの機械学習に使用してみた

とても多くのお客様がVantageとAWSのサービスとの統合に関心を持っています。そのようなトピックからここではSageMakerとVantageの統合について説明します。

このガイドで説明するアプローチはSagemakerと統合するための多くの可能性のあるアプローチの一つであり、そのままの形で提供されるものです。 このアプローチは社内で実装されテストされていますが、TeradataまたはAWSのいずれからも、このアプローチに関する正式なサポートはありませんのでご注意ください。

とはいえ、何がうまくいったのか、何がうまくいかなかったのか、どうしたら改善できるのか、などなど、皆さんのフィードバックはとても望ましく、ありがたく思います。

ご意見・ご感想は、コメントとしてお寄せください。

免責事項：本ガイドは、AWSとTeradata製品の両方のドキュメントからの内容を含んでいます。

# 概要

Amazon SageMakerは、フルマネージドなMachine Learning Platformを提供します。

SageMakerとTeradataのユースケースは2つあります。

1.	データはTeradata上に存在し、SageMakerはモデルの定義とその後のスコアリングの両方に使用されるケース。このユースケースでは、TeradataはS3環境にデータを提供しSageMakerがモデル開発のためにトレーニングおよびテストデータセットを利用できるようにします。TeradataはさらにSageMakerによるその後のスコアリングのためにS3経由でデータを利用できるようにします。このケースではTeradataはデータリポジトリのみとして機能します。

2.	データはTeradata上に存在しSageMakerはモデル定義に使用され、Teradataはその後のスコアリングに使用されます。このユースケースではTeradataはS3環境にデータを提供しSageMakerがモデル開発のためにトレーニングおよびテストデータセットを消費できるようにします。TeradataはSageMakerのモデルをTeradataのテーブルにインポートしてTeradata Advanced SQLエンジンまたはMLエンジンによるスコアリングを行ことができます。このケースではTeradataはデータリポジトリおよびスコアリングエンジンとして機能します。

この記事では、ユースケース1について説明します。

SageMakerはS3バケットからトレーニングデータとテストデータを取得し利用します。この記事ではTeradataの分析データセットをS3バケットにロードする方法について説明します。このデータをSageMakerで利用することで機械学習モデルを構築・訓練し、本番環境に導入することができます。

前提条件 ：
・S3 バケットにアクセスできる IAM 権限とSageMaker サービスを利用できる権限
・学習データを保存するためのS3バケット

この記事では、既存の SageMaker オンラインサンプルを活用して、Teradata Vantage システムのデータを使用した機械学習モデルを構築、訓練、展開します。この例では、**[銀行マーケティングデータセット](https://archive.ics.uci.edu/ml/datasets/bank+marketing)** を使用して、顧客がCD口座に登録するかどうかを予測します。このサンプルのPythonコードと説明は、**[こちら](https://aws.amazon.com/getting-started/tutorials/build-train-deploy-machine-learning-model-sagemaker/)** にあります。


# はじめに

### データのロード

SageMakerはS3バケットからデータを学習させます。Teradata VantageからS3バケットに学習データをロードする手順は以下のとおりです。

・Amazon SageMakerのコンソールにアクセスし、Notebook Instanceを作成します。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/31e3f970-f185-173c-ebf3-b781b6ea33d7.png)

ノートブックインスタンスの作成方法は、**[こちら](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-setup-working-env.html)** をご覧ください。

・ノートブックインスタンスを開く

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/0909ffb0-3fa6-612d-f02c-b2731a641629.png)

・ 新規作成→conda_python3 で新規ファイルを起動します。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1f8b0af1-bb7c-90b7-b3ff-af128ac35422.png)

・Teradata Pythonライブラリを"!pip install teradataml "でインストールする。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/eb7b3925-75dc-00dc-ec5f-f6d214783eb4.png)

・teradatamlをはじめとする以下のライブラリのインポート
```python:import_library.py
import teradataml as tdml
from teradataml import create_context, get_context, remove_context
from teradataml.dataframe.dataframe import DataFrame
import pandas as pd
import boto3, os
```

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1709212e-2058-2d88-4b01-45ad7b776cee.png)

・Vantageに接続します。
```python:connect2Vantage.py
create_context(host = ‘<hostname>’, username = ‘<database user name>’, password = '<database password>')
```

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1cbee258-06f7-92a6-37e2-312623279295.png)

・学習用データセットが存在するテーブルからTeradata Python DataFrameモジュールを使ってデータを取得する。 例：tmdl.DataFrame(‘train’)

![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/c20110e8-273c-2bf5-a64c-6214df3ab06e.png)

・Teradata DataFrameからPanda DataFrameに変換する。

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/438b688d-269a-db18-2cca-faa8189a8b54.png)

・ローカルファイルへのデータ書き込み

![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/38717fec-75e0-c40b-53c0-4da57de2469a.png)

・S3バケットに変数を割り当てる

![画像10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/1eeb8904-def0-989c-d51d-f74b15bfcbc2.png)

・S3へファイルをアップロードします。

![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/0a3d9943-06e9-689b-fcd1-3fa39fb3cc70.png)

### モデルのトレーニング

・トレーニングジョブを作成する

・左メニューの "トレーニング "から "トレーニングジョブ "を選択し、"トレーニングジョブを作成 "をクリックする。

![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b5c4e2a2-77b9-d4f4-1882-12af59948eb3.png)

・トレーニングジョブの作成」画面で「ジョブ名」（例：xgboost-bank）、IAMロールに「新しいロールの作成」を記入します。S3バケットに "Any S3 bucket "を選択し、"Create role "を選択します。

![画像13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/2b6a6835-022c-293a-d50e-8a0635bcae8e.png)

・トレーニングジョブの作成」画面に戻りアルゴリズムとして「XGBoost」を使用します。

![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/3cb825c0-13d7-b4c4-c83f-6277b8600a76.png)

・インスタンスタイプはデフォルトのml.m4.xlarge、追加ストレージボリュームは1インスタンスあたり30GBを使用します。これは短いトレーニングジョブで、10分以上はかからないはずです。

![画像15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/8166271c-f395-717e-15da-d9b2a0d05ad6.png)

・以下のハイパーパラメータを入力し、それ以外はデフォルトのままにしてください：
num_round=100
silent=0
eta=0.2
gamma=4
max_depth=5
min_child_weight=6
subsample=0.8
objective='binary:logistic'

![画像16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/92b76628-1f07-a629-6f2a-da4af7e03853.png)

![画像17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/acf8cb0a-02d3-a3c7-d708-699f10cb1444.png)

・Input data configuration "には学習データを保存したs3バケットを入力します。入力モードは「File」です。コンテンツタイプは "csv "です。"S3 location "は、ファイルのアップロード先となります。

![画像18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/04b2c0fa-b752-2823-90e5-46ed8f137628.png)

・Output data configuration "に出力データを保存するパスを入力します。

![画像19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/8f8b3af3-34e1-34aa-6cb5-0b5356e5cab3.png)

他はデフォルトのまま"Create training job" をクリックします。
トレーニングジョブの設定方法の詳細は、**[こちらのAWSのサイト](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-algo-train.html#sagemaker-mkt-algo-train-console)** に記載されています。

トレーニングジョブが作成されると、SageMakerはMLインスタンスを起動してモデルをトレーニングし、その結果のモデル成果物やその他の出力を「出力データ構成」パス/<トレーニングジョブ名>/outputにデフォルトで格納します。

### モデルのデプロイ

モデルを学習させた後永続的なエンドポイントを使用してデプロイします。

・モデルの作成

・左側のパネルから「推論」の「モデル」を選択し「モデルの作成」を選択します。モデル名（例：xgboost-bank）を記入し前のステップで作成したIAMロールを選択します。

・コンテナ定義では、「推論コードイメージの位置」に "433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest "を利用します。「モデル成果物の場所」は学習ジョブの出力パスです。

![画像20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/6bb0d1da-f149-ec21-2d85-a60fb726ac02.png)

他はデフォルトのまま「モデルを作成」します。

・作成とエンドポイント設定
- 先ほど作成したモデルを選択し「エンドポイント設定の作成」をクリックします。

![画像21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/3106fd38-027e-0a9c-d363-0dc0024f1193.png)

- 名前（例：xgboost-bank）を記入しその他はデフォルトを使用します。モデル名とトレーニング・ジョブは自動的に入力されるはずです。「エンドポイント構成の作成」をクリックします。

・エンドポイント作成

- 左のパネルから 「推論」 -> 「モデル」 を選択し再度モデルを選択して今度は「エンドポイント構成の作成」をクリックします。

![画像22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/abef6ea2-595f-7f2e-f865-451b2f6be099.png)

- エンドポイント名（例：xgboost-bank）を入力し「既存のエンドポイント構成を利用する」を記入します。

![画像23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/4436ebce-de34-9133-f317-788f89653c2f.png)

- 前回の手順で作成したエンドポイント構成を選択し「エンドポイント構成の選択」をクリックします。

![画像24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/55c47c86-e907-7230-bfa4-f7bb3a2988a4.png)

他のすべてをデフォルトのままにして「エンドポイントの作成」をクリックします。
これでモデルがエンドポイントにデプロイされ、クライアントアプリケーションから利用できるようになります。

# おわりに
このようにVantageのデータを簡単にAmazon SageMakerでのモデル開発に利用することが可能です。ぜひご活用ください！

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)