読者です 読者をやめる 読者になる 読者になる

ディープラーニングで大相撲千秋楽の勝敗を予想してみる

 11月場所で鶴竜が千秋楽前に7場所ぶりの優勝を決めました。
 9月場所の千秋楽前にもこんな記事を書いたのですが、またしても相撲絡みの記事を書きたくなったので書きます。

 今回はアホみたく流行っている「ディープラーニング」を使って、大相撲千秋楽の勝敗を予想してみようという記事です。といっても4層しかないのですが「ディープラーニング」の方が引きが良さそうなのでタイトルに盛り込んでしまいました。

 以下が、今回の目的です。「千秋楽の勝敗は、その場所の14日目までの成績(調子)に依存する部分がある」という仮定を置きました。この仮定のもと、14日目までの成績を入力として、千秋楽の勝敗を予想する分類器を作成します。

f:id:upura:20161126225305p:plain

 下図が、今回作成したディープニューラルネット(DNN)です。

f:id:upura:20161126225842p:plain

 このDNNに訓練データとして過去の幕内の取り組み結果を与えます。データ構造は以下の通りです。

f:id:upura:20161126230137p:plain

 過去の取り組みデータは「大相撲星取表」というサイトから収集しました。データ収集には、pythonのpandasの機能を利用しました。
upura.hatenablog.com

 今回の場合、平成元年~平成28年7月場所までのデータを訓練データとしてDNNに与えました。実装にはRの「mxnet」というライブラリを使っています。以下のサイトを参考にしました。
tjo.hatenablog.com

# Data Import
df <- read.csv("C:/data.csv", header = F)
newdata <- read.csv("C:/newdata.csv", header = F)

library(mxnet)

# Training Data
train <- data.matrix(df)
train.x <- train[,-1]
train.y <- as.numeric(train[,1])

# Test Data
test <- data.matrix(newdata[,-1])

# DNN
data <- mx.symbol.Variable("data")
fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=28)
act1 <- mx.symbol.Activation(fc1, name="tanh1", act_type="tanh")
fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=14)
act2 <- mx.symbol.Activation(fc2, name="tanh2", act_type="tanh")
fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=10)
act3 <- mx.symbol.Activation(fc3, name="tanh3", act_type="tanh")
fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=2)
softmax <- mx.symbol.SoftmaxOutput(fc4, name="softmax")

# Execution
devices <- mx.cpu()
mx.set.seed(71)
model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y, ctx=devices, num.round=4000, array.batch.size=100, learning.rate=0.03, momentum=0.99,  eval.metric=mx.metric.accuracy, initializer=mx.init.uniform(0.5), array.layout = "rowmajor", epoch.end.callback=mx.callback.log.train.metric(100))

# Result
preds <- predict(model, test, array.layout = "rowmajor")
pred.label <- max.col(t(preds)) - 1
pred.label

 さていよいよ学習を終えたDNNを使って、千秋楽の勝敗を予想します。訓練データと同様、14日目までの結果から28次元のベクトルを作成します。これをDNNに入れ、千秋楽の勝敗を予想してもらいます。結果は以下のようになりました。

f:id:upura:20161127000005p:plain

 DNNの結果を見る前に、僭越ながら私も予想をしました。私の予想時には、14日目までの成績以外の情報(過去の対戦成績など)もフル活用しています。ちなみに私は小学校の頃に「わんぱく相撲」で2年連続名古屋市でベスト8になった実績を持つ(隠れた自慢)くらいには昔から相撲を見ています。

 黄色はDNNと私の予想が食い違ったことを示します。意図的かのごとく食い違っていますね。

 ディープラーニングと人間、どちらの予想が正しいか。明日の千秋楽の土俵に注目したいと思います。