LARS算法探究LOL比赛各数据对胜负的影响

昨天搞完二叉决策树刷了一会儿玩加赛事,发现他们给出了lck,eu,na和入围赛的数据,刚好最近刚学完惩罚线性回归机器学习模型,就着手打算一边学着书上的模型一边用这个职业赛场的数据看看lol比赛背后的输赢定理。

本来打算做各个元素亚龙对比赛胜负的影响分析的,这个分析对研究各赛区风格很有帮助,但是数据包中竟然没有。。。。。。很气,然后想做各个因素对胜负影响谁最大,不过仔细思考了下,有些数据是赛后数据,比如总伤害,总承受伤害,这种东西把它作为输入去推导比赛胜负有点不合理,最后退而求其次,先写个lol比赛胜负影响因素大框架,然后用(击杀,死亡,助攻,补兵,刷野)与胜负关系去测试看看是否可靠就有了这篇文章。

文章地址:玩加赛事数据

1.先把文件格式统一转换为csv格式,然后就可以用csv包去读取了
2.机器学习代码构建,直接附上代码吧

# -*- coding:utf-8 -*-
import csv
import numpy
from math import sqrt
import matplotlib.pyplot as plot

#读取数据xlist是属性,labels是输赢
data=csv.reader(open('LCK summer.csv',encoding='utf-8'))
xlist=[]
labels=[]
usinglist=[2,3,4,12,13]
for row in data:
    #top:1 jug:2 mid:3 ad:4 sup:5
    if row[1]=="3":
        xlist.append([int(row[i]) for i in usinglist])
        labels.append(int(row[0]))

#计算几行几列
nrows=len(xlist)
ncols=len(xlist[1])

#计算均值和方差
xmeans=[]
xsd=[]
for i in range(ncols):
    col=[xlist[j][i] for j in range(nrows)]
    mean=sum(col)/nrows
    xmeans.append(mean)
    coldiff=[(xlist[j][i]-mean) for j in range(nrows)]
    sumsq=sum([coldiff[j]*coldiff[j] for j in range(nrows)])
    stddev=sqrt(sumsq/nrows)
    xsd.append(stddev)

#对数值进行归一化
xnormalized=[]
for i in range(nrows):
    rownormalized=[(xlist[i][j]-xmeans[j])/xsd[j] for j in range(ncols)]
    xnormalized.append(rownormalized)

#对标签进行归一化
meanlabel=sum(labels)/nrows
sdlabel=sqrt(sum([(labels[i]-meanlabel)*(labels[i]-meanlabel) for i in range(nrows)])/nrows)
labelnormalized=[(labels[i]-meanlabel)/sdlabel for i in range(nrows)]

#初始化初始化向量系数β
beta=[0.0]*ncols
#初始化矩阵β的每一步
betamat=[]
betamat.append(list(beta))
#设置走多少步
nsteps=300
#设置每一步系数变化多少
stepsize=0.004

#计算每列与最终结果的关系系数β
for i in range(nsteps):
#计算残差
    residuals=[0.0]*nrows
    for j in range(nrows):
#labelshat=每行的各个标准差*相应β系数后的和(预测标准差)
        labelshat=sum([xnormalized[j][k]*beta[k] for k in range(ncols)])
#residuals是列表,记录每行的实际标准差与预测标准差的差值
        residuals[j]=labelnormalized[j]-labelshat


#通过标准分数和残差值计算列的相关属性
    corr=[0.0]*ncols

    for j in range(ncols):
#corr列表初始化为各列的数值*他所在行的差值后的和再除以行数=各列对残差值减小的贡献数值
#2个属性的关联值=两者归一化的乘积
        corr[j]=sum([xnormalized[k][j]*residuals[k] for k in range(nrows)])/nrows

#寻找刚刚计算的关联值中最大的那一列(正负)
    istar=0
    corrstar=corr[0]

    for j in range(1,(ncols)):
        if abs(corrstar)<abs(corr[j]):
            istar=j
            corrstar=corr[j]
#对残差值减小关联最大的这列β进行增大或减小(corrstar/abs(corrstar)控制正负)
    beta[istar]+=stepsize*corrstar/abs(corrstar)
    betamat.append(list(beta))

#表代表没个属性对结果影响的系数,随着步数增大各个系数趋近准确
for i in range(ncols):
    coefcurve=[betamat[k][i] for k in range(nsteps)]
    plot.plot(range(nsteps),coefcurve,color='b')

print(betamat[300])

plot.xlabel("steps taken")
plot.ylabel(("coefficient values"))
plot.show()

大框架就是这个,后续基本修改下面这段就可以看其他东西了

usinglist=[2,3,4,12,13]
for row in data:
    #top:1 jug:2 mid:3 ad:4 sup:5
    if row[1]=="3":
        xlist.append([int(row[i]) for i in usinglist])
        labels.append(int(row[0]))

首先观测下lck所有位置(击杀,死亡,助攻,补兵,刷野)与胜负的关系
所有:[0.240, -0.392, 0.476, -0.020, 0.008]
mid:[0.176, -0.380, 0.440, -0.100, 0.104]
adc:[0.252, -0.416, 0.424, -0.080, 0.028]
top:[0.260, -0.352, 0.392, -0.072, 0.124]
jug:[0.224, -0.372, 0.476, -0.088, 0.040]
sup:[0.052, -0.412, 0.572, -0.064, 0.068]

all

可以看到不管是什么位置,助攻对胜率的影响都很大,但是1次死亡往往几乎能抵消一次助攻带来的效果,击杀反而影响较小,所有位置中刷兵竟然都带来了微弱的负面效果,刷野带来了只是微弱的正面效果,上面这个分析实在和认识差距过大,想了半天,下面有具体分析

问题分析:
1.所有数据包括胜负关系已经做了归一化处理,但是胜负只是1和0的区分,用这个对数据进行训练是佛会导致数据畸形,后续考虑再写一个基扩展解决这个问题
2.这里做过归一化之后结果就不再是反应数据本身和结果之间的关系了,而是数据之间的差异和结果的关系,换句话说就是补兵这里反应的是各个选手之间补兵的差异与胜负的关系,实际上职业赛场上补兵的差异很小,差距也就几个百分点所有这里的补兵数据不可用。
3.击杀贡献普遍小于助攻贡献,也是上面说的差异性问题,击杀本来就很少,这都是单个人的,但是团队的助攻肯定很多,这就导致了击杀差异非常之小,助攻差异很大,助攻多的说明团队击杀多,从而导致大幅影响比赛输赢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值