python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...

e83c46137768007bd9bd9fbe82cc426b.png

1f1fe782c8945525d9111735967498e4.png

Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负。
Show me data,用数据说话
今天我们聊一聊 Python预测LOL胜负
目前,英雄联盟S10全球总决赛正在火热进行中,最终决赛于10月31日在浦东足球场举行。作为当下最火热的电竞赛事,这点燃了全球无数玩家的关注,相信没有哪个英雄联盟玩家会错过这场受众超广、影响力超大的国际电竞赛事。LPL究竟能否在家门口拿下第三座世界赛奖杯也成了许多玩家关注的话题。

b92bc316b3d1c43f301c5130ecae8af9.png


对于每场比赛,大家最关注的莫过于最后的胜负了,那么比赛的胜负能否可以预测呢?
今天,我们就分析了5万多场英雄联盟的排名比赛,教你如何用Python预测比赛胜负。

a02625130165742bf5051cc3ce9798ce.png


项目介绍
英雄联盟(LOL)是美国游戏开发商Riot Games(2011年由腾讯收购)开发和发行的一款多人在线战斗竞技游戏。 在游戏中,玩家扮演一个"召唤师"角色,每个召唤师控制一个拥有独特技能的"英雄",并与一组其他玩家或电脑控制的英雄战斗。游戏的目标是摧毁对方的防御塔和基地。 召唤者峡谷是英雄联盟中最受欢迎的地图,在这种地图类型中,两队五名玩家竞争摧毁一个被称为基地的敌人建筑,这个建筑由敌人的队伍和一些防御塔护卫。每个队伍都希望保卫自己的建筑,同时摧毁对方的建筑。这些主要包括:Towers(防御塔):每支队伍总共有11座防御塔
Inhibitor(水晶):每条道有一个水晶
Elemental Drakes/Elder Dragon(大龙/远古龙)
Rift Herald(峡谷先锋)
Baron Nasho(纳什男爵)
Nexus(基地)
英雄联盟最具争议的元素之一,就是其严重的滚雪球效应。许多职业选手接受赛后采访时都提到其输赢都因为“滚雪球”,我们研究各方面各指标的数据,来看这些因素的发展是否真的影响了比赛的成败。 在这个项目中,我们分析了5万多场英雄联盟的排名比赛,并尝试使用决策树算法来根据已有输入属性预测比赛胜负。

313c25a2a7aab2e50b24eec8d9c493c7.png


数据集概述
数据集收集了超过50000个从游戏英雄联盟排位游戏的数据,字段主要包含以下数据:
Game ID:游戏ID Creation Time:创建时间 Game Duration (in seconds):游戏持续时间(秒) Season ID:赛季ID Winner (1=team1, 2=team2):获胜队伍 First Baron, dragon, tower, blood, inhibitor and Rift Herald (1 = team1, 2 = team2, 0 = none):第一条纳什男爵,大龙,塔,一血,水晶,峡谷先锋 Champions and summoner spells for each team (Stored as Riot's champion and summoner spell IDs):每只队伍选择的英雄和召唤术 The number of tower, inhibitor, Baron, dragon and Rift Herald kills each team has:塔,水晶,男爵,大龙和峡谷先锋击杀数 The 5 bans of each team (Again, champion IDs are used):每个队伍的禁用英雄

f40599f34309a76bddd87f7c6c19cbb8.png


数据读入和预览
首先导入所需包和读入数据集。 # 数据整理 import numpy as np import pandas as pd # 可视化 import matplotlib.pyplot as plt import seaborn as sns import plotly as py import plotly.graph_objs as go # 建模 from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import confusion_matrix, classification_report # 读入数据 df = pd.read_csv('./archive/games.csv') df.head()

7852c051f60031f7f19ef0455437e72d.png


df.shape (51490, 61)
数据可视化
我们将分别对影响比赛的相关因素进行如下探索: 1. 目标变量分

82d3031aac4b9afec38d78df7ef1f4b1.png

查看更多精彩图片数据集一共有51490条记录,其中1队获胜的次数为26077次,占比50.6%,2队获胜的次数为25413次,占比49.4%。不存在样本不平衡的情况。 代码 # 饼图 trace0 = go.Pie(labels=df['winner'].value_counts().index, values=df['winner'].value_counts().values, hole=0.5, opacity=0.9, marker=dict(line=dict(color='white', width=1.3)) ) layout = go.Layout(title='目标变量winner分布') data = [trace0] fig = go.Figure(data, layout) py.offline.plot(fig, filename='./html/整体获胜情况分布.html') 2. 游戏时长分布

ea4f4f7e9779b2be04fa9b5995a6cba7.png

查看更多精彩图片从直方图可以看出,游戏时长大致服从正态分布,其中最短的游戏时长为3分钟,3分钟是游戏重开的时间点,最长的游戏时长是79分钟。中间50%的时长在26~36分钟之间。 代码 df['game_duration'] = round(df['gameDuration'] / 60) # 选择数据 x1 = df[ df['winner' ] == 1]['game_duration'] x2 = df[ df['winner' ] == 2]['game_duration'] # 直方图 trace0 = go.Histogram(x=x1, bingroup=25, name='team1', opacity=0.9) trace1 = go.Histogram(x=x2, bingroup=25, name='team2', opacity=0.9) layout = go.Layout(title='比赛游戏时长分布') data = [trace0, trace1] fig = go.Figure(data, layout) py.offline.plot(fig, filename='./html/游戏时长分布.html') 3. 一血对获胜的影响

c2d72511af23916653d8e8cabae943a4.png

查看更多精彩图片获得一血的队伍胜率相对较高,在第一队的比赛中,首先获得一血时的胜率为59.48%,相较未获得一血的比赛高18%。在第二队的比赛中,获得一血时的胜率为58.72%,相较未获得一血的比赛高18%。 代码 plot_bar_horizontal(input_col= 'firstBlood' ,target_col= 'winner' ,title_name= '一血对获胜的影响' ) 4. 一塔对获胜的影响

5b2ddbc410965d81206f9b2e29fdea56.png

查看更多精彩图片从数据来看,第一个防御塔看起来是比较有说服力的指标。在第一队的比赛中,首先摧毁一塔时队伍的胜率高达70.84%,相较未获得一塔的比赛高41.64%。在第二队的比赛中,有相近的数据表现。 代码 plot_bar_horizontal(input_col= 'firstTower' , target_col= 'winner' , title_name= '一塔对获胜的影响' ) 5. 摧毁第一个水晶对获胜的影响

43ddf57659303ff116532d664c8c54ee.png

查看更多精彩图片在比赛中拿到第一座水晶塔的队伍91%的情况下可以获胜,这一点在某种程度上是可以预见的,因为首先摧毁水晶塔代表队伍已经积累的足够的优势,而且水晶塔力量很强大,并且更具有价值。 代码 plot_bar_horizontal(input_col= 'firstInhibitor' ,target_col= 'winner' ,title_name= '摧毁第一个水晶对获胜的影响' ) 6. 击杀第一条男爵对获胜影响

b6ff7e82adf29774a6dabe919489371f.png

查看更多精彩图片统计数据显示,在比赛中击杀第一条男爵有80%的胜率。 plot_bar_horizontal(input_col= 'firstBaron' , target_col= 'winner' , title_name= '击杀第一条男爵对获胜影响' ) 7. 击杀第一条大龙对获胜的影响

3f47da5caece5044e562b690f4f7496e.png

查看更多精彩图片在第一个队伍中,首先击杀第一条大龙的队伍胜率在68.6%,相较未取得优先的比赛胜率高36%。 plot_bar_horizontal(input_col= 'firstDragon' ,target_col= 'winner' ,title_name= '击杀第一条大龙对获胜的影响' ) 8. 击杀第一条峡谷先锋对获胜的影响

7d545848d4a3bb0c175bad16eb7063b4.png

查看更多精彩图片在第一个队伍中,首先击杀第一条峡谷先锋的队伍胜率在69.45%,相较未取得优先的比赛胜率高38.92%。 plot_bar_horizontal(input_col='firstRiftHerald', target_col='winner', title_name='击杀第一条峡谷先锋对获胜的影响') 9. 摧毁防御塔数对获胜影响

42a70992154b0b712509871fb833f338.png

查看更多精彩图片选择第一个队伍的摧毁防御塔数作为影响因素,可以看出,摧毁的防御塔数量越多,获胜的概率越大。当数量大于8个时,胜率大于85%。11个防御塔全部摧毁时的胜率为99.16%,当然也有8.4‰的翻盘概率。 plot_bar_vertical(input_col='t1_towerKills', target_col='winner', title_name='摧毁防御塔数对获胜影响') 10. 摧毁水晶数对获胜影响

a062967917604d25f1a40e88758e4f50.png

查看更多精彩图片摧毁水晶的数目越多,获胜的概率越大。没有摧毁水晶的获胜概率为12.55%,摧毁一个的获胜概率为81.11%,两个为92.38%。 plot_bar_vertical(input_col='t1_inhibitorKills', target_col='winner', title_name='摧毁水晶数对获胜影响') 11. 击杀男爵数对获胜影响

67ed698b7baab7d55c29b8ec30a56e92.png

查看更多精彩图片击杀男爵数越多,获胜的概率越大,击杀5条男爵的数据仅有一条,后续需要删除。 plot_bar_vertical(input_col='t1_baronKills', target_col='winner', title_name='击杀男爵数对获胜影响') 12. 击杀大龙数对获胜影响

1fc04c0ada0bb8cc5aa8771de8ff4434.png

查看更多精彩图片击杀大龙数数越多,获胜的概率越大 plot_bar_vertical(input_col= 't1_dragonKills' , target_col= 'winner' , title_name= '击杀大龙数对获胜影响' )

e3068ee6bb5e7d25f1fb95c3a0711142.png

并筛选建模所需变量。 # 删除时间少于15分钟和分类数较少的记录 df = df[(df['gameDuration']= 900)(df['t1_baronKills'] != 5)] print(df.shape) (50180,62) # 筛选建模变量 df_model = df[['winner', 'firstBlood', 'firstTower', 'firstInhibitor', 'firstBaron', 'firstDragon', 'firstRiftHerald', 't1_towerKills', 't1_inhibitorKills','t1_baronKills', 't1_dragonKills', 't2_towerKills', 't2_inhibitorKills', 't2_baronKills', 't2_dragonKills' ]] df_model.head()

ba6e84e1bb0ed4edc7a94f72720ab8b7.png

采用分层抽样方法划分80%数据为训练集,20%数据为测试集。 # 划分训练集和测试集 x = df_model.drop('winner', axis=1) y = df_model['winner'] X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y, random_state=0) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) (40144, 14) (10036, 14) (40144,) (10036,) 使用决策树算法建模,使用GridSearchCV进行参数调优。 # 参数 parameters = { 'splitter' : ( 'best' , 'random' ), 'criterion' :( 'gini' , 'entropy' ), 'max_depth' :[*range(1, 20, 2)], } # 建立模型 clf = DecisionTreeClassifier(random_state=0) GS = GridSearchCV(clf, parameters, cv=10) GS.fit(X_train, y_train) GridSearchCV(cv= 10 , estimator=DecisionTreeClassifier(random_state= 0 ), param_grid={ 'criterion' : ( 'gini' , 'entropy' ), 'max_depth' : [ 1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ], 'splitter' : ( 'best' , 'random' )}) # 输出最佳得分 print("best score: ", GS.best_score_) print("best param: ", GS.best_params_) bestscore:0.9770077890521407 bestparam:{'criterion':'gini','max_depth':7,'splitter':'best'} #最佳模型 best_clf=DecisionTreeClassifier(criterion="gini",max_depth=7,splitter="best") best_clf.fit(X_train,y_train) print("score:",best_clf.score(X_test,y_test)) score: 0.9799721004384216 使用最优的模型重新评估测试数据集效果: # 输出分类报告 y_pred = best_clf.predict(X_test) cm = confusion_matrix(y_test, y_pred) cr = classification_report(y_test, y_pred) print('Classificationreport:n',cr) Classification report : precision recall f1-score support 1 0 .98 0 .98 0 .98 5077 2 0 .98 0 .98 0 .98 4959 accuracy 0 .98 10036 macro avg 0 .98 0 .98 0 .98 10036 weighted avg 0 .98 0 .98 0 .98 10036 # 热力图 g1 = sns.heatmap(cm, annot= True , fmt= ".1f" , cmap= "flag" , linewidths= 0.2 , cbar= False ) g1.set_ylabel( 'y_true' , fontdict={ 'fontsize' : 15 }) g1.set_xlabel( 'y_pred' , fontdict={ 'fontsize' : 15 }) g1.set_title( 'confusion_matrix' ,fontdict={ 'fontsize' : 15 }) Text( 0.5 , 1 , 'confusion_matrix' )

7a180dd98edbb3237e20505e16bfc34e.png

imp = pd.DataFrame( list (zip(X_train.columns, best_clf.feature_importances_))) imp.columns = [ 'columns' , 'importances' ] imp = imp.sort_values( 'importances' , ascending= False ) imp

da46dadde8ef161f9bbe76c5f67d1c15.png

击杀防御塔数量的重要性最高,其次是水晶摧毁数量、一塔、击杀龙的数量。 以下代码用于输出这颗树: # 可视化 import graphviz from sklearn import tree dot_data = tree.export_graphviz(decision_tree=best_clf, max_depth=3, out_file = None, feature_names = X_train.columns, class_names = ['1', '2'], filled = True, rounded = True ) graph = graphviz.Source(dot_data) graph

7f4bb2c3f4f3a133f200ce4ad5e851ba.png

159b75cddd3bf57fc82b9690ad6e0350.png

打开UC浏览器 查看更多精彩图片模型预测 我们假设: 第一队拿了第一血,第一塔,第一男爵,第一条大龙和第一峡谷先锋,而第二队只拿了第一个水晶。 第一队的塔,水晶,男爵和龙杀死的数量分别是10,2,1,4和塔,水晶,男爵和龙的数量分别是7,2,1,1。 # 新数据 new_data = [[1, 1, 2, 1, 1, 1, 10, 2, 1, 4, 7, 2, 1, 1]] c = best_clf.predict_proba(new_data).reshape(-1, 1) print( "winner is :" , best_clf.predict(x1)) print( "First team win probability is % " , list(c[0] * 100), "nSecond team win probability is %:" ,list(c[1] * 100)) winner is : [ 1 ] First team win probability is % [ 89.87341772151899 ] Second team win probability is %: [ 10.126582278481013 ] 根据模型预测结果,第一队将会获胜,获胜的概率为89.87%。

你想学习python请点关注波妞,带你不迷路。下方免费获取代码质料,成为你想要的python大神:

Python学习教程​g.lgcoder.com
b43f342bd1eeaf2d9013382e36dcca97.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器2003蓝屏A5修复,0x000000a5蓝屏完美解决方法 Win7

0x000000a5蓝屏怎么办?在Win7系统下遭遇开机时出现蓝屏代码0x000000a5非常多,由于根据代码我们并不能分析出故障原因,那么只能求助于网络上大家分享的经验了,下面小编给大家分享下0x000000a5蓝屏完美解决方法,适用于Wi…

能设值多个rowkey吗_顶楼送了露台,悄悄搭建阳光房,偏偏我家露台多个帽子,能拆吗?...

你们有没有发现现在楼顶上都会有几个这样的“帽子",呼呼直转,但大多数人并不是很明白这个东西是干嘛用的。昨天有网友私信:小区顶楼露台上这个不锈钢帽子可以加高吗?感觉每次去楼顶都会闻到一股油烟味。业主表示自己是住在顶…

金山云服务器内网带宽,金山云-文档中心-配置弹性网卡

本文为您介绍绑定弹性网卡后虚机中如何配置弹性网卡。挂载辅网卡后,Windows操作系统主机即可正常使用,不需要额外操作。如果实例使用以下几种镜像,则可以跳过网卡手动配置,直接进行路由配置。CentOS 7.6 64位CentOS 7.7 64位CentO…

Atom飞行手册翻译: 2.7 ~ 2.10

自动补全 如果你仍旧希望节约一些打字时间,Atom自带简单的自动补全功能。 通过使用ctrl-space,自动补全工具可以让你看到并插入可选的完整单词。 通常,自动补全工具会浏览当前打开的整个文档,寻找匹配你开始打出来的单词。 如果你…

Flash游戏开发实战(一)

我不得不承认,我不是植物大战僵尸的骨灰玩家,所以,如果你发现这个系列的教程有什么地方错误的,请告诉我。 定义游戏的主要结构 植物大战僵给了我们很好的视觉和感觉上的享受。你得保护你的房子以免被吃脑的僵尸入侵,这…

如何做相册_手机里的照片太多,不得已只能删除?那就试试制作电子相册吧

许多人都喜欢使用手机拍照,这也就导致自己手机相册中保存的照片越来越多,到后面想要再拍照片的话,就不得不删除之前的照片,如何解决这个办法呢?那就试试用【迅捷视频转换器】将其制作成电子相册吧。制作电子相册打开软…

python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作

导读:为了简化Python编程的学习难度,开发过程中的工具、环境尽量使用同一套,此后所有的编程环境都以Windows系统下Python3.8为准,代码编辑器及IDE(集成开发环境)使用VS Code。目的很简单,就是为了让所有的讲解和学习集…

小程序 ajax 加载,小程序实战-小程序网络请求异步加载

最初看到小程序的网络请求的时候,尤其是演示示例中,userInfoReadyCallback这个函数更是一头雾水。其实并不怎么理解.一直很费解.网上各路大侠都有解释,但是就是,不知道是怎么个顺序,而我也是个对程序执行流程很关注的人,现在把我的心得分享给…

华为手机怎么强制关机_华为忘记锁屏密码怎么办?多品牌手机通用解锁密码

手机忘记登陆密码怎么办?下面小编介绍几种方法,轻松解开那些忘记锁屏密码的手机,第一种方法可能大家还知道,但第二种方法肯定没几个人知道。1、手机原地复活这种方法是可以解决锁屏密码的问题,但也一并把手机上所有的数…

HTML5与搜索引擎优化[转载]

原文:http://lusongsong.com/reed/398.html 我觉得HTML5的兴起完全是因为iPhone和iPad,自从Adobe停止开发flash、Android4.0不支持flash后,我觉得在不久的将来HTML5会广泛应用,而且HTML4已经10年没更新了。 HTML5与HTML4代码结构对…

如何让 zend studio 10 识别 Phalcon语法并且进行语法提示

让 zend studio 10 识别 Phalcon语法并且进行语法提示https://github.com/rogerthomas84/PhalconPHPDoc下载解压后,把里面 phalcon 整个目录复制到 workspace 的C:\Documents and Settings\Administrator\Zend\workspaces\DefaultWorkspace\.metadata\.plugins\org.…

包r语言_R语言入门之寻找你的R包

关于寻找目标R包,一般可以在官网利用关键词搜索即可获得相关信息,不过米老鼠在这里想给大家介绍一个特别的R包,它可以帮助你寻找你想要的理想R包。不过,在正式讲解,我想和大家提醒一下安装R包的注意事项: &…

NOI2011 智能车比赛

SPFA。 我们关键是要找到关键点,包括起点,终点,和相邻矩形接触线段的上端点和下端点(如图有红色圈住的点为关键点)。 我们要做的就是在这些关键点之间连边。 我们把这些关键的点拿出来: 其实就是一些竖直的线段。 除了…

ftp服务器上传文件权限设置,ftp服务器 上传文件权限设置

ftp服务器 上传文件权限设置 内容精选换一换华为云对象存储服务帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用对象存储服务。云数据库RDS服务上的MySQL在使用上有一…

悼念512汶川大地震遇难同胞——一定要记住我爱你

Problem Description当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有些象古人…

获取当前ip_教程丨WIN10系统下设置固定IP或动态IP

无论是电脑、手机或其他一切电子设备,如果需要上网,它就必须有一个IP地址,然后IP地址的获取通常又分为 动态IP(自动获取)或 静态IP(手动设置)两种模式(您所在的网络具体适用哪种模式,请咨询您的网络管理员;目前学校都是…

php实现服务器文件同步,PHPstorm配置同步服务器文件

1、配置服务器一、链接配置服务器打开菜单栏 Tools -> Deployment -> Configurationapp点击 选择 SFTP,并填写相关服务器信息:测试Type:链接类型,这里选择SFTP3dHost:服务器ip地址ormPort:端口&…

oc 实例变量可见度、方法

为什么80%的码农都做不了架构师?>>> ⼀、实例变量可⻅度 public 在类的外部和内部均可访问 protected(默认) 只能在该类和其⼦类内访问 private 只能在该类内访问 ⼆、⽅法(定义、声明、调用&#xff…

使用 js替换网页中的关键词为链接

要求把一段html脚本中的疾病名添加到疾病库的链接&#xff0c;只添加一次&#xff0c;要避开超链接或图片链接。 最初是用的 str.replace(糖尿病, <a href...>糖尿病</a>); 结果找了半天&#xff0c;愣是没找到替换后的效果&#xff0c;原来是有个图片的title中…

凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...

【网络异常及橙色BOSS补偿说明】亲爱的玩家朋友&#xff1a;《凡人修仙传》所有服务器由于网络异常在今晚(12月6日晚)陆续出现了延迟与宕机。对广大玩家造成了影响&#xff0c;我们深表歉意&#xff01;网络异常还对部分大区的橙色BOSS造成了影响&#xff0c;导致活动没有顺利进…