AWS

ゲームソフトの売行きをXGBoostで予測してみた【Amazon SageMaker ノートブック+モデル訓練+モデルホスティングまで】

  • このエントリーをはてなブックマークに追加

2017年11月にサービスインした、アマゾンAWSの新しい機械学習サービス「SageMaker」。codexaの機械学習チーム内でも、利用することが増えてきており、機会学習エンジニアの必須プラットフォームになる可能性をひしひしと感じています。

さて、先日に公開した、第一弾チュートリアル「Amazon SageMakerを使って銀行定期預金の見込み顧客を予測【SageMaker +XGBoost 機械学習初心者チュートリアル】」に続いて、今回は第二弾のAmazon SageMaker初心者向けチュートリアルとなります!

前回は銀行の定期預金マーケティングの予測でしたが、今回はゲームソフトの売行き予測をXGBoostで行います。本チュートリアルの概要は下記となります。(チュートリアル参照元はこちら

チュートリアルに掛かる時間

1時間〜3時間程度で実施可能です

発生するAWS料金

最低限のインスタンスを利用して3ドル〜5ドルとなります。SageMakerの無料枠の利用も可能ですので、使える方は無料枠でお試しください。 無料枠を利用しない限りは、料金が発生します。インスタンスの選択など、必ず各自の責任で本チュートリアルを実施ください。 

【重要】

チュートリアル終了後にインスタンスを放置しておくと、無駄な料金が発生していまします。チュートリアル終了後は、必ずインスタンスの停止または削除を行いましょう!

本チュートリアルで実施する概要

  • Amazon SageMakerのノートブックでデータ前処理
  • Boto3経由でS3とSagaMakerの連携
  • モデルトレーニングインスタンスでSageMaker XGBoostの訓練
  • モデルホスティングインスタンスで訓練済みモデルをホスト
  • テストデータをホスティングしたモデルを使って予測値を取得
  • 結果確認

今回ですが第二回目となりますので、登録や初期設定の詳細に関しては省いています。まだSageMakerを一度も触られたことがない方は、第一弾目からどうぞ。

では、早速、やってみましょう!

SageMaker ノートブックインスタンスの立ち上げ

SageMakerのメリットの一つとして、クラウドでJupyter Notebookが簡単に使えることです。機械学習で必要なライブラリやフレームワークが、すでに使える環境ですので、大きな時間短縮となります。

では、SageMakerへログインをしてノートブックインスタンスの立ち上げを行なっていきましょう。まだSageMakerのアカウントをお持ちでない方は、こちらから登録をお願いいたします。

インスタンスの立ち上げですが、基本的には下記の3つの設定が必要なります。

  • ノートブックインスタンス名
  • ノートブックインスタンスのタイプ
  • IAMロール

今回はノートブックインスタンス名を「hit-games」と名付けて作成しました。インスタンスのタイプは、一番安い「ml.t2.medium」を利用しています。無料枠が利用可能な方は、こちらへ無料枠用のタイプが出ているかと思いますので、適宜、そちらを選んで下さい。SageMakerの料金設定はこちらのページを各自参照して、料金を理解した上での利用をお願い致します。また、IAMロールの設定はSageMaker一段目チュートリアルをご参照ください

ノートブックインスタンスの立ち上げが完了したら、次はJupyter Notebookで新しいノートを作成しましょう。下記の画面の「New」のドロップダウンから「conda_python3」を選択して、新規ノートブックを作成します。

これで、ノートブックインスタンスの準備完了です。次にS3のバケット名とリージョンの確認を行いましょう。S3とSageMakerのリージョンが異なると、使えませんので気をつけましょう。S3のコンソールへログインをして、バケット名とリージョンの確認をお願いいたします。本チュートリアルでは、SageMakerの「米国東部(バージニア北部)」を利用していますので、s3も同様のリージョンで作られているのが確認できます。

これで、ノートブックインスタンスの作成は完了です。S3のバケット名ですが、後ほど使いますので、どこかにメモっておきましょう。

次はデータセットの取得とノートブックインスタンスを利用して前処理へ進みましょう!

データセットの取得

本チュートリアルで使うデータセットはKaggleのVideo Game Sales with Ratings(意訳:ビデオゲームの売上とレビュー)を使います。Kaggleにまだ登録されていない方は、この機会に登録をお勧めいたします。(Kaggleの詳しい説明はこちらをご参考

登録完了後に「Data」のページからデータセットのダウロードが可能です。 Video_Games_Sales_as_at_22_Dec_2016.csv をローカルにダウロードしましょう。

データセットのダウロードが完了したら、次はS3へアップロードを行います。SageMakerと同じリージョンのS3のバケット直下へ、 Video_Games_Sales_as_at_22_Dec_2016.csv のアップロードをしてください。

次に、SageMaker ノートブックで、S3へ格納したデータセットを読み込んで、データの前処理を行います。先ほど作成したノートブックを開きましょう。

まずは、S3のバケット名の指定、さらにS3で使うプレフィックスとIAM Roleの宣言をしましょう。ノートブックの一番最初のセルへ下記のコードを入力して、Shift + Enterで実行しましょう。

次に本チュートリアルで使う機械学習系のライブラリのインポートを一括で行います。今回使うライブラリですが、全てSageMakerにインストール済ですので、特に事前の作業は必要ありません。

NumpyPandasなどの機械学習定番のライブラリに加えて、PythonとAWSをブリッジングしてくれるboto3も使います。

次は先ほどKaggleからダウロードして、S3へ格納したファイルの読み込みを行います。ファイル名を指定して、Boto3経由でS3からSageMakerへファイルを移しましょう。さらに、CSVファイルからPandasデータフレームへの変換も行なって、データの表示をしてみましょう。

次は、このデータセットの概要の確認と予測ターゲットの設定を行います。

データセットの確認と予想ターゲットの設定

こちらのデータセットですが、KaggleのDataのページにて詳細が記載してあります。各項目の概要を紐解いていきましょう。データの提供元はMetacritic(メタクリティック)という、ゲームや音楽などをレビュー集積するウェブサービスとなっています。

各項目の概要

  •  Name  ゲームタイトル
  •  Platform  ゲーム機種別
  •  Year_of_Release  ゲーム発売年
  •  Genre 
  • ゲームのカテゴリ
  •  Publisher 
  • ゲーム販売者名
  •  NA_Sales  北米の販売数(単位:百万)
  •  EU_Sales  ECの販売数(単位:百万)
  •  JP_Sales  日本の販売数(単位:百万)
  •  Other_Sales  上記以外の地域の販売数(単位:百万)
  •  Global_Sales  全世界の合計販売数(単位:百万)
  •  Critic_Score  メタクリティックが統計したスコア
  •  Critic_Count  Critic_Scoreの算出元となるレビュー数
  •  User_Score  メタクリティックのユーザーがつけた評価スコア
  •  User_Count  User_Scoreの算出元となるユーザー数
  •  Developer  ゲーム開発名
  •  Rating  アメリカのゲーム利用の年齢制限レーティング

データセット概要

  • 16719行16列のデータセット
  • Name(ゲームタイトル)のユニーク数は約1200
  • Platform(ゲーム機)のユニー数は31
  • Global_SalesなどSales関連の単位は全てMillion(百万)
  • Global_Salesの平均値は0.53(つまり53万個の販売数)

余談ではありますが、こちらのデータを色々と深掘りしてみると面白いですね!別途、時間がある方は深掘りして見ると、データセットの処理の良い勉強になるかと思います!

さて、次は予測ターゲットの設定を考えましょう。今回の予測ターゲットですが、「ゲームソフトがヒットするかどうか」を予測しましょう。ヒットの定義として、ゲームソフトが100万本以上売れたらヒット(ミリオンセラー)とします。

ということで、 Global_Sales のデータ値を参照して、予測ターゲット y を作成しましょう。さらに、今回のデータセットでのミリオンセラーの分布を確認してみましょう。

当然といえば当然ですが、ミリオンセラーの販売実績は非常に高い壁のようですね(笑)。莫大なお金と時間を投じても、売れるゲームと売れないゲームがあるという厳しい現実を表したデータです。

予測ターゲットの設定ができましたので、次はいよいよ特徴量を決めていきましょう。データの各項目を見てみると、予測ターゲット( Global_Sales )に特に関係が強うそうなデータとして、 User_Score  Critic_Score が考えられます。この2項目のデータと予測ターゲットyの相関を対数目盛を利用してプロッティングしてみましょう。

左が Critic_Score で右が User_Score のグラフとなります。想像の通り両方のデータはターゲット y の予測をするのに使えそうなのが解ります。他にも genre (ゲームのカテゴリ)も当然、ミリオンセラーの要因になりますし、 ESRB (米ゲーム年齢制限レーティング)も販売対象となるリーチが大きく異なることから(例:全ての年齢対象のソフトより成人対象のソフトはリースが少ない)、予測ターゲットの特徴量として使えるかと思います。ここでは、他の項目とターゲット y との相関を出しませんが、各自でデータを確認してみてください。

次ですが、特徴量として使えない(使わない)項目を考えましょう。すでにデータをパッと確認したら気づくかと思いますが、 JP_Sales (日本での販売数)など、予測ターゲットに直接関係のあるデータが含まれています。これらの項目は予測モデルに組み込むべきではありませんので、除外しましょう。、あた、 Name (ゲームタイトル)や Year_of_Release (販売開始年)なども除外します。

これで訓練に使う項目のみが残りましたので、次はお決まりの欠損値の確認を行いましょう。 missing_values_table の関数を作成して、 data の各項目(特徴量)の欠損値の状況把握をします。

見たところ、 Critic_Score  User_Score  Rating 50%近くの割合で欠損していますね…。機械学習の醍醐味として、この欠損データをどのように処理を行うかで実力の差が出るのですが、今回はもっともシンプルな方法で処理をしましょう。そう、その方法とは・・除外することです。(失礼しました笑)

これで、欠損データは全て除外されて綺麗になりました。欠損データと同様に、データ値が使えない場合も多々あります。dataを隅々まで確認すると、どうやら User_Score  tbd というストリングの値が含まれています。 User_Score を数値として処理をしたいのに、これは不都合です。

この User_Score  tbd をNaNに変換しましょう。すでに約40%もの User_Score を除外してしまっていますので、これ以上データを絞るのはあまりしたくありません。ですので tbd の値を一度NaNに変換して、さらに相関関係が非常に高い Critic_Score を元にNaNへ代入しましょう。

上の図でもわかり通り、 User_Score  Critic_Score の約1/10となっています。完璧な代入には当然なりませんが、それでもこれ以上データを除外するよりかはマシかと思いますので、その流れで tbd を処理しましょう。

データの前処理もほとんど終わりです。次は、予測ターゲットの y を扱いやすいように処理して、データ前処理で定番のダミー変数化をしましょう。

これで、特徴量の前処理は完了です!次は過学習対策として、データを3つのグループへ分けましょう。今回のチュートリアルでは全体の70%を学習用データとして分けて、20%を評価用データとして使いましょう。残りの10%は最終のテスト用データとして残しておきます。

さて、いよいよデータ前処理の最後のステップとなります。最後は、XGBoost用にlibSVM形式へ変換をして、boto3を経由してS3へファイルを送りましょう。

上記のコードを実行した後に、念のためS3を確認しておきましょう。下記のキャプチャのように、libSVMファイルがS3へ格納されているはずです。

以上でデータの前処理が完了しました!次から、SageMakerのモデルトレーニングインスタンスを立ち上げてモデル構築、さらにはモデルホスティングインスタンスでモデルを使えるようにしましょう。

モデルトレーニング

データの処理が完了したところで、次はXGBoostのモデルの訓練を始めましょう。XGBoostですが、多数のハイパーパラメーターが用意されていますが、今回はその中のいくつか初歩的なものを使ってトレーニングを行いましょう。

12月12日 追記

ハイパーパラメーターとは?

機械学習で使われるモデルで、人間が設定しなくてはいけないパラメーター(設定)のことです。機械学習では、データを用いて機械が学習するものですが、学習されない項目を人間が設定することにより、結果の良し悪しが変動することが多々あります。

さて、次はノートブックでモデルトレーニングを実行していきましょう。手順として、まずは訓練のジョブ用に必要なパラメータ設定して、その後に訓練のジョブを動かします。

コードを動かす前に重要な点が一つ!SageMakerですが、ノートブック、モデルトレーニング、モデルホスティングの各インスタンスで料金が異なります。全てのインスタンスで本チュートリアルでは、全てい最小限のものを利用しています。インスタンスの料金は、各自、必ず理解をした上で実行をお願い致します。

では、モデルトレーニングをやっていきましょう!まずは、パラメーターの設定をしましょう。

次に、モデル訓練のジョブの実行です。こちらですが、本チュートリアルで使用したインスタンス( ml.c4.xlarge )で約6分程処理に掛かりました。

これで、事前に処理したデータセットとSageMakerのXGBoostの訓練が、モデルトレーニングインスタンス上で完了できました。この訓練したモデルのホスティングをSageMakerを使ってやってみましょう。

モデルホスティングの実施

SageMakerのサーバーレスエンドポイントでのホスティングをやってみましょう。

次にホスティングエンドポイントの設定をいくつかしましょう。具体的には、ホスティングで使うEC2インスタンスの指定や、初期で使うインスタンスの個数、さらにはホストされているモデルの名前の設定をします。

さて、最後にモデルのホスティングの実行しましょう。こちらですが、完了するまでに16分程度掛かりました。

実行したセルの下に、上記のようなメッセージが出れば成功です!

構築したモデルでテストデータを使って予測

やっと、①データの前処理②モデルトレーニング③モデルホスティングが完了しました!次はいよいよ、この構築したモデルを使って、予め切り分けておいたテスト用データを使って予測してみましょう。

これで・・切り分けておいた10%のテストデータを使って、構築したモデルで予測が完了しました。機械学習をやっていると、いつもこの瞬間がドキドキします。癖になりますよね(笑)

予測結果の評価ですが、様々な評価方法が存在します。今回は非常にシンプルに、実際の正解データと予測データを付け合わせたテーブルをPandasで作成して、そちらを確認してみましょう。

こちらが今回の結果となります。テストデータ803件を訓練済みXGBoostモデルで予測をしたところ、ミリオンセラーと予測した122件のゲームソフトのうち、73件が実際にミリオンセラーでした

加えて、今回のモデルでは、803件のゲーム中、681件はミリオンセラーにならないと予測して、実際は622件が100万本届かなかったゲームと言えます。(うち59件はミリオンセラーとなりました)

【重要】

チュートリアル終了後にインスタンスを放置しておくと、無駄な料金が発生していまします。チュートリアル終了後は、必ずインスタンスの停止または削除を行いましょう!

 

まとめ

Amazon SageMakerでXGBoostを使った機械学習チュートリアルですが、いかがでしたでしょうか?SageMakerは全てのエンジニアが気軽に機械学習ができることを目的として作られたサービスです。

いくつか癖のある、覚えなくてはいけない箇所(特にモデルホスティング)はあるものの、一概として非常に簡単に、しかも素早く機械学習を実装できるという点では優れたサービスです!

また、機械学習を初めてばかりで、もっと触ってみたいとお考えの方は、下記の初心者向けチュートリアルも是非やってみてください。(下記はAmazon SageMakerではなく、Jupyter Notebookと各ライブラリを使って実施してます)

以上、SageMakerの初心者向けチュートリアル第二弾でした!近日中に今回使用したXGBoostの詳細チュートリアルも予定していますので、興味のある方はコデクサのfacebookまたはTwitterのフォローをお願い致します!

  • このエントリーをはてなブックマークに追加

無料で始める機械学習エンジニア入門

AIエンジニアへスキルアップをしませんか?コデクサでは、機械学習の初心者を対象に0から学べるコースを配信しています。

機械学習に必要な線形代数や統計基礎、さらに初歩的なアルゴリズムなどの無料コースを豊富に取り揃えています!

機械学習エンジニアへキャリアアップをしましょう!

コースを確認する

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)