How many files(0-15)

競馬の予想システムで一儲を企むおっさんのヨコシマな横顔

お皿が届いた

強羅で、ガラス細工作製の体験コーナーで作った作品が届いた。写真だと分かりづらいけど、ちょっと歪んでたりして中々味のある(負け惜しみ)仕上がり。
色は大体予想していた感じに仕上がっていて、満足。

f:id:taka23kz:20150922122144j:plain


強羅からの帰りに、小田原城に立ち寄ったんだけど、改装中で入れなった。残念。

f:id:taka23kz:20150921144552j:plain

開発合宿

そういえば、ちょっと前の話ですが、これにチームジェントルマンの一員として参加しました。
モバイルナースという人の顔色から体調の状態等を診断しアドバイスするというソフトを作ってみました。完成度的には、chainerを使ったディープラーニング部分の学習が足りずにジョークアプリの域を出なかったのですが、クライアントからサーバまで通して一応動くものが完成し、デモも出来たのでまずまずでした。
結果としては準優勝ということで、優勝に一歩及ばず。一歩とは言え優勝チームのシステムは完成度が非常に高いのでかなり差がある一歩でした。

f:id:taka23kz:20150921005548p:plain


何より、評価されたのはきっとクライアントアプリに搭載されたナースさんなんじゃないかなぁと思っています。何せ、発表者の方が「次回システムでモバイルドクターを作ります。」と言うと、質問で、「ドクターは女医ですか!?」と質問が飛び出してたし、、、


f:id:taka23kz:20150921005834p:plain


何はともあれ、非常に刺激になった3日間でした。運営に携わった関係者、参加者の皆さまに感謝です。

機械学習で競馬予想 其の011 ~パラメータを足してみた~

前回のエントリの反省点を取り込んで見ました。反省点は以下の箇条書きのとおり。

  • パラメータとして(天候による)馬場の状態を追加する。
  • すべてのデータを使うよりも近場のデータ(直近2年分くらい?)を使う。
  • 開催地によってタイムが変わる(馬場の整備状態が違うらしい)のでそこもパラメータとして追加する。


これらをひとつずつ実装していきます。

はじめに、馬場の状態ですが、元データのtsvファイルでは、天候の部分が該当し「晴/稍重」や「曇/重」のような感じで、天気と馬場の状態をスラッシュで区切った形で設定してあります。
このままだと扱いづらいため、tsvファイル上の表現をキーとして、値を1から連番で振って一旦マスタ化しておきます。そして実際のデータ(ソース上ではweather配列)を置換していきます。

weather = horsedata[:,5] # 天候の配列を生成

# 天候/馬場の状態をマスタ化
weatherDict = {"晴/良":1, "晴/稍重":2, "晴/重":3, "晴/不良":4, 
               "曇/良":5, "曇/稍重":6, "曇/重":7, "曇/不良":8,
               "小雨/良":9, "小雨/稍重":10, "小雨/重":11, "小雨/不良":12,
               "雨/良":13, "雨/稍重":14, "雨/重":15, "雨/不良":16,
               "小雪/良":17, "小雪/稍重":18, "小雪/重":19, "小雪/不良":20,
               "雪/良":21, "雪/稍重":22, "雪/重":23, "雪/不良":24
              }

for idx, w in enumerate(weather):
    weather[idx] = weatherDict[w.encode('utf-8')]


次に直近の2年分くらいのデータを有効なデータとして取り扱うために以下のように、元データでyy/mm/ddとなっていた日付データを一旦yymmdd形式にして、基準日と比較し有効データを作成しています。基準日として今回の場合は20130101以降のデータを対象としています。細かい点ですが、日付が1月や1日のように1桁で表現できる場合に元データは前ゼロが付与されていないため、1桁の場合は前ゼロを付与するようにしています。

# 1桁の場合は前ゼロを付与
def addZero(data):
    if len(data) == 2:
        return data
    else:
        return "0" + str(data)

ymd = horsedata[:,0] # 開催日の配列を作成

# 日付データをyymmdd形式にそろえる。
for idx, date in enumerate(ymd):
    aryYmd = date.split("/")
    year = addZero(aryYmd[0])
    month = addZero(aryYmd[1])
    day = addZero(aryYmd[2])
    ymd[idx] = str(year) + str(month) + str(day)

# 古い開催データを除外(2013より古いデータは除去)
z = np.array([idx for idx, i in enumerate(ymd) if np.float32(i) >= np.float32(130101)])
ymd = ymd[z]


最後に開催地を条件として追加したいのですが、ちょっと後々のことを考えて、色々面倒なので、今回は大井競馬場開催のレースデータだけ分析対象するようにしています。なので、厳密には開催地をパラメータにはしていませんのでご注意ください。実装は以下のとおり。

loc = horsedata[:,1]  # 開催地の配列を生成

# 開催地が大井でないものは除外
z = np.array([idx for idx, i in enumerate(loc) if i == u'大井'])
loc = loc[z]


今回は全体のソース貼り付けはありません。
と言うのも、今回紹介した実装では、見苦しいくらいに冗長な実装になったので、次回とその次くらいで、リファクタリングを行い(多少なりとも)綺麗になった全体ソースを貼り付けたいと思います。


実践 機械学習システム

実践 機械学習システム

強羅に来ています。其の2

強羅では佳山水に泊まりました。料理、温泉とも中々素晴らしい。強羅からの送迎もあるので、その辺もGOOD!
事前に口コミとかで調べたときはアクセスがとにかく悪いということだったけど、それほど悪いと感じなかった。

f:id:taka23kz:20150921094906j:plain



強羅までの移動は、箱根湯元から登山鉄道?というので山道を走るのですが、この山道が激しい。
車両の進行方向を切り替えて走るスイッチバックを4度も行ったり、コーナーが最大で30Rもあるので車両を短くし、レールと車輪の間に水を撒いて摩耗を防ぎつつ走っているそうです。
ホントにそこまでして電車を走らせる熱意が凄く唯々脱帽。

高さもあっという間に標高500mを突破するので、高所が苦手な私にとっては玉ヒュンポイントがちょいちょい拝めます。基本は山道なので木々が景色を遮っていて玉ヒュンんポイントが続かないのが個人的には助かる。紫陽花が沢山咲いていたようで梅雨時期なんかはとても綺麗だとおもう。ミシュランガイドではないがそれ自体が旅の目的になる感じです。

f:id:taka23kz:20150921104043j:plainf:id:taka23kz:20150921110055j:plain


で、箱根湯元~強羅間が40分くらいと、確かに時間が掛かるのだけれども、この電車のお陰で時間は退屈はしない。
乗り鉄でなくとも楽しめる列車だと思う。

機械学習で競馬予想 其の010 ~実践してみた~

大井競馬場に行ってきました。
ルールとしては、2015/09/18の第8R~第12Rまでをシステムに1着~4着をタイム順で予想させて、その通りに馬単の馬券を買うというかなり無茶なチャレンジです。
仕事後に競馬場に向かう都合で、10Rからしか実際には馬券を買えませんでした。気になる結果ですが、以下のとおりです。ちなみに、8,9Rは馬券を買った想定なので、実際の収支はありません。あくまでシミュレーションとして記載しています。あと、11Rですが、9頭しか出走馬がいない関係で3頭分の馬券しか買っていません。

8R
予想:3-6-9-12
結果:3-12-8
収支:-1200 + 1840 = +640

9R
予想:2-4-8-14
結果:7-14-4
結果:-1200 

10R
予想:1-2-6-11
結果:13-1-8
結果:-1200 

11R
予想:2-5-8
結果:4-1-7
結果:-600

12R
予想:1-4-5-11
結果:3-11-13
結果:-1200 

トータル収支:-5400 + 640 = -4760
回収率:0.11%

あまりの惨敗さ加減にちょっとゲンナリしますが、はじめなのでこんなもんです。
ちなみにご一緒した方々は単勝3連複3連単をきっちり当てプラス収支になっていました。流石です。

で、勝者と敗者で反省会をさせてもらったのですが、以下のような点を改良していく必要があると感じました。

  • パラメータとして馬場の状態は必要。
  • すべてのデータを使うよりも近場のデータ(直近2年分くらい?)を使う
  • 開催地によってタイムが変わる(馬場の整備状態が違うらしい)のでそこもパラメータとして追加する。

次回以降は、この辺の反省点をシステムに組み込んで、その有効性を検証しようと思います。

f:id:taka23kz:20150920002203j:plainf:id:taka23kz:20150920002208j:plain

強羅に来ています。

シルバーウィークの2日目。湯河原から強羅へ移動。湯河原から電車とバスで3時間くらい。

f:id:taka23kz:20150920151945j:plain


強羅では、ガラス細工を体験できるところを見つけたので、マグカップを作ってみました。(左:作製中、右:完成品)


f:id:taka23kz:20150920144927j:plainf:id:taka23kz:20150920144533j:plain



人気の体験コーナらしく凄い予約が入ってます。私も2時間くらい待ちました。
しかし2時間くらいなら待つ価値があります。モノ作りは楽しい。


f:id:taka23kz:20150920150519j:plain



これは、小鉢。中々きれいに出来ています。完成すると色見が違って見えるそうなので楽しみ。

f:id:taka23kz:20150920150623j:plain

湯河原に来ています。

シルバーウィークなので湯河原温泉に来ています。料理が美味しい。泉質も良いので非常に満足。
何よりシステムづくりが捗ってしょうがない。どうも私の場合は、こういう環境で作業するのがとても向いているようだ。

と書いてて思ったが、どう考えてもスーツ着て革靴を履いて、雑音の中で仕事机に向かっているより、浴衣着て、裸足で川の潺を聞きながら中で作業する方が大抵の人にとって良い環境であるのは間違いないだろう。

そんな環境に来てまでパソコンに向かって何かを作ってるってどうなのか?というのは人それぞれだが、私にとっては趣味なので問題ない。


f:id:taka23kz:20150920002150j:plain

るるぶ箱根 熱海 湯河原 小田原 (国内シリーズ)

るるぶ箱根 熱海 湯河原 小田原 (国内シリーズ)