courseraのmachinelearningコースを一通り学び終えたので、アウトプットを興味のある競艇でやってみました。するために必要なものまず、機械学習を行うために、最低限必要なものは何と言ってもデータです。競艇のデータが公開されてないか探したところ、オフィシャルサイトにデータが置いてありました。データ提供ページhttps://www.boatrace.jp/owpc/pc/extra/data/download.html私が選んだのはこの中の番組表と競走成績です。ダウンロードページへのリンクはなくHTMLを解析してリンクを抽出しなければいけませんでした。下記解析して抽出したそれぞれのリンクになります。番組表http://www1.mbrace.or.jp/od2/B/{YYYYMM}/b{YYMMDD}.lzh競走成績http://www1.mbrace.or.jp/odds2/K/{YYYYMM}/k{YYMMDD}.lzh{YYYYMM}の部分は201804(2018年4月)のように、{YYMMDD}の部分は180401(2018年4月1日)のようにそれぞれダウンロードしたい月、日を指定して下さい。私はpythonのバッチを作成し2012年4月1日〜2018年4月30日までをまとめてダウンロードを行いました。(ダウンロードを行う際はサーバに負荷をかけないように、1リクエスト毎にインターバル数秒お開け下さい)尚、2012年4月1日以前のデータもありますが、2012年4月から持ちペラ制度というかなりレース結果に影響する制度が廃止になりましたので、私は2012年4月1日以降のデータのみを使用しました。競艇は場(開催場所)毎に水面の特徴があり、結果の偏りも変わってきます。平和島競艇場は1号艇が1着になる確率は44.5%程になります。今回は場を1つに絞り(常滑競艇場)機械学習を進めていきました。常滑競艇場を選んだ理由は一番レース数が多く、データ量が一番多かった為です。実際に使用したレース数は15108レースになります。次にオフィシャルサイトから取得したファイルはそのままでは使用できないので、レースデータ、結果の抽出、及びデータの前処理が必要でした。下記が、今回入力データに含めた特徴量になります。データがない場合は1-6の平均値の3.5また、入力データに対する前処理もやってみました。標準化か正規化かどちらを選択するか迷ったんですが、今回は外れ値が存在しないので正規化を選択しました。正規化は下記公式を元にデータのスケールの違いを解消する方法です。$$x’=\frac{x-x_{min}}{x_{max}-x_{min}}$$実際に作成した入力データは特徴量が出場選手分ありますので、入力データの個数は21*6=126個になります。次に、アウトプットのデータですが、一番簡単な単勝を予想してみることにしました。競艇は6人でレースを行いますので、1−6のどれが1位になるのかを予想することになります。出力のパターンとしては下記の6つになります。1号艇が1位になる2号艇が1位になる3号艇が1位になる4号艇が1位になる5号艇が1位になる6号艇が1位になる上記はそれぞれonehot表現にし、最終的なアウトプットデータは下記になります。今回はtensorflowの勉強ということもあり、scikit-learnやkerasは使用せず、tensorflowのみを使用しモデルを作成しました。最適なモデルの隠れ層の数、及びノード数等は分からないので、いくつか試してみることにしました。entropyを用いました。中間層やノードを増やしてもあまり結果に違いは見れないようです。私が検証に選んだ場の1号艇の勝利確率は60%ですので、それ以上は最低は欲しいところなのですが、50%弱と中々厳しい結果となりました。今回は取り急ぎ試してみたかったので、そこまで結果に期待はしてませんでしたが、今後は、選手の得意コースや選手同士の相性、また、選手の性別等のカテゴリカルデータも含めて検証してみたいと思います。っ越し業者、アパレル販売員等を得て、web系のエンジニアに落ち着く。その後海外で3年ほど働き、帰国後日本でエンジニアを行いつつ、フリーランスになる機会を伺っている。