Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

背景 3 http://www.nhk.or.jp/fukayomi/maru/2016/160206.html 大相撲入場者数 80 40 0 (万人) 1994 2011 2015 (年) 若貴ブーム 84万4000人 八百長問題による人気の凋落 日本人の台頭 76万人

Slide 4

Slide 4 text

大相撲八百長問題 • 力士の番付(地位)や給料は勝ち越す と上昇し、負け越すと下降 • 一部力士の間で、勝ち越しに向けた 「星の貸し借り」が横行 背景 4

Slide 5

Slide 5 text

多い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

Slide 6

Slide 6 text

背景 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敗の力士の勝率の高さ

Slide 7

Slide 7 text

14日目までの成績と千秋楽の勝敗には 何らかの関係がある • 星の貸し借り • 当該場所の調子 仮説 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

訓練データの作成 12 X[0:13] 力士Aの14日目までの 成績 (勝→1, 負→0) X[14:27] 力士B(対戦相手)の 14日目までの成績 Y 力士Aの千秋楽の勝敗 全データ:n=4967

Slide 13

Slide 13 text

線形分離していない 分類手法 13 赤:勝 青:負 第1主成分 第2主成分 説明変数を主成分分析し2次元化

Slide 14

Slide 14 text

• 最近傍法 • 非線形SVM • 一般化線形モデル • ランダムフォレスト • Xgboost • DNN • 人間(東大相撲部主務・田辺くん) 分類手法 14 Rで実装

Slide 15

Slide 15 text

• 特徴ベクトル空間で、新規データに 最も近い訓練データのカテゴリを、 新規データのカテゴリとする 最近傍法 15 ? 赤と推定

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

誤差逆伝播つき多層パーセプトロン DNN 20 … … … 28 次 元 n=28 n=10 n=10 0 1 活性化関数:tanh

Slide 21

Slide 21 text

• 東大相撲部主務に依頼 • 14日目終了後、千秋楽の勝敗を予想 人間 21

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

最近傍法 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]) }

Slide 29

Slide 29 text

非線形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])

Slide 30

Slide 30 text

一般化線形モデル 30 library(caret) x.glm <- train(data = df, df[, 1]~df[, 2:29], method = "glm", family = binomial())

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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)

Slide 33

Slide 33 text

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)

Slide 34

Slide 34 text

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