藤井四段レーティング予測にベイズ推定を使ってみた
早速ですが、某まとめサイト記事で次のような記述を見つけました(画像をクリックすると読みやすくなります)
以上のように、藤井四段のレーティングは一部の人にとって興味深く、また他のプロ棋士と比較して突出して高い数値を予測する人もいます。せっかくなので私も調べてみました。ベイズ推定を使ったのは初めてですが、個人的には楽しい経験になりました。
前提と予想
まず、将棋界に公式なレーティング指標は存在しません。その代わりに複数の方が非公式レーティングを公開してくれています。今回はhttp://kishi.a.la9.jp/ranking2.html におけるレーティングを予測することにします。現状トップ層は1850後半程度、平均は1550程度です。藤井四段は対局数が十分ではないこともあり、15連勝しても1600程度にとどまります。
- 最尤推定は適していない
例えばhttp://norimune.net/708やPRMLで指摘されているかと思いますが、最尤推定は正確な推定のために膨大なデータを必要とします。藤井四段はプロになってから確認されている対局結果(5/3現在)が公式15, 非公式9であり、これは相当少ないです。また、最尤推定を公式戦のデータのみに適用すると負けデータがないため推定レーティングが無限大に発散してしまいます。したがって、最尤推定で推定するのは危険だと思われます。
ベイズ推定とは
私はしっかり勉強していないので、細かい説明はほかの人に任せることにして、ざっくりとした導入をします。正確性については勘弁してください。
そこで上記の棋士レーティングで考えてみましょう。このとき、「藤井四段のレーティングは、1800・2500が同程度もっともらしい」と言われたとしましょう。どちらを信じますか?
大体の方は1800ですよね。2500はさすがに。。。と考える方が多いと思います。ではこの判断はどこからきたのか?というと事前の情報(=上記の棋士レーティング分布)を既に知っているからです。このような事前情報(事前分布といいます)を考慮に加えたのがベイズ推定というわけです。
やってみた。
細かい準備
ここは読まなくても問題ないです。
事前分布の設定です。これは棋士のレーティング分布を正規分布に当てはめればいいだろう、ということにしました。これは例のレーティングページのソースを見て、これを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 |
上との違いは公式戦連勝と豊島戦の敗戦である。
豊島戦での敗戦はチャラになっているらしい。