前回は、Amazon SageMakerのチュートリアルをベースにして、学習/推論に利用するデータの準備を行う手順を説明しました。今回は、前回準備したデータを使って下表の「ステップ 4: データからのモデルのトレーニング」にあたる機械学習モデルの構築を行っていきます。

工程 ステップ 枝番 実施内容 連載回
開発 1 Amazon SageMakerコンソールにログインする 第5回
2 Amazon SageMakernotebook instance を作成する 第5回
3 データの準備 第6回
3a, 3b ノートブックを起動する
3c ノートブックの利用準備をする
3d S3 バケットを作成する
3e 学習・推論に利用するデータをダウンロードする
3f データを分割する
学習 4 データからのモデルのトレーニング 第7回
4a 学習データを S3 バケットにアップロードする
4b 学習の設定をする
4c 学習を行う
推論 5 モデルのデプロイ 第8回
5a 推論エンドポイントを作成して、モデルをデプロイする
5b 推論を行う
6 モデルの性能評価 第8回
後片付け 7 リソースを終了する 第8回

ステップ 4:データからのモデルのトレーニング

機械学習用のコードの開発には、Amazon SageMakerに用意されている組み込みアルゴリズムXGBoost」を利用します。

概要図

「学習用のコードを開発する」と言っても、利用者は機械学習アルゴリズムを実装する必要はありません。組み込みアルゴリズムとして提供されている機械学習アルゴリズムは、コンテナイメージとしてあらかじめ「Amazon ECR」のレジストリに準備されているので、利用したい機械学習アルゴリズムのコンテナイメージをダウンロードしてコンテナを起動し、学習データを渡すだけで利用することができます。

ステップ 4a:学習データをS3バケットにアップロードする

XGBoostを利用するための準備として、学習用データの加工とS3バケットへのアップロードを行います。下記のコードをノートブックのセルにコピー&ペーストして実行してください。

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

では、上記のコードについて順に説明していきましょう。見やすくするために一部分ずつピックアップし、改行して表記します。

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1)
    .to_csv('train.csv', index=False, header=False)

ここでは、「train_data(DataFrame)」に読み込んだ学習データを加工して、CSV形式のファイルに出力しています。組み込みアルゴリズムのXGBoostは、学習データを表形式のファイルのかたちで与える必要があり、さらに学習データの1列目を「目的変数」に、2列目以降を「説明変数(特徴量)」にしなければなりません。

今回の場合、目的変数は「キャンペーンの結果、顧客が定期預金を申し込んだか否か」、説明変数は年齢や職業などの「顧客の属性情報」となります。加工前の状態では、目的変数の列が一番後ろに存在することに加えて、「y_yes(申し込んだ)」だけでなく、「y_no(申し込まなかった)」も存在します。

そこで、コードではPandasのconcat関数を使って、「y_yes」を切り出して1列目に、後方に存在する「y_yes」「y_no」を削除(drop)した表を結合して新たな表を作成しています。

下図の上段の表が加工前、下段の表が加工後の学習データです。

加工前/加工後

XGBoostは、学習データのファイル形式としてCSV形式、もしくはlibsvm形式をサポートしています。ここではPandasのto_csvメソッドを使って「DataFrame」に格納されているデータをCSV形式に変換しています。なお、CSVの行名(index)と列名(header)は不要なので、共に「False」を設定してデータのみを出力しています。

次の処理を見てみましょう。

boto3
    .Session()
    .resource('s3')
    .Bucket(bucket_name)
    .Object(
        os
            .path
            .join(
                prefix,
                'train/train.csv'
            )
    )
    .upload_file('train.csv')

要するに、ここでやりたいのは「学習データをS3バケットにアップロードする」ことです。Sessionクラスは、AWSのリソースを操作するために環境変数やプロファイルから認証情報を取得して設定します。その後の処理はメソッド名から推測できると思いますが、resourceメソッドでS3を設定し、S3バケット名とオブジェクト名を指定して、学習データをS3バケットにアップロードしています。

続く処理では、Amazon SageMaker SDK for Pythonのs3_inputクラスのオプジェクトを生成しています。

s3_input_train = sagemaker.s3_input(
    s3_data='s3://{}/{}/train'.format(bucket_name, prefix),
    content_type='csv'
)

その名の通り、入力となる学習データが格納されたS3バケットと学習データのファイル形式(CSV)を設定しています。なお、実行時に下記の警告が表示されますが、このチュートリアルでは無視して問題ありません。

's3_input' class will be renamed to 'TrainingInput' in SageMaker Python SDK v2.

これは、近々予定されるAmazon SDK for Pythonのメジャーバージョンアップで、s3_inputメソッドの名称が変わることを通知するものです。以降の手順でも同様の警告が表示されることがありますが、このチュートリアルでは同様に無視して問題ありません。本格的な開発に着手する場合は、どちらのメジャーバージョンを採用するかを検討してください。

ステップ 4b:学習の設定をする

ここまでで、学習データのアップロードが完了しました。学習の実施前の最後の作業として、「Estimator」と呼ばれるAmazon SageMakerの学習の設定を行います。下記のコードをセルにコピー&ペーストして実行してください。

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)

上記のコードのうち、以下の部分ではAmazon SageMaker API、およびそのほかに必要なAWSサービスとのやり取りを管理するためのSessionオブジェクトを作成しています。

sess = sagemaker.Session()

続く以下の部分では、Amazon SageMaker SDK for PythonのEstimatorクラスのオプジェクトを生成し、パラメータ(引数)で学習の設定を行っています。

xgb = sagemaker.estimator.Estimator(
  containers[my_region],
  role,
  train_instance_count=1,
  train_instance_type='ml.m4.xlarge',
  output_path='s3://{}/{}/output'.format(bucket_name, prefix),
  sagemaker_session=sess
)

パラメータに設定する項目の意味を下記の表にまとめました。

パラメータ(引数) パラメータの意味
containers

学習に利用するコンテナイメージの URI を指定する。

ここでは、XGBoost リリース 0.72のコンテナイメージのURIを指定している。ステップ 3cで設定した値のうち、「バージニア北部 (us-east-1)」が選択される
role

Amazon SageMakerにアタッチするIAMロールの名前もしくはARNを指定する。

ステップ 2で作成したIAM ロール(AmazonSageMakerFullAccessポリシーが設定されたもの)をステップ 3cで取得したものが設定される
train_instance_count

学習用インスタンス数を設定する。

2以上を設定することで複数インスタンスでの分散学習の実行が可能となる。ただし、独自アルゴリズムを利用する場合は分散学習に対応したコードを開発する必要がある
train_instance_type

学習用インスタンスのインスタンスタイプを設定する。

MLインスタンスとしてさまざまなタイプが用意されており、学習の特性に応じたものを選択する。ここでは、汎用(M4)の「xlarge」を設定している。そのほかに利用できるインスタンスタイプと料金は「Amazon SageMaker ML インスタンスタイプ」および「Amazon SageMaker の料金」を参照してください
output_path

学習におけるアウトプット(モデルアーティファクトと出力ファイル)の出力先となるS3バケットを指定する。

ステップ 3dで作成し、ステップ 4aで学習データをアップロードしたS3バケットと同一のバケットを出力先に設定している
sagemaker_session

Session オブジェクトを設定する。

直前に作成したセッションオブジェクトを設定している

次に、以下の部分ではXGBoostの「ハイパーパラメータ」を設定しています。

xgb.set_hyperparameters(
  max_depth=5,
  eta=0.2,
  gamma=4,
  min_child_weight=6,
  subsample=0.8,
  silent=0,
  objective='binary:logistic',
  num_round=100
)

ハイパーパラメータとは機械学習アルゴリズムの設定に相当するものであり、その値は機械学習モデルの精度に直結します。Amazon SageMakerにはハイパーパラメータを自動チューニングする機能がありますが、ここでは固定値として上記の値を設定しています。

XGBoostで設定できるハイパーパラメータとそれぞれの意味は、公式サイトの「XGBoost リリース 0.72 のハイパーパラメータ」に一覧でまとめられています。ここでは説明を割愛しますが、詳しく知りたい方はそちらを参照してください。

ステップ 4c:学習を行う

では、いよいよ実際に学習を行います。下記のコードをセルにコピー&ペーストして実行してください。

xgb.fit({'train': s3_input_train})

なお、学習が開始されると下記のような実行ログが出力されます。1画面に収まらない量が出力されますが、ただの実行ログなので問題ありません。

実行ログ

学習が完了すると、完了を示すメッセージが出力されます。このチュートリアルはデータ量が少ないため、数分で完了します。

完了メッセージ

Amazon SageMakerにおける学習の実行は、fitメソッドに学習データが格納されているS3バケットの所在を渡すだけで実行できます。fitメソッドを実行すると、学習ジョブが起動してXGBoostによる機械学習モデルが構築されます。学習の完了時に機械学習モデルのS3バケットへのアップロード、学習用インスタンスの削除が自動で行われます。

ノートブックに表示される実行ログを簡単に見てみましょう。Amazon SageMakerが背後で行っている処理を確認することができます。

実行ログ 処理内容
2020-07-11 11:34:39 Starting - Starting the training job… 学習ジョブの開始
2020-07-11 11:34:42 Starting - Launching requested ML instances…… 学習用インスタンスの起動開始
2020-07-11 11:35:57 Starting - Preparing the instances for training…… 学習を開始するためのインスタンスの準備開始
2020-07-11 11:36:53 Downloading - Downloading input data S3バケットから学習データをダウンロード中
2020-07-11 11:37:39 Training - Downloading the training image… トレーニングに利用するXGBoostのDockerコンテナイメージのダウンロード中
2020-07-11 11:37:39 Uploading - Uploading generated training model 学習が完了し、アーティファクトをS3バケットにアップロード中
Arguments: train 学習の実行を示すメッセージ
[2020-07-11:11:37:34:INFO] Running standalone xgboost training. XGBoost による学習の実行ログ
(中略)
2020-07-11 11:37:46 Completed - Training job completed 学習ジョブの完了
Training seconds: 53 トレーニングに要した時間 (秒)
Billable seconds: 53 課金される時間 (秒)

Amazon SageMakerは従量課金性ですが、今回のトレーニングでは53秒分の課金がされることがわかります。

なお、学習ジョブのステータスの移行履歴はAmazon SageMakerのコンソール、学習の詳細な実行ログはCloudWatch Logsにて確認することができます。ノートブックインスタンスが停止状態にある場合やセルを再実行して履歴が消えてしまった場合は、こちらで確認してください。

学習ジョブのステータスの移行履歴を確認する方法を下記に示します。まず、左側の折りたたみメニューの「トレーニング」をクリックして開き、「トレーニングジョブ」をクリックします。

「トレーニングジョブ」をクリック

学習ジョブの詳細ページに移動します。このページでは、学習ジョブに関するさまざまな情報を確認することができます。次に、「ジョブ設定」の「ステータス」に「履歴の表示」があるので、これをクリックします。

「履歴の表示」をクリック

開かれる「ステータス履歴」画面で、学習ジョブのステータスの移行履歴を確認することができます。

「ステータス履歴」画面

続いて、学習の詳細な実行ログを確認する方法を見ていきましょう。

学習ジョブの詳細ページで下にスクロールすると「モニタリング」という項目があります。ここにある「ログを表示」をクリックします。

「ログを表示」をクリック

すると、CloudWatch Logsのロググループの画面に移動し、学習の詳細な実行ログが記録されているログストリームが表示されます。ここで、ログストリームをクリックします。

ログストリームをクリック

学習の詳細な実行ログが表示されます。

実行ログ

* * *

今回は、Amazon SageMakerのチュートリアルをベースに、学習を行い、機械学習モデルの構築までを実施しました。次回は、推論と簡単な結果の考察を行います。

著者紹介


菊地 貴彰 (KIKUCHI Takaaki) - 株式会社NTTデータ
システム技術本部 デジタル技術部
Agile プロフェッショナル担当

大学・大学院では、機械学習を専攻。ベイズ的枠組みを用いて、複数の遺伝子のデータから遺伝子どうしの相互作用ネットワークの推定に関する研究を行った。

株式会社NTTデータに入社後は、法人や金融のシステム開発のシステム基盤担当としてキャリアを積み、現在はデジタル技術やAgile開発を専門に扱う組織でシステム開発全般を担当する。
2019, 2020 APN AWS Top Engineers, Japan APN Ambassador 2020に選出に選出。

本連載の内容に対するご意見・ご質問はtwitter: @kikuchitk7まで。