Amazon Web Services ブログ
Amazon Sagemaker を使用してマーチ・マッドネスを予測する
ここは米国で 3 月中旬です。ということは、思いつくのはたった一つのことしかありません。マーチマッドネス (全米大学男子バスケットボール大会) です。毎年数え切れないほど多くの人々が、トーナメント表にメモを書き込んで、どの大学バスケットボールチームが制覇するかを予想します。あなたが 2018 年の優勝は間違いなしと思っている贔屓のチームはありますか。
このブログポストでは、Amazon SageMaker を使ってマーチマッドネスの予測変数を作成する方法を紹介します。Amazon SageMaker は、開発者やデータサイエンティストがいかなる規模の機械学習モデルであっても容易に構築、トレーニング、およびデプロイすることを可能にする完全マネージド型サービスです。このポストでは、プロセスをゼロから作り上げる手順について紹介します。モデリングのため、私たちは、チームごとの成績統計情報 (2002 年から現在) を記録している kenpom.com (https://kenpom.com/) と、過去の得点 (2011 年から現在) を記録している College Basketball Reference (https://www.sports-reference.com/cbb/) の公開されているフロントページのデータを利用します。私たちは、Jupyter Notebook をダウンロードする方法を説明しますが、このノートブックを使用すると、データの処理と探索、大学バスケットボール試合の結果の予測、そして最終的に Sagemaker エンドポイントの作成を行うことができます。
- Amazon SageMaker を使用してマーチマッドネスを予測する
- Amazon SageMaker でサポートされるマーチマッドネス予測変数アプリケーションを作成する
このポストは、Amazon SageMaker を使用するプロセスのモデリングとホスティングにフォーカスします。将来のポストでは、あなたのモデルを使用して構築するアプリケーションの作成方法を紹介します。たとえば、Amazon SageMaker エンドポイントを使ってウェブサイトを補強することによって、予定されている今後の試合に関する予測を自動的に生成したり、2018 NCAA トーナメントをシミュレートしたり、仮定の対戦に関するユーザ入力に対応したりすることができるようになります。
ザビエル大学は Sweet 16 におけるゴンザガ大学の勝敗の行方を見届ける必要がある。仮定の Elite 8 の対戦では、デューク大学とミシガン州立大学は、それぞれ、第 2 シードと第 3 シードだが、中西部では、両校とも第 1 シードのカンザス大学よりも人気がある。モデルでは贔屓の大学が勝利すると予測する可能性がありますが、実際には贔屓のチームのすべてが勝利する可能性は極めて低いため、予測した勝利確率を使ってスマートな逆転予測を作成することに注意してください。
環境のセットアップ
Amazon SageMaker を使ったモデリングで使用するデータを格納する Amazon S3 バケットを作成するところから始めます。aws.amazon.com にある AWS 管理コンソールを開いて、Amazon S3 コンソールを検索します。
Amazon S3 コンソールで、[create bucket icon (バケットアイコンの作成)] を選択してから、バケットの名前と AWS リージョンを選択します。この名前はグローバルに一意でなければならないこと、ならびにここで選択するリージョンは Amazon SageMaker で使用するリージョンと同じでなくてはならないことに注意してください。私はこの演習では米国西部オレゴン州 (us-west-2) リージョンを使用するので、皆さんもそのリージョンを使用すれば、話についてきやすくなると思います。[Next (次へ)] を選択して、[Set Properties (プロパティの設定)] タブで、バージョン管理を有効にし、このプロジェクト専用のタグを追加します。[Key (鍵)] では「public_blog」を使用し、[Value (値)] では「cbb」を使用します (このプロジェクトを通してそうします)。
バージョン管理を使用すると、モデルファイルの複数のバージョンを追跡することができます。タグを使用すると、このプロジェクトに関連付けられるさまざまなリソースを追跡することができます。バージョン管理とタグ付けを使用することは、いずれも AWS のベストプラクティスです。この外の機能を変更することもできますが、この演習では不要です。
[Next (次へ)] を選択して、[Set Permissions (権限の設定)] タブを開きます。デフォルトの設定はそのままにしておきます。[Next (次へ)] を選択して、[Create Bucket (バケットの作成)] を選択します。 作成したバケットを選択して、表示される画面の手順に従います。
これで S3 バケットをセットアップすることができました。次に、Amazon SageMaker に移って、モデリングのセットアップを始めましょう。
ここから、あるいは、以下の AWS コマンドラインインターフェイス (AWS CLI) のコマンドを使用して、Jupyter Notebook をダウンロードします。ただし、<local_file_directory> はあなたのローカルディレクトリで置き換えてください。AWS CLI を使ったことがない場合、インストールや使用法については、このガイドを参照してください。
AWS 管理コンソールで、Amazon SageMaker を検索します。
Amazon SageMaker コンソールで、[Create notebook instance (ノートブックインスタンスの作成)] を選択して Jupyter Notebook を作成します。Jupyter は実験用に構築された人気のあるデータサイエンスツールであり、データサイエンスプロセスの最中にデータの処理、探索、モデリング、および評価を行うことができます。
次に、ノートブックインスタンスに名前を付け、[IAM Role (IAM ロール)] セレクターで、[Create a new role (新しいロールの作成)] を選択することによって、S3 に Amazon SageMaker へのアクセス権を付与する新しい IAM ロールを作成します。これにより、データを Amazon S3 と Amazon SageMaker の間で通信して転送することができるようになりますが、それがこの演習では必要な機能です。
Amazon SageMaker ノートブックに 2 つの特別なバケットに対するアクセス権を付与します。すなわち、wp-public-blog-cbb (モデリングに必要なデータを含んでいる) およびこのポストの最初のセクションで作成したバケット (私はこのバケットに wp-cbb-mods という名前を付けました) です。
次に、[Create role (ロールの作成)] を選択します。そして S3 セクションで作成したタグと一致するタグを追加し、次のページで、[Create Notebook Instance (ノートブックインスタンスの作成)] を選択します。
その結果、Amazon SageMaker コンソールの上部には以下の情報が表示されるはずです。
成功です。Amazon SageMaker ノートブックが利用可能になるまで、数分の時間が必要です。利用可能になったら、[Actions (アクション)] カラムで [Open (開く)] を選択します。これで Jupyter 環境に移ることができたわけですが、そこでは新しいノートブックを駆使することになります。
以前ダウンロードした WP_Blog_CBB.ipynb Jupyter Notebook を、Jupyter コンソール内の [Upload (アップロード)] オプションを使用して、アップロードします。
WP_log_CBB.ipynb ファイルを選択して、必要に応じて名前を変更し、もう一度、[Upload (アップロード)] を選択します。
ここで、Jupyter ノートブック内で当該ファイルを選択すると、次のような画面が現われます。
Amazon SageMaker の詳細
データの操作を開始する準備ができました。以下のリストは、この演習で使用するファイルを示しています (以下の説明は、サンプルのノートブックにも記載されています)。
- kenpomnew_active.csv : https://kenpom.comのフロントページの現在のシーズンの最新のデータが含まれています。このデータについての詳細は、当該サイトにアクセスすることをお勧めします。
- KenPomHistoric_2002_2017.csv : https://kenpom.comのフロントページの過去のシーズンのデータが含まれています。これらはシーズン終了時のチームを反映していることに注意してください。
- historic_game_data.csv : College Basketball Reference を出典とする 2010~2011 年から昨日の試合まで、過去の試合の結果です。これは毎晩、新しい得点によって更新されます。
- kenpom_teams.csv : これは、Kenpom ファイルと College Basketball Reference の試合結果との間でチーム名を変換するときに必要になります。両方の Kenpom ファイル内の「Team」は、このファイルの「kenpom_unique」カラムに対応しています。
このブログで使用しているすべての詳細情報とコメントは、用意した Jupyter ノートブックに掲載されています。このブログでは、ノートブックの特定のセクション (特に、データのローディング、モデルの構築と評価、ホステッドエンドポイントの作成) のみフォーカスしますが、あなたはサンプルのノートブックのすべての詳細情報を参照することができます。
最初のコードブロックで必須のステップの 1 つは (Step 0)、「mybucket」変数の参照先を、この演習の最初のセクションで作成した S3 バケットに変更することです。こうすることで、あなたのモデルファイルをあなたの S3 バケットに保存することができるようになります。このステップをバイパスすると、コードの残りの部分が異常終了することになることに注意してください。
コードの次の数ブロックは、データの前処理を行う部分です。あなたの使用目的に合わせて自由に改変してください。あるいはそのままコピーしてください。1 つの重要な側面は、以下のコードに示されている kenpom_teams.csv ファイル (teams_data 参照) による対応関係です。これにより、College Basketball Reference と Kenpom ファイルとの間で対応するチーム名が変換されます。このステップをスキップすると、KenPom の成績データを過去の試合結果と対応させようとした場合、チーム名がファイル間でマッチしなくなるため、大量のデータを見失う原因になります。別のオプションの前処理ステップは、ホームのチームとアウェイのチームを無作為に選ぶためでした。ホームのチームが勝利することが多い (データセットでは 64% 以上) ため、データは本来的にアウェイが先でホームが後という構造になっています。この無作為化は、モデルの曲線下面積 (AUC) にプラスの効果がありました。
データの前処理、特定の探索的データ分析 (EDA) の実施、ならびにデータのトレーニング、検証、およびテストへの割り振りが終了すると、モデリングの準備は完了です。
Amazon SageMaker ノートブックの「ステップ 4 – モデリング」セクションでは、トレーニングで使われるデータと検証で使われるデータについての言及があり、その後、モデリングで使われるアルゴリズムがある場所が指示されています (この演習では、内蔵されている Amazon SageMaker XGBoost アルゴリズムを使用します)。
この演習では、2 つのモデルを作成します。1 つは 2 つのチーム間のポイントの予想差を予測するモデルであり、もう 1 つは総得点を予測するモデルです。予想差モデルと総得点モデルの両方を作成することは、暗示的に予想得点を生成したり、暗示的に勝利確率を生成したりすることになり、出力を誇示する楽しい機会を作り出します。たとえば、予想差モデルが 10 を予測し、総得点モデルが 150 を予測した場合、この試合で暗示される得点は 80 対 70 となります。
予想差モデルのモデリングプロセスから始め、総得点モデルについては、完全に同一のステップを踏襲することにします。
次に、Amazon SageMaker モデルを実行するためのパラメーターを定義します。今回は小さいデータセットなので、1 つのインスタンスで十分です。 これをより大きなデータセットに適用した場合、どのように機能するのか知りたい場合、Amazon SageMaker を使用して、複数のインスタンス上の XGBoost をトレーニングしている例を参照してください。「Amazon SageMaker のセットアップ」で定義した IAM ロールを使用して、ノートブックインスタンスが、Amazon Simple Storage Service (S3) のトレーニングおよび検証のデータにアクセスできるようにします。また、同じ S3 バケット内の出力のアップロードも行います。
最後に、fit 関数を呼び出します。これが必要なインスタンスを実際に駆使して、トレーニングジョブを実行します。これくらいの量のデータを XGBoost を使って処理する場合、約 6~8 分の時間がかかります。
実行が終わると、選択した eval_metric (この場合、RMSE) に基づく検証セットの得点など、モデルの統計情報を示す出力が表示されます。
総得点モデルについて同じステップを繰り返したら、これらのモデルをホステッド Amazon SageMaker エンドポイントにデプロイすることになります。これらのエンドポイントを使用し、モデルが新しいデータ用に汎用化され、(ウェブサイトで見られるような) ユーザー向けのアプリケーションをサポートできるようになったことを確認するためのテストセットに基づいて、予測を生成します。Amazon SageMakerでは、エンドポイントの作成は、これまでになく簡単になります。単純に関数を呼び出すだけではエンドポイントが永久に待機状態になります。
エンドポイントの作成とトレーニングの重要な違いは、エンドポイントは明示的に削除されるまで動作し続けるのに対して、モデリングのインスタンスは、モデルの実行が終了すると直ちにシャットダウンすることです。Amazon SageMaker エンドポイントを使い終わった後の予期しない課金を避けるため、コンソールまたは delete_endpoint 関数を使用して、エンドポイントは確実に削除してください。これらのエンドポイントを削除すると、それをベースに作成されていたアプリケーションでは、サポートが行われなくなります。
以下のコードブロックは、データを適切な形式 (この例では、csv) で取得し、Amazon SageMaker エンドポイントを使用して、テストセットに基づいて、予測を生成します。
ノートブックでは、勝ち負けの 2 値予測のための混同行列および精度率の生成や、予想差モデルと総得点モデルのための決定係数および RMSE の得点など、モデルのパフォーマンスを評価するための一連の関数が作られています。
このモデルの勝ち負け予測の総合精度は 77.7% です。使用するデータはシーズンの終了時点を反映しているため、この数字が大きくなっていることに注意してください。シーズン初期の試合にシーズンの終了時点の総合集約統計情報を反映させると、偏りが生ずるからです。過去のデータは任意の時点のものはありません (シーズンの終了時点のもののみ)。しかし、今年の分から取得したデータ (2018 年 2 月/ 3 月) の任意の時点のデータを使用した総合精度の 72% を、シーズンの終了時点のデータを使用した場合の 74% と比較すると、この影響は比較的小さなものと考えられます。
またこれは、このモデルは新しい情報を利用していないことも意味します。これはシーズンの平均値を使っているからです。初めに述べたように、バージニア大学の 1 人の有力選手がシーズンの終わりにケガをしたため、今シーズンの NCAA トーナメントへの出場が危ぶまれています。シーズンの平均値は彼の欠場を配慮していないため、バージニア大学の予測では予想される成績を過大評価することになると思われます。選択を行う場合、あなた独自の判断とこのモデルの限界に対する理解に基づいて、このモデルを補完する必要があります。
モデルの精度は渡される新しいデータ、ならびに異なるトレーニングセットおよびテストセットの使用によって、若干変化することを認識しておく必要があります。しかし、大きな変化がない限り、77.7% の数パーセント以内の誤差で収まるはずです。
この他にもこのモデルに適用可能なモデル固有の改善点がたくさんあります。その一部は、以下のとおりです。
- 一時的なパフォーマンス最新の週/月のチームのパフォーマンスはどうでしたか。成績統計情報はシーズンを通してのものなので、ケガやパフォーマンスの変化に影響する資格の変更が、集約されるシーズンを通したデータへ反映されるのは遅くなります。また、シーズン終了時点のデータを使用していることは、シーズン初期の試合のパフォーマンスを予測する場合、偏りを生じさせます。
- ニュートラルな試合の認識NCAA トーナメントの試合は、今年は 3 月 6 日に開幕するカンファレンストーナメントの試合と同様に、ニュートラルコートとして識別されてきましたが、多くの人が正しく識別していないように思われます。また、カンファレンストーナメントによっては、ホームコートアドバンテッジを持つものがあったり、そうではなかったりするものがあります。適切にホーム/アウェイ/ニュートラルコートを識別することは、疑いもなくモデルのパフォーマンスを改善します。
- シーズン単位のリスケーリング現在チームはデータセットに含まれるすべての年 (2011~2018 年のシーズン) を通じて、0~1 の範囲でリスケーリングされています。この値は、特定のシーズンでリスケーリングすれば、簡単に変化します。
- 他のアルゴリズムのテスト
- 追加データの付加
自由にクリエイティブになって、モデルのパフォーマンスに役立つソリューションを追加してください。
モデルの評価
両方のモデルの機能の重要性をプロットするために、Amazon S3 からローモデルファイルを抽出しました。モデルが影響力のある変数に関してあなたの直観と一致するかどうかを確認する場合、機能の重要性のプロットが非常に役立ちます。以下のチャットにおいて、数値はデータセットの順番を表わしています (1 から始まる)。「2」と「12」(100 回のポゼッションごとのチームの得失点差) は両方のチームの総合成績を反映しているので、予想差モデルでは、当然ながら、この 2 つが最も影響力のある予測変数となります。
総得点モデルでは機能の重要性はさらに均等に分散しています。予想差モデルで 最も影響力のあった 2 つの変数は総得点モデルではトップ 5 にも入っていません。これは合理的です。成績は必ずしも得点に結びつかないからです。このような方法で機能の重要性をプロットすることは、直観のトレーニングに役立ち、予測が論理的ではない状態に戻ってしまった場合、デバッグで使うこともできます。
誤差を評価すると、予想差が勝利の可能性と線形関係を持っていないことが明らかになります。以下のグラフは、予想差モデルの予想差に基づくテストセットで観察された試合の勝率を示しており、シグモイド関数と非常によく似ていることがわかります。
サンプルのワークブックのコードの次のセクションは、予想差をチームの勝利の可能性に変換するロジスティック回帰モデルを生成します。これはトーナメント表で選択を行う場合に役立ちます。
予想差を確率に変換すると、曲線下面積、すなわち AUC のスコアも生成されます。この例の場合、86.1% です。
2018 年のマーチマッドネスの予測
ノートブックの最後のセクションは、あなたのデータセットに基づいて、NCAA トーナメントをシミュレートします。これを使用すると、特定のチームの可能性のあるすべての対戦、トーナメント内の2つのチームの特定の対戦をシミュレートすることができます。そのため最終的には、あなたのモデルに基づいて、今年のトーナメントの最もありうる最後の結果をシミュレートすることができます。当然、トーナメントでは逆転も起こり得ます。そのうちいくつかは非常に大きなオッズを持ち、またあるものは五分五分の見込みとなります。いずれにしてもこの出力は、あなたの選択の指針になります。結果の印刷に加えて、このコードブロックは、外部での利用に配慮して、シミュレートした NCAA トーナメントをあなたの S3 バケットに CSV 形式で保存します。
このモデルはチームのシーズンを通した平均値を使用するので、予想される将来のパフォーマンスを変化させる可能性が高い、劇的なイベント (ケガや移籍) が発生するとチームを過大評価する原因になります。これは、2018 年のトーナメントで現実のものとなりました。バージニア大学はこのトーナメントでは総合でトップのシードでしたが、シーズンの終わりに最優秀選手の 1 人がケガをして、その年の残りを棒に振りました。これでバージニア大学のトーナメントにおける予想されるパフォーマンスが過大評価となる可能性が高まります。したがって、選択を行う場合、これに留意する必要があります。
まとめ
要約すると、私たちは 2 つのチーム間の予想される得点差を予測するモデルと、試合の総得点を予測するモデルを生成することができるエンドポイントが付属したワーキングモデルを作成する手順を調べてきました。これを使用すると、試合の暗示される得点を計算することができます。そして最終的に、これらの予想差をチームの試合の勝率に変換するロジスティック回帰モデルを生成することができます。しかも、これだけのことを 1 つの Jupyter ノートブックで成し遂げることができました。
今回のブログ投稿者について
Wesley Pasfield は AWS プロフェッショナルサービスのデータサイエンティストです。 彼は、ノースウェスタン大学の理学修士号を持ち、スポーツ、ゲーム、コンシューマーエレクトロニクス、小売業など、さまざまな業界の課題に取り組んできました。彼は現在、顧客が AWS での機械学習と人工知能のユースケースに対応できるよう支援しています。