1. 程式人生 > >用 Python 分析了 1982 場英雄聯盟資料,開局前預測遊戲對局勝負!

用 Python 分析了 1982 場英雄聯盟資料,開局前預測遊戲對局勝負!

640?wx_fmt=gif

640?wx_fmt=jpeg


640?wx_fmt=png

前言


如今,只要隨便進入一個網咖,都會發現玩《英雄聯盟》的人是最多的,可以這麼說,《英雄聯盟》已經是當之無愧的端遊一哥。而在擁有如此基數玩家的《英雄聯盟》,已經不僅僅是一個電競遊戲這麼簡單了,它還帶給了我們無數的歡樂。

問君能有幾多愁,輔助閃現搶人頭;問君能有幾多愁,卡牌千里送人頭。問君能有幾多愁,皇子開大關隊友;清明時節雨紛紛,各種隊友各種坑。別人笑我不買眼,我笑別人浪費錢;孤帆遠影碧空盡,草叢驚現蠻易信 。相見時難別亦難,碰見趙信菊花殘;我自橫刀向天笑,剁人只需用三刀。苦練盲僧千百次, 盲目對戰 N 多次;戰輸不下五十次, 砸得滑鼠要出事;舉杯邀明月,草叢遇蓋倫。

前幾天寫了一篇關於吃雞遊戲的分析用 Python 分析了 1w 場吃雞資料,原來吃雞要這麼玩!幫助小胖提升了吃雞率。鑑於“二百斤靈魂”小胖舍友不僅痴迷於吃雞類遊戲,還非常喜歡 LOL,所以為了幫助他每天儘快拿到首勝,爬取並分析了 1982 餘場 LOL 資料。非常神奇的是,在開局之前能夠高概率的預測本局的勝負!讓你提前做好心理準備。


640?wx_fmt=png

假設


  • 假設沒有王者等大神代玩小號

  • 假設沒有代練

  • 假設沒有因為半途被媳婦抓到而掛機的行為


640?wx_fmt=png

遊戲對戰資料獲取


國服:騰訊遊戲平臺非官方 API —— http://www.games-cube.com/

640?wx_fmt=png

外服:Riot 開發者平臺 API —— https://developer.riotgames.com/

640?wx_fmt=png

連線資料庫:

import numpy as np
import pymysql, random, json

def connect_db(database):
 try:
   conn = pymysql.connect(host='localhost', port=3306, user='root', password='zandaoguang'
, db=database, charset='utf8')
   return conn
 except:
   print ('Exception: MySQL Connection')
   return None


640?wx_fmt=png

分析和訓練資料


利用神經網路(neural_network)、隨機森林(random_forest)和支援向量機(support_vector)等若干智慧演算法進行訓練和迴歸,最終進行比較效果。

下面為神經網路部分程式碼:

from __future__ import print_function
import numpy as np
#np.random.seed(1337)  # for reproducibility
from keras.datasets import mnist
from keras.models import Sequential, load_model
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K
from keras.optimizers import SGD, Adam, RMSprop
import gzip
import sys
from six.moves import cPickle
from fetcher import *

batch_size = 256
nb_classes = 2
nb_epoch = 100

champion_dict = fetch_champion_dict("champion136.json")
champion_num = len(champion_dict)
X_train = X_train.astype('int8')
X_test = X_test.astype('int8')
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()
model.add(Dense(1500, input_dim = champion_num, init='uniform'))
model.add(Activation('sigmoid'))
model.add(Dense(2))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
             optimizer=RMSprop(),
             metrics=['accuracy'])
history = model.fit(X_train, Y_train,
                   batch_size=batch_size, nb_epoch=nb_epoch,
                   verbose=1, validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])


隨機森林程式碼:

from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib
from fetcher import *
champion_dict = fetch_champion_dict("champion136.json")
champion_num = len(champion_dict)
X_train, y_train, X_test, y_test = fetch_one_side_riot('12''MATCHED_GAME''KING_PORO''KINGPORO', ('1492660800000''1493740800000'), champion_dict)
clf = RandomForestClassifier(n_estimators=500, n_jobs=2)
clf.fit(X_train, y_train)
train_score = clf.score(X_train, y_train)
print ("Train Score = "+str(train_score))
test_score = clf.score(X_test, y_test)
print ("Test Score = "+str(test_score))


支援向量機程式碼:

from sklearn.externals import joblib
from sklearn import svm
from fetcher import *
champion_dict = fetch_champion_dict("champion136.json")
champion_num = len(champion_dict)
X_train, y_train, X_test, y_test = fetch_one_side_riot('12''MATCHED_GAME''ARAM_UNRANKED_5x5''ARAM', ('1492660800000''1493740800000'), champion_dict)
clf = svm.SVC()
clf.fit(X_train, y_train)
train_score = clf.score(X_train, y_train)
print ("Train Score = "+str(train_score))
test_score = clf.score(X_test, y_test)
print ("Test Score = "+str(test_score))


640?wx_fmt=png

遊戲對戰勝負預測


根據雙方英雄陣容,預測獲勝方的準確率(%)

作者注:由於阿廣近期沒有玩英雄聯盟,所以分析的資料為 2017 年的遊戲資料。

640?wx_fmt=png

只根據本方英雄陣容,預測本方能否獲勝的準確率(%)

640?wx_fmt=png


640?wx_fmt=png

期望研究的問題


  • LOL 中游戲勝利是否與能性別有關?

  • LOL 的勝率是否和每天的時間段有關係?

  • 在女朋友阻止自己玩遊戲的情況下,LOL 的勝率下降多少?如何解決?

注:由於資料量太小,以後能收集到更多的資料,是希望可以對上面以及更多的方向進行研究。


640?wx_fmt=png

結論


  • LOL 取得最後勝利的三個重要因素為:團隊陣容、團隊水平,配合默契程度。

  • 合理地分配 BUFF 也是遊戲勝利的必要因素。

  • 打遊戲的心態也是遊戲勝利一個不可或缺的條件。


640?wx_fmt=png

寫在最後


雖然我們通過機器學習演算法可以預測這把的輸贏,但是這畢竟不是我們最後的結果。玩英雄聯盟和愛情類似,明明知道是我們不可能,卻堅持去追求,這正是愛的美麗。也許沒有什麼結果,可那過程本身的美麗便足夠用一生去品味。

我有一個兄弟,沉迷這個遊戲耗費了數年光陰,至今二十好幾還流連網咖不返,家人反目。當然遊戲本身是沒有錯的,我也不是責怪遊戲,它本質不過是娛樂,從古至今皆有之,只是形式一直在變化,越來越吸引人。明知道每按一次鍵盤便使自己墮落到更深的深淵,但卻無法阻止雙手伴隨激動的情緒抽動,可悲的人。

極度沉迷遊戲的人啊,把你有限的生命留在無限的遊戲裡吧,那你的靈魂到離開那一刻都是充滿成就的。即使後來新聞報道中會出現一個猝死在網咖被人當成笑話嘲笑的懦夫!

本文為作者投稿,版權歸作者所有。

作者簡介:阿廣,本文首發於個人公眾號「視學演算法」。

「視學演算法」是專注於大資料、人工智慧和演算法的學習平臺,也是一個保送中科院軟體研究所直博生的自留地。人生苦短,我願做您最忠實的技術支援夥伴!一起用程式碼改變世界!


640?wx_fmt=jpeg

推薦閱讀:


薦號



640?wx_fmt=gif

區塊鏈大本營,是區塊鏈開發者的基地,從這裡出發,讓區塊鏈迴歸技術與應用的本質!


640?wx_fmt=png 640?wx_fmt=gif

點選“閱讀原文”,開啟 APP 閱讀更順暢!