解析5万多场英雄联盟比赛,教你用python轻松预测比赛胜负。给我数据,用数据说话!今天我们就来说说python预测LOL的胜负。目前,英雄联盟S10全球总决赛正在火热进行中,总决赛将于10月31日在浦东足球场举行。作为当下最火爆的电子竞技赛事,已经点燃了全球无数玩家的眼球。相信没有英雄联盟玩家会错过这项受众面广、影响力大的国际电竞盛会。LPL能否在主场捧起第三座世界冠军奖杯,也成为了很多玩家关心的话题。对于每一场比赛,大家最关注的就是最终的胜负,那么比赛的胜负能不能预测呢?今天,我们分析了50000多场英雄联盟排位赛,教你如何用Python预测比赛胜负。01.项目介绍英雄联盟(LOL)是由美国游戏开发商RiotGames(2011年被腾讯收购)开发并发行的一款多人在线竞技竞技游戏。在游戏中,玩家扮演“召唤师”的角色,每个人控制一个具有独特能力的“英雄”,与一群其他玩家或电脑控制的英雄进行战斗。游戏的目标是摧毁对方的防御塔和基地。Summoner'sRift是英雄联盟中最受欢迎的地图,在这种地图类型中,两支由五名玩家组成的队伍竞争摧毁一个被称为基地的敌方建筑,该建筑由敌方队伍和一些防御塔守卫。每个团队都希望在摧毁对方建筑的同时保卫自己的建筑。这些主要包括:Towers(防御塔):每支队伍总共有11座防御塔Inhibitor(水晶):每条路都有一个水晶ElementalDrakes/ElderDragon(大龙/远古龙)RiftHerald(峡谷先锋)BaronNasho(BaronNash)Nexus(base)英雄联盟最具争议的元素之一是其严重的滚雪球效应。许多职业选手在赛后采访中提到,他们的输赢是因为“滚雪球”。我们研究了各项指标的数据,看看这些因素的发展是否真的影响了游戏的成败。在这个项目中,我们分析了50,000多场英雄联盟排名赛,并尝试使用决策树算法根据给定的输入属性来预测比赛的结果。02.数据集概览数据集收集了英雄联盟排位赛游戏的50000多条数据。字段主要包括以下数据:GameID:游戏IDCreationTime:创建时间GameDuration(inseconds):游戏时长(秒)SeasonID:赛季IDWinner(1=team1,2=team2):获胜队伍第一Baron、dragon、tower、blood、inhibitor和RiftHerald(1=team1,2=team2,0=none):每个团队的第一个BaronNash、Champions和summoner法术(存储为Riot的champion和summoner法术ID):塔、抑制器、男爵、龙和裂谷先驱的杀戮数量每个团队都有:塔、水晶、男爵、男爵和裂谷先驱杀戮每个团队的5个禁令(再次使用冠军ID):每个团队被禁止的英雄03,数据导入和预览首先导入所需的包并读入数据集。数据整理importnumpyasnpimportpandasaspd可视觉化importmatplotlib.pyplotaspltimportseabornassnsimportplotlyaspyimportplotly.graph_objsasgo构建模型fromsklearn.treeimportDecisionTreeClassifierfromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn_remetrics,classification_remetricsconfusion.Inputdatadf=pd.read_csv('./archive/games.csv')df.head()df.shape(51490,61)04.数据可视化我们将探讨影响游戏的相关因素如下:1.The目标变量分布数据集共有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='targetvariablewinnerdistribution')data=[trace0]fig=go.Figure(data,layout)py.offline.plot(fig,filename='./html/OverallWinningDistribution.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']histogramtrace0=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/GameDurationDistribution.html')3。第一滴血对获胜的影响。一血的队伍胜率比较高。59.48%,比没有一血的种族高出18%。在二队比赛中,拿到一血的胜率是58.72%,比没有拿到一血的比赛高出18个百分点。——代码为:plot_bar_horizo??ntal(input_col='firstBlood',target_col='winner',title_name='一血对获胜的影响')4.一塔对获胜的影响从数据上看,第一防御塔看起来是一个更有说服力的指标。在一线队的比赛中,首塔被摧毁时球队的胜率高达70.84%,而无塔的比赛胜率为41.64%。在二队的比赛中,也有类似的数据表现。——代码为:plot_bar_horizo??ntal(input_col='firstTower',target_col='winner',title_name='一塔对获胜的影响')5.破坏第一个水晶对获胜的影响获得游戏中第一个水晶塔91%的队伍获胜,这在一定程度上是可以预见的,因为先摧毁塔代表团队已经积累了足够的优势,而塔更强大更有价值。——代码为:plot_bar_horizo??ntal(input_col='firstInhibitor',target_col='winner',title_name='破坏第一个水晶对获胜的影响')6.击杀第一个男爵获胜的统计显示,在游戏中击杀第一个男爵有80%的胜率。plot_bar_horizo??ntal(input_col='firstBaron',target_col='winner',title_name='杀死第一个男爵对获胜的影响')7.杀死第一个男爵的队伍赢得68.6%的比赛,比没有获得优先权的队伍多36%。plot_bar_horizo??ntal(input_col='firstDragon',target_col='winner',title_name='击杀第一条龙对获胜的影响')8.击杀第一条峡谷先锋对获胜的影响在第一队中,率先击杀第一个峡谷先锋的队伍为69.45%,比无优先级的游戏高出38.92%。plot_bar_horizo??ntal(input_col='firstRiftHerald',target_col='winner',title_name='击杀第一个RiftHerald对获胜的影响')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.杀死男爵的数量对获胜有影响杀死的男爵越多,获胜的概率越大winning,killing5男爵数据只有一条,后面需要删除。plot_bar_vertical(input_col='t1_baronKills',target_col='winner',title_name='击杀男爵数量对获胜的影响')12.击杀男爵数量对获胜的影响击杀男爵越多,获胜概率越大winningplot_bar_vertical(input_col='t1_dragonKills',target_col='winner',title_name='杀死龙的数量对获胜的影响')05.首先清洗数据建模,筛选建模所需的变量。删除小于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调参.参数={'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={'标准':('gini','entropy'),'max_depth':[1,3,5,7,9,11,13,15,17,19],'splitter':('best','random')})输出最好成绩print("bestscore:",GS.best_score_)print("bestparam:",GS.best_params_)bestscore:0.9770077890521407bestparam:{'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('分类报告:n',cr)C套件报告:精确召回F1得分支持10.980.980.980.98507720.980.980.980.984959accuracy0.9810036macroavg0.980.980.980.980.980.9810036权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在属性的重要性排序中,被击杀的塔数最重要,其次是Numberof水晶被摧毁,一座塔,被杀死的龙的数量以下代码用于输出此树:Visualimportgraphvizfromsklearnimporttreedot_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)graph06.模型预测我们假设:一队拿一血,一塔,一男爵,一龙,一峡谷先锋,而二队只拿一水晶。第一队击杀的塔、水晶、男爵、龙的数量分别为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("获胜者为:",best_clf.predict(x1))print("第一队获胜概率为%",list(c[0]*100),"n第二队获胜概率为%:",list(c[1]*100))获胜者为:[1]第一队获胜概率为%[89.87341772151899]第二队获胜概率为%:[10.126582278481013]根据模型预测结果,第一队获胜概率为89.87%.
