Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Shotaro Ishihara

April 17, 2018
Tweet

More Decks by Shotaro Ishihara

Other Decks in Technology

Transcript

  1. None
  2. 目次 2 • 背景&目的 • 分析手法 • 結果&考察 • 結論

  3. 背景 3 http://www.nhk.or.jp/fukayomi/maru/2016/160206.html 大相撲入場者数 80 40 0 (万人) 1994 2011

    2015 (年) 若貴ブーム 84万4000人 八百長問題による人気の凋落 日本人の台頭 76万人
  4. 大相撲八百長問題 • 力士の番付(地位)や給料は勝ち越す と上昇し、負け越すと下降 • 一部力士の間で、勝ち越しに向けた 「星の貸し借り」が横行 背景 4

  5. 多い8勝7敗、少ない7勝8敗 背景 5 Winning Isn’t Everything: Corruption in Sumo Wrestling(2000);

    Mark Duggan, Steven D. Levitt; AMERICAN ECONOMIC REVIEW VOL. 92, NO. 5, pp. 1594-1605 http://pricetheory.uchicago.edu/levitt/Papers/DugganLevitt2002.pdf
  6. 背景 6 0 0.25 0.5 0.75 1 0 1 2

    3 4 5 6 7 8 9 10 11 12 13 14 千秋楽の勝率 14日目までの勝数 14日目までの勝数と、千秋楽の勝率 7勝7敗の力士の勝率の高さ
  7. 14日目までの成績と千秋楽の勝敗には 何らかの関係がある • 星の貸し借り • 当該場所の調子 仮説 7

  8. 14日目までの成績から千秋楽の勝敗 を予測 目的 8 ◦•••◦ ◦•◦•• •◦••? •◦◦◦◦ ••◦•◦ ◦••◦?

  9. 目次 9 • 背景&目的 • 分析手法 • 結果&考察 • 結論

  10. 訓練データ 過去の幕内の取組データで学習 検証データ 最新の2016年9月場所千秋楽の幕内 全取組の勝敗を予想 データセット 10

  11. Webスクレイピング • 大相撲星取表(http://sumo-hositori.com/) からデータを収拾 • pythonのpandasの機能(と大量のif文) を活用 • 平成0~28年のデータを回収 訓練データの作成

    11
  12. 訓練データの作成 12 X[0:13] 力士Aの14日目までの 成績 (勝→1, 負→0) X[14:27] 力士B(対戦相手)の 14日目までの成績

    Y 力士Aの千秋楽の勝敗 全データ:n=4967
  13. 線形分離していない 分類手法 13 赤:勝 青:負 第1主成分 第2主成分 説明変数を主成分分析し2次元化

  14. • 最近傍法 • 非線形SVM • 一般化線形モデル • ランダムフォレスト • Xgboost

    • DNN • 人間(東大相撲部主務・田辺くん) 分類手法 14 Rで実装
  15. • 特徴ベクトル空間で、新規データに 最も近い訓練データのカテゴリを、 新規データのカテゴリとする 最近傍法 15 ? 赤と推定

  16. • RBFカーネル(Gaussianカーネル)を 用いたSVM • カーネル関数を用いた学習法を使い SVMを非線形に拡張 非線形SVM 16 Gaussianカーネル関数

  17. • 任意の分布に当てはめられるよう 拡張した回帰モデル • 二項分布に当てはめ 一般化線形モデル 17

  18. ランダムフォレスト 18 • 決定木ベースのbagging系分類器 • 複数の決定木の結果を合わせる • 訓練データからのランダムサンプリ ングを繰り返し弱識別器を構成

  19. • 高速な勾配Boosting • 逐次的に構築した弱識別器を組み 合わせる • 各段階で勾配降下法を用いてパラ メータを最適化 • 弱識別器には決定木を利用

    Xgboost 19
  20. 誤差逆伝播つき多層パーセプトロン DNN 20 … … … 28 次 元 n=28

    n=10 n=10 0 1 活性化関数:tanh
  21. • 東大相撲部主務に依頼 • 14日目終了後、千秋楽の勝敗を予想 人間 21

  22. 目次 22 • 背景&目的 • 分析手法 • 結果&考察 • 結論

  23. 精度 0.000 0.200 0.400 0.600 0.800 1.000 再現率 適合率 F値

    23
  24. 打ち切り回数の変更 24 人間のF値

  25. 目次 25 • 背景&目的 • 分析手法 • 結果&考察 • 結論

  26. • 14日目までの成績から千秋楽の勝敗 を予測した • 様々な手法を検討した結果、今回は 人間が一番高精度だった • 条件次第ではDNNも人間に劣らない 精度を出し得る 結論

    26
  27. None
  28. 最近傍法 28 for (j in 1:20) { minus <- function(x)

    {return (x - newdata[j, -1])} result <- apply(df[, -1], 1, minus) r = c() for (i in 1:4967) { r = c(r, sum(as.data.frame(result[i]) == 0)) } print(df[which.max(r),1]) }
  29. 非線形SVM 29 library(e1071) x.svm.rbf<-svm(df[, 1]~., df[, 2:29], scale = F)

    out.svm.rbf<-predict(x.svm.rbf, newdata = newdata[, -1])
  30. 一般化線形モデル 30 library(caret) x.glm <- train(data = df, df[, 1]~df[,

    2:29], method = "glm", family = binomial())
  31. ランダムフォレスト 31 library(randomForest) x.Rf <- randomForest(df[, 1]~.,df[, 2:29]) out.rf<-predict(x.rf, newdata

    = df[, 2:29])
  32. Xgboost 32 library(xgboost) library(Matrix) dtrain.mx <- sparse.model.matrix(df[,1]~., df[, 2:29]) dtest.mx

    <- sparse.model.matrix(~., newdata[, 2:29]) dtrain <- xgb.DMatrix(dtrain.mx, label = as.numeric(df[, 1])) dtest <- xgb.DMatrix(dtest.mx) x.gdbt <- xgb.train(params = list(objective='binary:logistic'), data=dtrain, nrounds=25) out.gdbt <- predict(x.gdbt, newdata = dtest)
  33. DNN 33 library(mxnet) train<-data.matrix(df) train.x<-train[,-1] train.y<-as.numeric(train[,1]) test<-data.matrix(newdata[,-1]) 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)
  34. DNN 34 softmax <- mx.symbol.SoftmaxOutput(fc4, name="softmax") devices <- mx.cpu() mx.set.seed(71)

    model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y, ctx=devices, num.round=3000, 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)) preds <- predict(model, test, array.layout = "rowmajor") pred.label <- max.col(t(preds)) - 1