查看原文
其他

用Python分析了1982场英雄联盟数据,开局前预测游戏对局胜负!

调皮的阿广 Python大本营 2019-02-15


作者 | 阿广

来源 | 视学算法


前言   


如今,只要随便进入一个网吧,都会发现玩《英雄联盟》的人是最多的,可以这么说,《英雄联盟》已经是当之无愧的端游一哥。而在拥有如此基数玩家的《英雄联盟》,已经不仅仅是一个电竞游戏这么简单了,它还带给了我们无数的欢乐。


问君能有几多愁,辅助闪现抢人头;问君能有几多愁,卡牌千里送人头。问君能有几多愁,皇子开大关队友;清明时节雨纷纷,各种队友各种坑。别人笑我不买眼,我笑别人浪费钱;孤帆远影碧空尽,草丛惊现蛮易信 。相见时难别亦难,碰见赵信菊花残;我自横刀向天笑,剁人只需用三刀。苦练盲僧千百次, 盲目对战N 多次;战输不下五十次, 砸得鼠标要出事;举杯邀明月,草丛遇盖伦。


前几天写了一篇关于吃鸡游戏的分析用Python分析了1w场吃鸡数据,原来吃鸡要这么玩!,帮助小胖提升了吃鸡率。鉴于“二百斤灵魂”小胖舍友不仅痴迷于吃鸡类游戏,还非常喜欢LOL,所以为了帮助他每天尽快拿到首胜,爬取并分析了1982余场LOL数据。非常神奇的是!在开局之前能够高概率的预测本局的胜负!让你提前做好心理准备。


假设


假设没有王者等大神代玩小号

假设没有代练

假设没有因为半途被媳妇抓到而挂机的行为


游戏对战数据获取


国服:腾讯游戏平台非官方API - http://www.games-cube.com/



外服:Riot开发者平台API- https://developer.riotgames.com/



连接数据库:


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


分析和训练数据


利用神经网络(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))


https://github.com/zandaoguang/LOL-aguang


游戏对战胜负预测


根据双方英雄阵容,预测获胜方的准确率(%)


PS:由于阿广近期没有玩英雄联盟,所以分析的数据为2017年的游戏数据。



只根据本方英雄阵容,预测本方能否获胜的准确率(%)



期望研究的问题


  • LOL中游戏胜利是否与能性别有关?


  • LOL的胜率是否和每天的时间段有关系?


  • 在女朋友阻止自己玩游戏的情况下,LOL的胜率下降多少?如何解决?


注:由于数据量太小,以后能收集到更多的数据,是希望可以对上面以及更多的方向进行研究。


结论


  • LOL取得最后胜利的三个重要因素为:团队阵容、团队水平,配合默契度。

  • 合理的分配BUFF也是游戏胜利的必要因素。

  • 打游戏的心态也是游戏胜利一个不可或缺的条件。


阿广说


虽然我们通过机器学习算法可以预测这把的输赢,但是这毕竟不是我们最后的结果。玩英雄联盟和爱情类似,明明知道是我们不可能,却坚持去追求,这正是爱的美丽。也许没有什么结果,可那过程本身的美丽便足够用一生去品味。


我有一个兄弟,沉迷这个游戏耗费了数年光阴,至今二十好几还流连网吧不返,家人反目。当然游戏本身是没有错的,我也不是责怪游戏,它本质不过是娱乐,从古至今皆有之,只是形式一直在变化,越来越吸引人。明知道每按一次键盘便使自己堕落到更深的深渊,但却无法阻止双手伴随激动的情绪抽动,可悲的人。


极度沉迷游戏的人啊,把你有限的生命留在无限的游戏里吧,那你的灵魂到离开那一刻都是充满成就的。即使后来新闻报道中会出现一个猝死在网吧被人当成笑话嘲笑的懦夫!


公开课预告

报名中


扫码报名,参加以下公开课


公开课二:《达观数据个性化推荐系统实践》

直播时间:12月27日晚8点

本次分享带你揭开个性化推荐的神秘面纱,从推荐算法到大型系统架构进行全面剖析。


公开课三:《全双工语音对话以及在智能硬件上的应用》

直播时间:1月17日晚8点

微软小冰全球首席架构师及研发总监周力博士将介绍微软小冰在全双工语音对话方面的最新成果,及其在智能硬件上的应用和未来将面临的更多技术产品挑战。


点击阅读原文,查看往期精彩文章。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存