今天教大家用Python预测英雄联盟比赛胜负。

Show me data,用数据说话

今天我们聊一聊 Python预测LOL胜负

目前,英雄联盟S10全球总决赛正在火热进行中,最终决赛于10月31日在浦东足球场举行。作为当下最火热的电竞赛事,这点燃了全球无数玩家的关注,相信没有哪个英雄联盟玩家会错过这场受众超广、影响力超大的国际电竞赛事。LPL究竟能否在家门口拿下第三座世界赛奖杯也成了许多玩家关注的话题。

对于每场比赛,大家最关注的莫过于最后的胜负了,那么比赛的胜负能否可以预测呢?

今天,我们就分析了5万多场英雄联盟的排名比赛,教你如何用Python预测比赛胜负。

项目介绍

英雄联盟(LOL)是美国游戏开发商Riot Games(2011年由腾讯收购)开发和发行的一款多人在线战斗竞技游戏。

在游戏中,玩家扮演一个"召唤师"角色,每个召唤师控制一个拥有独特技能的"英雄",并与一组其他玩家或电脑控制的英雄战斗。游戏的目标是摧毁对方的防御塔和基地。

召唤者峡谷是英雄联盟中最受欢迎的地图,在这种地图类型中,两队五名玩家竞争摧毁一个被称为基地的敌人建筑,这个建筑由敌人的队伍和一些防御塔护卫。每个队伍都希望保卫自己的建筑,同时摧毁对方的建筑。这些主要包括:Towers(防御塔):每支队伍总共有11座防御塔

Inhibitor(水晶):每条道有一个水晶

Elemental Drakes/Elder Dragon(大龙/远古龙)

Rift Herald(峡谷先锋)

Baron Nasho(纳什男爵)

Nexus(基地)

英雄联盟最具争议的元素之一,就是其严重的滚雪球效应。许多职业选手接受赛后采访时都提到其输赢都因为“滚雪球”,我们研究各方面各指标的数据,来看这些因素的发展是否真的影响了比赛的成败。

在这个项目中,我们分析了5万多场英雄联盟的排名比赛,并尝试使用决策树算法来根据已有输入属性预测比赛胜负。

数据集概述

数据集收集了超过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):每个队伍的禁用英雄

数据读入和预览

首先导入所需包和读入数据集。

# 数据整理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 DecisionTreeClassifierfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.metrics import confusion_matrix, classification_report

# 读入数据df = pd.read_csv('./archive/games.csv')df.head()

ape(51490, 61)

数据可视化

我们将分别对影响比赛的相关因素进行如下探索:

1. 目标变量分布

数据集一共有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. 游戏时长分布

从直方图可以看出,游戏时长大致服从正态分布,其中最短的游戏时长为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. 一血对获胜的影响

获得一血的队伍胜率相对较高,在第一队的比赛中,首先获得一血时的胜率为59.48%,相较未获得一血的比赛高18%。在第二队的比赛中,获得一血时的胜率为58.72%,相较未获得一血的比赛高18%。

代码

plot_bar_horizontal(input_col='firstBlood', target_col='winner', title_name='一血对获胜的影响')

4. 一塔对获胜的影响

从数据来看,第一个防御塔看起来是比较有说服力的指标。在第一队的比赛中,首先摧毁一塔时队伍的胜率高达70.84%,相较未获得一塔的比赛高41.64%。在第二队的比赛中,有相近的数据表现。

代码

plot_bar_horizontal(input_col='firstTower', target_col='winner', title_name='一塔对获胜的影响')

5. 摧毁第一个水晶对获胜的影响

在比赛中拿到第一座水晶塔的队伍91%的情况下可以获胜,这一点在某种程度上是可以预见的,因为首先摧毁水晶塔代表队伍已经积累的足够的优势,而且水晶塔力量很强大,并且更具有价值。

代码

plot_bar_horizontal(input_col='firstInhibitor', target_col='winner', title_name='摧毁第一个水晶对获胜的影响')

6. 击杀第一条男爵对获胜影响

统计数据显示,在比赛中击杀第一条男爵有80%的胜率。

plot_bar_horizontal(input_col='firstBaron', target_col='winner', title_name='击杀第一条男爵对获胜影响')

7. 击杀第一条大龙对获胜的影响

在第一个队伍中,首先击杀第一条大龙的队伍胜率在68.6%,相较未取得优先的比赛胜率高36%。

plot_bar_horizontal(input_col='firstDragon', target_col='winner', title_name='击杀第一条大龙对获胜的影响')

8. 击杀第一条峡谷先锋对获胜的影响

在第一个队伍中,首先击杀第一条峡谷先锋的队伍胜率在69.45%,相较未取得优先的比赛胜率高38.92%。

plot_bar_horizontal(input_col='firstRiftHerald', target_col='winner',                     title_name='击杀第一条峡谷先锋对获胜的影响')

9. 摧毁防御塔数对获胜影响

选择第一个队伍的摧毁防御塔数作为影响因素,可以看出,摧毁的防御塔数量越多,获胜的概率越大。当数量大于8个时,胜率大于85%。11个防御塔全部摧毁时的胜率为99.16%,当然也有8.4‰的翻盘概率。

plot_bar_vertical(input_col='t1_towerKills', target_col='winner', title_name='摧毁防御塔数对获胜影响')

10. 摧毁水晶数对获胜影响

摧毁水晶的数目越多,获胜的概率越大。没有摧毁水晶的获胜概率为12.55%,摧毁一个的获胜概率为81.11%,两个为92.38%。

plot_bar_vertical(input_col='t1_inhibitorKills', target_col='winner', title_name='摧毁水晶数对获胜影响')

11. 击杀男爵数对获胜影响

击杀男爵数越多,获胜的概率越大,击杀5条男爵的数据仅有一条,后续需要删除。

plot_bar_vertical(input_col='t1_baronKills', target_col='winner', title_name='击杀男爵数对获胜影响')

12. 击杀大龙数对获胜影响

击杀大龙数数越多,获胜的概率越大

plot_bar_vertical(input_col='t1_dragonKills', target_col='winner', title_name='击杀大龙数对获胜影响')

数据建模

首先进行初步的清洗,并筛选建模所需变量。

# 删除时间少于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()

然后划分训练集和测试集,采用分层抽样方法划分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_)best score:  0.9770077890521407best param:  {'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('Classification report : \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     10036weighted 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')

# 输出属性重要性imp = pd.DataFrame(list(zip(X_train.columns, best_clf.feature_importances_))) imp.columns = ['columns', 'importances']imp = imp.sort_values('importances', ascending=False)imp

在属性的重要性排序中,击杀防御塔数量的重要性最高,其次是水晶摧毁数量、一塔、击杀龙的数量。

以下代码用于输出这颗树:

# 可视化import graphvizfrom 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

模型预测

我们假设:

第一队拿了第一血,第一塔,第一男爵,第一条大龙和第一峡谷先锋,而第二队只拿了第一个水晶。

第一队的塔,水晶,男爵和龙杀死的数量分别是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%。

喜欢的记得三连哦,需要学习资料的可以私信UP主领取

python 预测足球_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!...相关推荐

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

    Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负. Show me data,用数据说话 今天我们聊一聊 Python预测LOL胜负 目前,英雄联盟S10全球 ...

  2. 利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!

    作者 | 真达.Mika 来源 | CDA数据分析师(ID:cdacdacda) 头图 |  CSDN 下载自东方IC 今天教大家用Python预测英雄联盟比赛胜负. Show me data,用数据 ...

  3. svc预测概率_利用Python高概率预测英雄联盟胜负,分析了1982场才得出的数据!...

    如今,只要随便进入一个网吧,都会发现玩<英雄联盟>的人是最多的,可以这么说,<英雄联盟>已经是当之无愧的端游一哥.而在拥有如此基数玩家的<英雄联盟>,已经不仅仅是一 ...

  4. python模型预测足球_采用 Python 机器学习预测足球比赛结果!买谁赢就谁赢!

    采用 Python 机器学习预测足球比赛结果 足球是世界上最火爆的运动之一,世界杯期间也往往是球迷们最亢奋的时刻.比赛狂欢季除了炸出了熬夜看球的铁杆粉丝,也让足球竞猜也成了大家茶余饭后最热衷的话题.甚 ...

  5. python多元非线性回归_利用Python进行数据分析之多元线性回归案例

    线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量).例如,餐厅根据每天的营业数据(包括菜谱价格.就餐人数.预定人数.特价菜折扣等)预测就餐规 ...

  6. python做线性回归_利用 python 进行线性回归

    利用python进行线性回归 理解什么是线性回归 线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) ...

  7. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

  8. python照片墙地图_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  9. python图色检测_利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...

最新文章

  1. windows域设计best practice
  2. Java反序列化漏洞整理
  3. 4 个使用率非常高的 Linux 监控工具
  4. EOF的意义及用法(while(scanf(“%d“,n) != EOF))
  5. tensorflow教程 开始——数据集:快速了解 tf.data
  6. CodeForces - 520C DNA Alignment(思维)
  7. python生成奇数列表_python3:列出一个不需要迭代的奇数列表
  8. 数据库写入性能测试小工具
  9. potplayer播放器没有声音的解决方案
  10. 用JCreator编写java程序
  11. 单片机c语言串转并的IO实验,74LS164 串入并出实验
  12. 今日头条 ANR 优化实践系列 - Barrier 导致主线程假死
  13. 原生JS自定义6位数密码框
  14. 双线性插值法图像放缩示例
  15. cli sti cld std
  16. 什么是BeautifulSoup
  17. EventBus介绍
  18. 免费使用chatgpt的网站集合:
  19. FP-Growth关联分析算法在网络监控领域的应用
  20. SAP物料主数据创建/修改(MM01/MM02),在 “分类” 页签 输入比较特殊的特征值,例如:希腊字母 “ μ ”,结果却显示 别的英文字符 (例如: “M“)的问题原因及解决方法

热门文章

  1. 10个帮助你快速调试和排错的小技巧
  2. python 画风场 scipy_科学网-Python: 扩展库SciPy-刘洋洋的博文
  3. Monte Carlo概率模型进行分子动力学模拟并计算苯甲醚键值
  4. 【Paper】2021_Robust Near-Optimal Coordination in Uncertain Multiagent Networks With Motion Const
  5. 2021/6/20~22 每天学习python 30分钟 -了解python - python的运算符
  6. 彻底弄懂ICG的基本概念
  7. 记录一次CPLD资源过少、时序伪例的解决办法
  8. 探索Android中的Parcel机制(上) .
  9. 6.Verilog的always语句使用
  10. Tark钱包面向全球招募优秀上币方,千亿财富等你来拿!