Diana Boat

ボートレース(競艇)全場無料予想サイト ダイアナボート(V4.27.89)

全国24か所のボートレース場を示した地図
Episode.3

ノーコードから入って、行き詰まるまで

2024年1-3月、ノーコードの予測ツールから入った。だがボートレース場は24ある。

2026年8月20日4

目次

初期の特徴量ファイルは何パターンか存在する状態だ。彼らはAWS S3上に自動で毎晩出力される。だが、大穴=異常値検出にはどんなモデルを使えばいいのだろうか。

そもそも大穴は異常値なのか?

ノーコードというノーサンキュー

僕は面倒くさがり屋、ポジティブに言えば合理主義者である。特に年末からの泣けるスクレイピングコード(Episode.1参照)でコーディングに疲れていた。本業もネコの世話もあるし、休みはワインでも呑みながら動画でも観ていたい。

データさえ突っ込めば後はなんとかしてくれそうだったので、AWS SageMaker Canvas※1に手を出すことにしたらしい。正直、僕はあまり覚えていないのだが、AmazonSagemakerCanvasForecastRoleというIAMロールが2024年1月19日 19:17に作られている。そして、その45分48秒後(20:02)に、136列の新しいCSVをS3へ出力している。

金曜日の夜である。自分が大穴予想に取り憑かれていたのが容易に想像できる。

だが、その後 Sagemaker で学習・予想を最後まで行った形跡がないのである。ここで、僕の面倒くさがりが再発動したらしい。僕はこの当時、以下の2大仮説に縛られていた。

仮説1. 大穴=異常値である: 大穴はランダムに発生するようなものではない。うまく特徴量を捉えることができれば通常のレースとはちがう荒れるレースを検出できるのではないか。

仮説2. 予想モデルは各ボートレース場単位で作るべきである: 全国24箇所に点在するボートレース場はそれぞれコースの形状や季節による風向き、水の質などがちがう。当然各レース場毎に特徴量を作り、学習し、予想すべきだ。

そう。僕はノーコードの環境で24回同じような設定をする必要を感じたとき、ウンザリしたはずである。

漫画家 小田扉さんの「団地ともお」※2 にスポーツ大佐というキャラクターがいる。僕はスポーツ大佐の大ファンである。大佐の有名なセリフを借りてノーコードに言いたい。「NO THANK YOU」。

24会場の壁

まずは自前で学習コードを書いて、24会場同じコードを回したほうが簡単そうだという結論に達したのだ。スクレイピングで慣れてきていた AWS LambdaとStep Functions で学習コードを実装して動きを確認することにした。

初期学習モデルは、DeepOD※3 ライブラリでサポートされていた DeepSAD を使っている。なぜ僕は DeepSAD を最初のモデルとして採用したのか。おそらく非常に単純な理由からである。

DeepOD=Python Deep Outlier/Anomaly Detection、ディープラーニング(深層学習)を用いた異常検知/外れ値検知の Python ライブラリ群という、まさに仮説.1にドンピシャな名前、そして、ディープラーニングという流行り感。

ほとんどジャケ買いに近い。が、DeepSAD は名前の侘び寂び感だけで選んだわけではない。DeepSAD は半教師あり異常検知モデルのため、過去データ=大穴の払戻しがあったレース情報を教師データに利用したいという意図はもちろんあったのだ。 (現在は DeepSAD は使っていない)

そして、案の定、安易な僕はまた無駄な時間を費やすことになる。

Lambda レイヤーの罠

DeepOD は内部実装のベースとして PyTorch を採用している。これが、デカい。物理的なサイズと言う意味である。Lambda で標準以外の Python ライブラリを使うためには通常レイヤーを利用して外部ライブラリをロードするが、PyTorch はデカすぎて、関数とレイヤーを合わせた展開後 250MB という制限に収まらない。NO THANK YOU

なぜ素直に実装させてくれないのか。本質的ではない調査に時間を費やした結果、一旦 EFS をマウントしてそこに Python ライブラリを置くことにして回避した。

Lambda 実行時間の罠

DeepSAD のハイパーパラメータや学習の試行錯誤については次のエピソードで話したいが、この Deep なんとかっていう類のモデルは学習に時間がかかる。Lambda の実行時間15分では到底収まらない。NO THANK YOU

なぜ素直に動いてくれないのか。またしても本質的ではない調査に時間を費やした。学習状況の一時保存を実装し、Lambda のセルフ・インボケーション(Self-invocation)で回避した記憶がある。(現在は、AWS Batch で実行している)

本質とロマン

僕はモデルの名前に踊らされ、初期モデルに採用したばかりに本質的でない作業に多くの時間を費やしてきた。でも、ロマンは確かにあったのだ。

次回はこの初期モデルの精度や、さらなる壁について話そうと思う。

つづく。

機械学習MLAWS LambdaDeepOD

関連情報

  1. Amazon SageMaker Canvas(AWS ドキュメント)本文で最初に手を出したノーコードの予測ツール。
  2. 『団地ともお(3)』 小田扉本文のスポーツ大佐が登場する巻。
  3. DeepOD xuhongzuo本文で採用した DeepSAD を含む、深層学習ベースの外れ値・異常検知ライブラリ。

Amazonのアソシエイトとして、当サイトは適格販売により収入を得ています。