Amazon Web Services ブログ

XGBoost と Amazon SageMaker を使った機械学習の簡素化

機械学習は、コンピュータビジョン、自動運転車、自然言語処理といった、これまでになかったユースケースを可能にした強力なツールです。機械学習は有望な技術ではありますが、実際に実装するとなると複雑です。このブログ記事では、XGBoost というシンプルかつパワフルで、いろんなユースケースに対応可能な機械学習ライブラリについてお話します。XGBoost を Amazon SageMaker のサンプルデータセットで実行するためのステップバイステップチュートリアルもあり、その中で、クレジットカード債務不履行になる可能性を予測するモデルの構築方法が紹介されています。

XGBoost とは ?

XGBoost (extreme gradient boosting) は、勾配ブースティング木を使ったアルゴリズムを、広く普及する効率的なオープンソース使って実装するソフトウェアです。勾配ブースティングとは、より単純で弱いモデルセットの推定値を組み合わせることで、目標変数を正確に予測しようとする機械学習アルゴリズムです。決定木モデルに勾配ブースティングをスケーラブルに適用することで、XGBoost は機械学習競争の中でも非常によく機能させることができます。さらに、様々なデータタイプ、関係、および分散を確実に処理します。モデルのパフォーマンスを向上するためにチューニングできる変数であるハイパーパラメータを数多く提供できます。こうした柔軟性により、XGBoost は様々な機械学習の問題を解決できるのです。

XGBoost で扱われる問題とユースケース

XGBoost が最もよく解決する問題は 3 つ、分類、回帰、そしてランク付けです。

  • 分類分類は、入力値を取りそれを 2 つ以上のカテゴリに分類することが目標です。分類のユースケースの例として、不正検出が挙げられます。不正検出とは、トランザクションに関する情報を取得し、それが不正か否かを判断することです。XGBoost に過去のトランザクションのデータセットを与えると、不正であるか否かにかかわらず、入力トランザクションデータをそれが不正である可能性にマッピングする関数を学習します。
  • 回帰 回帰では、入力をクラスの離散数にマッピングする代わりに、目標が数値として出力されます。回帰で使われる問題の一例は、家の売却価格の予測です。この場合、XGBoost に住宅や販売価格に関する履歴データを与えると、住宅に関するメタデータが与えられた場合に、その家の販売価格を予測する機能を習得するのです。
  • ランク付けクエリと一連のドキュメントが与えられたとします。ランク付けは、ドキュメントの相対的な重要性を見つけ出し、関連性に基づいて順序付けすることが目標です。ランク付けに関するユースケースの一例は、電子商取引用ウェブサイトでの商品検索です。検索結果、クリック、および購入成功例に関するデータを活用し、XGBoost をトレーニングに適用することができます。こうすることで、検索する製品の関連性スコアを示すモデルが生成されるのです。

Amazon SageMaker での XGBoost の利用

XGBoost はダウンロード可能なオープンソースライブラリで、ほとんどどこででも実行できるため、Amazon SageMaker でも使用可能です。Amazon SageMaker は、機械学習ワークフロー用のマネージド型トレーニングおよびホスティングプラットフォームです。開発者やデータサイエンティストは、Amazon SageMaker を使用して、どんなインフラストラクチャも管理することなく、機械学習モデルをトレーニングし、デプロイすることができます。Amazon SageMaker プラットフォームに、独自のトレーニングとホスティングコンテナをいつでも持ち込むことができますが、XGBoost を含む Amazon SageMaker に付属のアルゴリズムとライブラリを活用することも可能です。Amazon SageMaker で XGBoost を使う理由は、数多くあります。

  • すぐに使える分散型トレーニングXGBoost を使った Amazon SageMaker では、大規模なデータセットを複数のマシンでトレーニングすることが可能となります。スケールアウトしたいマシンの数とサイズを指定するだけで、Amazon SageMaker はデータとトレーニングプロセスの分散処理をサポートします。
  • Amazon S3 キートレーニングによるシャーディングAmazon S3 キートレーニングによるシャーディングでは、Amazon S3 上でデータを分割する必要があります。こうすることで、Amazon SageMaker は、全ノードのデータ全てをダウンロードするのではなく、データセットの各パーティションを個々のノードにダウンロードするのです。その結果、Amazon S3 からデータセットをダウンロードする時間が短縮され、結果的にトレーニングジョのがスピードがアップするのです。
  • XGBoost インスタンス重み付けトレーニングAmazon SageMaker で XGBoost を使用すると、トレーニング中、個別のデータポイントに重み付けすることができ、これはインスタンスとも呼ばれます。これにより、顧客はモデルトレーニング中に重み値を割り当てることによって、異なるインスタンスの重要性を区別することができるのです。
  • Spark SDK との Spark 統合この SageMaker Spark SDK は開発者が Amazon SageMaker XGBoost とやりとりするための簡潔な API を提供します。開発者は最初に Apache Spark でデータを前処理し、Spark 環境から Amazon SageMaker XGBoost に直接呼び出します。これで、Amazon SageMaker トレーニングインスタンスがスピンアップし、Spark ですでに前処理してあるデータ上のモデルをトレーニングするのにそれらを使用します。
  • 簡単なデプロイとマネージド型モデルのホスティングモデルのトレーニング後、製品にデプロイするための API 呼び出しはひとつだけです。Amazon SageMaker のホスティング環境を管理し、それを Auto Scaling 用に設定することができます。これにより、ホスティング環境を実行するための運用オーバーヘッドが削減できます。
  • ネイティブ A/B テストAmazon SageMaker ホスティングを使用すると、それぞれが異なる推論の重みを持つ複数の XGBoost モデルを実行することができます。A/B テストは、顧客がユースケースに最適なモデルを判断するのに役立ちます。

チュートリアル – クレジットカード債務不履行予測

このチュートリアルでは、Amazon SageMaker を活用して、XGBoost モデルのトレーニングとデプロイを行い、クレジットカード債務不履行になる可能性があるかどうかを検出します。UCI 機械学習リポジトリにある “default of credit card clients” データセット 1 を使用します。

まず、Amazon S3 バケットを作成します。ここに、トレーニングデータセットと、トレーニングジョブが完了した後に Amazon SageMaker が出力するモデルを保存します。次に、Amazon SageMaker ノートブックインスタンスを作成します。ノートブックインスタンスはマネージド型 Jupyter ノートブック環境を提供し、そこでデータセットをダウンロードし、データを前処理し、モデルを訓練し、モデルをホストし、予測を行います。

まず、Amazon S3 コンソール https://s3.console.aws.amazon.com/ にアクセスしてください。

Create bucket を選択します。

表れたウィンドウで、バケットに “yourname-sagemaker” などの名前を付けます。

Create を選択します。

バケットを作成したリージョンをメモし、次に同じリージョンにある Amazon SageMaker コンソール https://console.aws.amazon.com/SageMaker/ に移動します。

Create notebook instance を選択します。

表れたウィンドウで、ノートブックに “yourname-notebook” などの名前を付けます。

IAM ロールのドロップダウンリストで、Create a new role を選択します。

新しいロールを作成するには、Specific S3 bucket テキストボックス内にあるバケットの名前を指定します。これにで、Amazon SageMaker は Amazon S3 バケットにアクセスする権限を得ました。

Create role を選択します。

Create notebook instance を選択します。

ノートブックの準備ができたら、ノートブックを開くオプションができます。

Open を選択します。

Amazon SageMaker のノートブックインスタンスにはいろんなサンプルノートが付いていますが、このチュートリアルでは新しいノートブックをオーサリングします。

New を選択します。

conda_python2 を選択し、Python2.7 環境で新しいノートブックを開きます。

ノートブックができたので、データセットをダウンロードおよび表示するためのコードを入力すると、モデルのトレーニング、予測をすることができます。

Jupiter ノートブックを使用して、次のコードを入力し、チュートリアルを完了してください。Jupyter の再生ボタンまたは Shift + Enter を押して、選択したノートブックセルでコードを実行します。

bucket = 'yourname-sagemaker'
prefix = 'sagemaker/xgboost_credit_risk'

# Define IAM role
import boto3
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import sagemaker
from sagemaker import get_execution_role
from sagemaker.predictor import csv_serializer

role = get_execution_role()

まず、ノートブックをセットアップする必要があります。そのために、使用している Amazon S3 バケットを定義し、必要なライブラリをインポートし、トレーニングジョブにアクセスする必要のあるノートブック環境から Amazon SageMaker 実行ロール (IAM ロール ) を取得します。

!wget https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls

次に、.xls ファイルとして提供されるデータセットをダウンロードします。

dataset = pd.read_excel('default of credit card clients.xls')
pd.set_option('display.max_rows', 8)
pd.set_option('display.max_columns', 15)
dataset

データセットを読むと、30,000 レコードがあり、各レコードにはそれらが示す個人のクレジットスコアに関連する機能を記述した 23 の関連属性があることが分かります。属性は次の通りです。

  • X1 : 与えられたクレジットの金額
  • X2 : 性別 (1 = 男性 ; 2 = 女性 )
  • X3 : 教育 (1 = 大学院、2 = 大学、3 = 高校、4 = その他 )
  • X4 : 婚姻状況 (1 = 既婚 ; 2 = 単身 ; 3 = その他 )
  • X5 : 年齢 ( 年 )
  • X6 – X11 : 過去の支払履歴追跡した過去の月々の支払記録 (2005 年 4 月〜 9 月 ) は次のように表示されます。X6 = 2005 年 9 月の返済状況、X7 = 2005 年 8 月の返済状況... X11 = 2005 年 4 月の返済状況。返済状況の測定スケールは次の通りです。-1 = 期日どおりの支払い、1 = 1 ヶ月間の支払い遅延、2 = 2 ヶ月間の支払い遅延... 8 = 8 ヶ月間の支払い遅延、9 = 9 ヶ月以上の支払い遅延。
  • X12-X17 : 請求書の金額、X12 = 2005 年 9 月の請求書の金額、X13 = 2005 年 8 月の請求書の金額... X17 = 2005 年 4 月の請求書の金額。
  • X18-X23 : 前回の支払い額。X18 = 2005 年 9 月に支払った金額、X19 = 2005 年 8 月に支払った金額...。X23 = 2005 年 4 月に支払った金額。
  • Y : その人は債務不履行になりましたか?( はい = 1 , いいえ = 0)

“Y” 属性はターゲット属性として知られています。つまり、XGBoost に予測させたい属性です。ターゲット属性はバイナリであるため、モデルはバイナリ分類とも呼ばれるバイナリ予測を実行します。このデータセットでは、Y 列の 1 は以前に債務不履行になった人物を、0 は過去に債務不履行していないことを意味します。

通常は、フィーチャーエンジニアリングを使用してモデルの最適な入力を選択します。フィーチャーエンジニアリングとは、実験を必要とする反復プロセスのことで、多くのモデルを作成して、最高のモデルパフォーマンスを得ることのできる入力機能を見つけます。このチュートリアルではそのステップは省略して、与えられている機能で XGBoost をトレーニングします。

dataset = dataset.drop('ID')
dataset = pd.concat([dataset['Y'], dataset.drop(['Y'], axis=1)], axis=1) 

Amazon SageMaker XGBoost では、CSV または LibSVM 形式のデータでトレーニングできます。こちらの例では、CSV 形式を使用します。次のようになります。

  • 最初の列に予測変数を設定する
  • ヘッダー行は使わない

データセットを CSV 形式にフォーマットするには、最初の列に行番号を付ける “ID” 列をドロップし、”Y” 列を DataFrame の最初の列に変更します。

train_data, validation_data, test_data = np.split(dataset.sample(frac=1, random_state=1729), [int(0.7 * len(dataset)), int(0.9 * len(dataset))])
train_data.to_csv('train.csv', header=False, index=False)
validation_data.to_csv('validation.csv', header=False, index=False)

ここでは、データセットをトレーニング、検証、およびテストセットに分割しました。XGBoost はトレーニングデータセット上でトレーニングし、検証セットをデータとして使用して、モデルをトレーニングする時の予測結果を評価します。モデルをデプロイした後、テストセットに対して予測を行います。

s3_input_train = boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_validation = boto3.Session().resource('s3').Bucket(bucket).Object(os.path.join(prefix, 'validation/validation.csv')).upload_file('validation.csv') 

データセットの準備ができたら、Amazon S3 にアップロードし、その場所をメモして、トレーニングで使用できるようにします。

containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'}

sess = sagemaker.Session()

xgb = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],
                                    role, 
                                    train_instance_count=1, 
                                    train_instance_type='ml.m4.xlarge',
                                    output_path='s3://{}/{}/output'.format(bucket, prefix),
                                    sagemaker_session=sess)
xgb.set_hyperparameters(eta=0.1,
                        objective='binary:logistic',
                        num_round=25)

xgb.fit({'train': s3_input_train, 'validation': s3_input_validation})

次のステップで XGBoost のトレーニングが始まります。最初に、Amazon SageMaker XGBoost トレーニングコンテナの場所を定義します。それから、Amazon SageMaker のエスティメーターを作成します。次の値をただ変更するだけで、 train_instance_counttrain_instance_type実行したいインスタンスのサイズと数を変更することができます。これでトレーニングをスケールアウトし分散できます。

XGBoost には、モデルのパフォーマンスを向上させるためにチューニングできる、たくさんのハイパーパラメータもあります。ここでは、最も一般的な調整をしたいくつかのハイパーパラメータの値を設定します。注意すべきは、 objective パラメータは binary:logisticに設定していることです。このパラメータは、XGBoost にどのような問題 ( 分類、回帰、ランク付けなど ) を解決するかを指示します。こちらのケースでは、クレジットカード債務不履行になる可能性がある人物かどうかを予測することで、バイナリ分類の問題を解決しています。

トレーニングが完了すると、トレーニングのログが表示されます。このログには、トレーニングや検証エラーなどの指標が含まれており、モデルのパフォーマンスを評価するのに役立ちます。トレーニングログは、Amazon CloudWatch Logs でも利用できます。

xgb_predictor = xgb.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')

モデルのトレーニング後、Amazon SageMaker ホスティングにモデルをデプロイします。ホスティングエンドポイントの設定には数分かかります。

xgb_predictor.content_type = 'text/csv'
xgb_predictor.serializer = csv_serializer
xgb_predictor.deserializer = None

def predict(data, rows=500):
    split_array = np.array_split(data, int(data.shape[0] / float(rows) + 1))
    predictions = ''
    for array in split_array:
        predictions = ','.join([predictions, xgb_predictor.predict(array).decode('utf-8')])

    return np.fromstring(predictions[1:], sep=',')

predictions = predict(test_data.as_matrix()[:, 1:])
predictions

最後のステップは予測です。まず、シリアライザを設定します。これは Numpy 配列 ( テストデータのような ) にし、CSV 形式にシリアル化します。次に、テストデータに入力として取り込み、データの予測を実行する予測関数を定義します。これは次の関数呼び出し xgb_predictor.predict() を通して行われます。

出力は予測がある配列です。配列の最初の要素は、初めに入力したデータ行に対応する人物がクレジットカード債務不履行になる確率です。配列は、テストセットにある全ての行の確率を続けます。

モデルをホストしているので、クレジットカード保有者のうちどの顧客が債務不履行を受けるかについての予測を開始することができます。これにより、顧客の信用度を知ることができるので、信用の発行を改善し、将来の支払いを予測することができるのです。

まとめ

XGBoost は、分類、回帰、およびランク付けの問題を解決するのに最適でパワフルな機械学習ライブラリです。Amazon SageMaker で XGBoost を使用するには、インフラストラクチャの設定と管理を行う必要はなく、分散トレーニングやマネージドモデルホスティングなどの付加的なメリットがあります。XGBoost で解決できそうなユースケースがある場合は、Amazon SageMaker サンプルノートブックを参照ください。これらのノートブックには、XGBoost を実装する方法の例があり、アルゴリズムが他のユースケースにどのように適応できるかの例も含まれています。

リファレンス

  1. Yeh, I. C., & Lien, C. H. (2009)クレジットカード顧客の債務不履行確率の予測精度に関するデータマイニング技術の比較Expert Systems with Applications, 36(2), 2473-2480

今回のブログ投稿者について

Yash Pant は AWS のエンタープライズソリューションアーキテクトです。企業顧客がクラウド用のアプリケーションを移行および設計するのを支援し、現在は主に機械学習ワークロードに取り組んでいます。

Saksham Saini は Amazon Sagemaker のソフトウェア開発者です。イリノイ大学アーバナ・シャンペーン校で、コンピュータエンジニアリングの学士号を取得しています。現在、Amazon Sagemaker 向けに高度に最適化したスケーラブルなアルゴリズムの構築に取り組んでいます。仕事以外では、読書や音楽、旅行が趣味です。

Yijie Zhuang は AWS SageMaker のソフトウェアエンジニアです。デューク大学でコンピュータエンジニアリングの修士号を取得しました。Amazon SageMaker のアルゴリズムとアプリケーションの構築に忙しい日々を過ごしています。