tokoharuの落書き帳

らくがきですよ

藤井四段レーティング予測にベイズ推定を使ってみた

早速ですが、某まとめサイト記事で次のような記述を見つけました(画像をクリックすると読みやすくなります)

f:id:tokoharu-sakura:20170503130444p:plain
f:id:tokoharu-sakura:20170503130448p:plain

以上のように、藤井四段のレーティングは一部の人にとって興味深く、また他のプロ棋士と比較して突出して高い数値を予測する人もいます。せっかくなので私も調べてみました。ベイズ推定を使ったのは初めてですが、個人的には楽しい経験になりました。

前提と予想

まず、将棋界に公式なレーティング指標は存在しません。その代わりに複数の方が非公式レーティングを公開してくれています。今回はhttp://kishi.a.la9.jp/ranking2.html におけるレーティングを予測することにします。現状トップ層は1850後半程度、平均は1550程度です。藤井四段は対局数が十分ではないこともあり、15連勝しても1600程度にとどまります。

例えばhttp://norimune.net/708PRMLで指摘されているかと思いますが、最尤推定は正確な推定のために膨大なデータを必要とします。藤井四段はプロになってから確認されている対局結果(5/3現在)が公式15, 非公式9であり、これは相当少ないです。また、最尤推定を公式戦のデータのみに適用すると負けデータがないため推定レーティングが無限大に発散してしまいます。したがって、最尤推定で推定するのは危険だと思われます。

ベイズ推定とは

私はしっかり勉強していないので、細かい説明はほかの人に任せることにして、ざっくりとした導入をします。正確性については勘弁してください。

そこで上記の棋士レーティングで考えてみましょう。このとき、「藤井四段のレーティングは、1800・2500が同程度もっともらしい」と言われたとしましょう。どちらを信じますか?

大体の方は1800ですよね。2500はさすがに。。。と考える方が多いと思います。ではこの判断はどこからきたのか?というと事前の情報(=上記の棋士レーティング分布)を既に知っているからです。このような事前情報(事前分布といいます)を考慮に加えたのがベイズ推定というわけです。

やってみた。

Pythonの練習もしたいのでPythonで実装しました。

細かい準備

ここは読まなくても問題ないです。

事前分布の設定です。これは棋士レーティング分布を正規分布に当てはめればいいだろう、ということにしました。これは例のレーティングページのソースを見て、これをLinux系のファイル操作で適当に処理してデータを整形します。次のような感じです。

$ cut -d '>' -f 9 rating.txt | cut -d '<' -f 1 | grep '[0-9]' | sed -e "s/\$/,/" > rating_arranged.txt

grep奨励会員などの行で起きる空行を詰めるために行い、sedは単にカンマをつけるだけです。これはpythonの配列にそのまま書き込みたいためです。

正規分布へのフィッティングは scipy.statsのnormを用いました。
norm.fit(kishi_rating)の結果は
(1550.9578313253012, 149.3638862341212)でした。

細かい設定

最尤推定ベイズ推定の事前分布を一様分布にすることと等価なので、ベイズ推定をするプログラムを作れば十分です。

また、対戦相手のレーティングは対戦直後のレートを使いました。ただし2015年度以前のデータは失われてしまったようなので、場合によって2016年度の初期値を使用しました。藤井四段の非公式戦の対戦相手は現在(2017/5/2)のレーティングを使用しました。

近藤誠也五段のデータで最尤推定ベイズ推定を比較

最尤推定よりベイズ推定の方がいいでしょう、と言い続けていますが、本当によい推定法かは過去のデータでチェックする必要があります。
そこで藤井四段の一年前にプロ入りし、特に王将戦で勝ち続けて王将リーグ入りした近藤五段のプロ入り直後15戦のデータをもとにそれぞれ推定させました。

結果:

分位 0.1 0.25 0.5 0.75 0.9
最尤推定 1650 1716 1795 1880 1964
ベイズ推定 1593 1645 1702 1762 1817
ベイズ(25戦) 1629 1672 1720 1769 1814

実際 : http://kishi.a.la9.jp/2016R/1303.html ここにある通り、2016年度後半は1600代後半から1700ちょうどで推移した。

わかること:
最尤推定の予想は1716~1880ということでかなり高い数値を示しており、実際より高い予測を出す傾向にあった。この点でベイズ推定の方が正確な予想をしていそうだとわかる(少し高めぐらいか?)。

留意点:もしベイズ推定の方が優れているとしっかり示すなら、ほかのプロ棋士でも同様のことをチェックするべきだが、大変なので近藤五段に限ることにする。

藤井聡太四段のレーティング予測

本題に入ります。近藤五段の結果でおそらく正確な値を出しやすそうと判断した、上述のベイズ推定を使いました。

分位 0.1 0.25 0.5 0.75 0.9
公式戦のみ(15戦) 1710 1767 1833 1902 1967
非公式戦追加(15+9戦) 1789 1836 1890 1946 1998


現状のレーティング(30位 : 1706, 20位 : 1746, 10位 : 1799)を勘定に入れれば、公式戦の結果だけでも少なく見積もって30位、炎の七番勝負を勘案するとトップ10入りは十分にありえるという結果になりました。そして中央値が驚きで、この予測が正しいなら驚きです。
この結果は高すぎるのかどうか、数か月後が気になるところです。


おまけ(最尤推定

分位 0.1 0.25 0.5 0.75 0.9
非公式戦追加(15+9戦) 1934 2005 2093 2191 2290

やはり最尤推定は高く出すぎな感じがします。最初の某まとめ記事の結果とも近い部分があります。
個人的には2000~2200というのは拒否感の方が大きいです。

コード : GitHub - tokoharu/predict_rating


議論

  • 事前分布は妥当か?

やはり近藤五段のベイズ推定の結果も気持ち高めに出ているような気がする。
原因を求めるとするならば、今回は事前分布として「プロ棋士全員のレーティング分布を正規分布にフィッティングしたもの」を選んだが、この分布の裾が軽すぎたのかもしれない、とも考えられる。そこで少し裾を重くするために (分散) = 15000程度に抑えてみる。

これをチェックするために高野四段と佐々木大地四段の最初15戦のデータも加えてみた。

分位 0.1 0.25 0.5 0.75 0.9 現在
佐々木四段 1520 1566 1617 1668 1715 1586
高野四段 1416 1462 1514 1566 1612 1521
近藤五段 1580 1627 1681 1735 1785 1699
近藤五段(25戦) 1617 1657 1702 1748 1790 1699
藤井四段(公式のみ) 1675 1726 1784 1843 1899 (将来)
藤井四段(非公式込) 1756 1799 1848 1898 1945 (将来)

なんとなくであるが、前者3名は0.5分位点に近いレーティング値をとっているように思える。そのため、こちらの予測の方が信頼できるかもしれない。また、裾が重くなったため、藤井四段の予測レーティングは本編で紹介したものよりもおよそ40下がった。

これがより妥当かどうかはもう少しまじめに調べないとわからないだろうと思う。
そもそも正規分布も妥当でないかもしれない。

追記

現状一番妥当な(分散)=15000のバージョンで現状の結果を上げる

分位 0.1 0.25 0.5 0.75 0.9
藤井四段(非公式込, 6/4現在) 1777 1818 1863 1910 1953

上との違いは公式戦連勝と豊島戦の敗戦である。
豊島戦での敗戦はチャラになっているらしい。


まとめ

  • 藤井四段のレーティング予測をベイズでやってみた。
  • 近藤五段の結果からベイズ推定の方が比較的まともそうな予測を出すことが分かった。
  • 予測は予測でしかないので、今後の藤井四段にも注目ですね!

◎もし間違いなどありましたらお教えください。