機械学習でサザエさんと本気でじゃんけんしてみた②

本記事では機械学習の手法を用いてサザエさんのじゃんけんの手を予測します前回の記事もご覧ください。
r-std.hatenablog.com

今回の記事では2017年までのサザエさんのじゃんけんの手のデータに基づき、2018年のじゃんけんの手を予測します。予測手法を前回からさらに高度化しサザエさんのじゃんけんの手の予測に重要な変数を特定します

1.予測をさらに精緻化してみる

1-1.変数の追加

前回から次の2つのデータの追加を行います。
サザエさん4回前に出した手
直近で出たタイミングが最も古い手
なお、直近で出たタイミングが最も古い手については、サザエさんじゃんけん研究所の公式サイトでも「最大間隔法」として利用されており、有効性が確認されている情報と言えます。

 

今回予測に用いる変数は下記のとおりとなります。
X:サザエさんの出した手
X1:サザエさんが1回前に出した手
X2:サザエさんが2回前に出した手
X3:サザエさんが3回前に出した手
X4:サザエさんが4回前に出した手
Q:四半期初の場合は1、2、3、4、それ以外は0
Grate:グーチョキパーが四半期内で均等に出る前提でのグーの出やすさ
Crate:グーチョキパーが四半期内で均等に出る前提でのチョキの出やすさ
Prate:グーチョキパーが四半期内で均等に出る前提でのパーの出やすさ
last:直近で出たタイミングが最も古い手

使用したデータは下記リンク先の通りです。
github.com

 

1-2.勝ち負けの重みづけ

今回は予測の際に負ける確率も織り込むことを検討します。

例えば、グーチョキパーが下記のような確率で出されると予測される場合、どの手を出すのが最も合理的でしょう?
f:id:r_std:20181226030146p:plain
勝つ確率を最大限高めるのであれば40%出ると予想されるグーに対応してパーを出すのが正着ですが、この場合チョキを出されて負ける確率も39%という高い確率になってしまいます。負けの確率も考慮すると、チョキに勝つ確率(39%)とパーに負ける確率(21%)の差が大きい、グーを出す戦略が最適と考えられます。

従来の予測では勝つ確率のみに注目しており、負ける確率については無視していました。今回はPenalty Matrixを使用することで、負ける確率も考慮した予測を試みます。
使用するPenalty Matrixは次の通りです。行は実現値、列は予想値に対応します。例えば行がC、列がGの場合(予想ではグーだと思っていてパーを出したところ、実際にはチョキが出て負けるケース)は2の値をとることになり、予想が外れて負けたときにはペナルティが倍になるようにパラメータ設定をします。

  C G P
C 0 2 1
G 1 0 2
P 2 1 0

2.重要度の高い特徴量を明らかにする

2-1.決定木を使ってみる

結果の解釈が分かりやすい決定木モデルを使って予測を試みます。パラメータをざっくり調整すると、次のように分類できることができました。
f:id:r_std:20181226043231p:plain
直近で出たタイミングが最も古い手の情報四半期初回フラグの2つだけで分類していることがわかります。

最も出ていない手がチョキの場合はチョキを、最も出ていない手がグーの場合は、四半期初回であればチョキを、そうでなければグーを予想します。最も出ていない手がパー場合はパーを予想します。

なお、決定木を用いて2018年の手を予想した結果は次の通りです。(行は実現値、列は予想値に対応します。)

  C G P
C 11 1 6
G 4 9 4
P 4 0 10

49戦30勝9敗10引分け(勝率61.2%、負け率18.3%)

2-2.ランダムフォレストを使ってみる

RのrandomForestパッケージでは、重要度の高い特徴量を特定するのに下記の2手法を使うことが可能です。

MeanDecreaseAccuracy
MeanDecreaseGini

前者はある特徴量をランダムにシャッフルした際の評価、後者はエントロピー(不純度)による評価が基準となっています。

こちらのサイトによるとMeanDecreaseGiniは、カテゴリーデータと連続データが混ざった場合にバイアスが生じてしまうようです。また、変数間で相関関係がある場合、MeanDecreaseGiniもMeanDecreaseAccuracyも重要度を正しく評価できない欠点があるようです。

2018年のデータに対して、それぞれを算出すると次の通りとなりました。
f:id:r_std:20181226050222p:plain
f:id:r_std:20181226063714p:plain
2手法のそれぞれで重要度が高いとされる特徴量が異なる点が気になりますが、MeanDecreaseAccuracyでは決定木と同じように、直近で出たタイミングが最も古い手の情報と四半期初回フラグの2つが重要であることが示されています。

また、決定木と同様にPenalty Matrixを使用したところ、下記の結果を得られることができました。(行は実現値、列は予想値に対応します。)

  C G P
C 11 2 5
G 2 10 5
P 3 0 11

49戦32勝10敗7引分け(勝率65.3%、負け率20.4%)

3.2018年の結論

  1. サザエさんのじゃんけんで次の週の手を予測するには、①四半期初回フラグ②直近で出たタイミングが最も古い手の情報の2つが重要である
  2. 勝ち負けの重みづけ評価をしたrandomForestモデルでは、勝率65.3%を達成し、負け率も20.4%と低く抑えることができた。
  3. randomForestの特徴量の重要度と決定境界の評価については、さらなる分析が必要

4.2018年の分析の感想

予測を精緻化させるのには多くの手作業が必要になりました。四半期初回フラグや直近で出たタイミングが最も古い手などの一部の情報については、人間が手作業でフラグを追加しない限り、機械学習で変数として認識することは難しいように思われます。
囲碁のような完全情報ゲームでは試行錯誤を通じてAIを成長させることが可能と思われますが、サザエさんのじゃんけんのようなさまざまな特殊要素が絡む不完全情報ゲームでは、仮説を立てて検証する人間の力がどうしても必要になると考えます。
予測結果の説明可能性についても、特徴量の重要度や決定境界を論理的に裏付けるのは非常に困難であると感じました。今回は用いませんでしたが、DeepLearningなどより複雑な手法を選択する場合には、さらに説明困難になると思われます。

使用したソースコードは次の通りです。

sze2018.R