機械学習.vs.乱数

新年おめでとうございます。久しぶりにブログを更新します。どっこい生きてます。
昨年は、たった1回しか更新しませんでした。
今年はブログを書けるくらいのゆとりを持ちたいものです。

さて、昨年までを振り返ると、一部で「サザエさんじゃんけん予想」が話題になったことがありました。
なんでも8割以上の的中率を叩き出した方もおられるとか。
そこまでするには相当の入れ込みが必要でしょうが、ちょっとパソコンで試すだけなら、わりと手軽にできます。
予想の方法はいろいろありますが、私は以下のブログを参考に、scikit-learnという機械学習を試してみました。

* サザエさんのジャンケンの次の手を決定木で予測+可視化してみた
>> http://sucrose.hatenablog.com/entry/2014/11/23/230622

やったことは、上のブログにある通りです。

・パソコン上に Python と scikit-learn を用意する。
・過去のじゃんけんデータを入手する。
・あるじゃんけんの手に対して、過去3回がどんな手だったのかをまとめる。
 例えば、2015/12/20にパーが出たら、その1回前はパー、2回前はグー、3回前はチョキ、
 といった具合に過去3回の手を一覧表(配列)にまとめる。
・「決定木」を使って予測を行う。
 20分割のクロスバリデーション(データの19/20で学習して残りの1/20で評価するのを20回繰り返す)で正解率を評価する。
 決定木の深さを1〜6まで変えて、正解率を調べる。

データは、こちらのサイトから入手しました。
* サザエさんじゃんけん学 >> http://www.asahi-net.or.jp/~tk7m-ari/
「過去の手一覧」ページからじゃんけんデータを取得できます。
(なお、このページには「第7回 91.11.31」という日付の間違いがありました。)

決定木、深さ2の学習結果は、こうなりました。

深さに応じた正解率は、次の通りでした。

深さ正解率
143.1%
244.5%
353.1%
452.2%
550.2%
650.1%

正解率50%ってことは、半分しか当たらないではないか・・・
いやいや、もし何も考えずに手を出したなら 1/3 しか当たらないはずなので、
半分当たるってことは、実はすごいことなのです。

で、ここまできて、ふと疑問が湧いてきました。
全くのランダムを相手に機械学習したなら、正解率はどうがんばっても 1/3 になるはずではないかと。
そこで、サザエさんの代わりに Python組み込みの乱数(random)を相手に機械学習してみたところ、
正解率は予想通り、ほぼ 1/3 となりました。

では、全くの乱数ではなく、円周率を相手にしたらどうなるか。
円周率 3.1415...を3進法に変換し、0=グー、1=チョキ、2=パー、として機械学習させたところ、
正解率はやっぱり 1/3 程度でした。
サザエさんデータが1215件だったので、円周率も同程度の1200件としました。以下、データサイズは全て1200件です。)
円周率には何らかの規則があるだろうと思うのですが、「過去3手を調べる」という方法は通用しないようです。

では、円周率よりもう少し規則性がありそうな数、たとえば√2 = 1.4142...では、どうなるか。
結果は、やはり 1/3 程度。
過去3手を見る限り、円周率も√2も、乱数とほとんど見分けがつきません。

無理数はあきらめて、もう少し規則性がありそうなデータは無いものか。
たとえば文章に出てくる文字列には、何らかの規則性がありそうです。
そこで、Wikipedia の英語版「Randomness」のパラグラフを取り出して、
アルファベット26文字を26進数と見なし、これを3進数に変換しました。
(大文字、小文字は区別せず、, . などの記号は無視しました。)
この英文3進数を機械学習させたところ、結果はやはり 1/3 程度でした。
期待外れです。英文であっても、3進法に変換すると、十分ランダムなようです。

意地でも規則性を見つけたいので、今度はアルファベットの並びを3で割った余りを対戦相手としました。
A=グー、B=チョキ、C=パー、D=グー、E=チョキ、F=パー、... といった具合です。
その結果、正解率は約40%程度となりました。
英語文字列は、そのままの形であれば、ようやく規則性が見えてくる、ということでしょうか。

最後に、自分の手ででたらめに 0,1,2 を並べたデータを作成して、機械学習させてみました。
すると、約60%程度もの正解率となりました。
自分では全くでたらめに打ったつもりでも、実はサザエさん以上のクセが付いていたのです。

規則性がある方から順に並べると、
 手打ちデータ > サザエさん > 英文(単純な余り) > √2 >= 円周率 >= 乱数 >= 英文(3進法)
ということで、
 教訓:「サルがでたらめにキーボードを叩いても、乱数にはならない。」