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

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

XGBoost とは ?

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

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

Amazon SageMaker での XGBoost の利用

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

このチュートリアルでは、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 を選択します。

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

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

New を選択します。

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

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

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

bucket = 'yourname-sagemaker'prefix = 'sagemaker/xgboost_credit_risk'# Define IAM roleimport boto3import reimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport osimport sagemakerfrom sagemaker import get_execution_rolefrom sagemaker.predictor import csv_serializerrole = 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 の関連属性があることが分かります。属性は次の通りです。

“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_serializerxgb_predictor.deserializer = Nonedef 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 を実装する方法の例があり、アルゴリズムが他のユースケースにどのように適応できるかの例も含まれています。


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

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

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

関連記事