kaggle竞赛分享:NFL大数据碗 - 上

竞赛简介

一年一度的NFL大数据碗,今年的预测目标是通过两队球员的静态数据,预测该次进攻推进的码数,并转换为该概率分布;

竞赛链接

https://www.kaggle.com/c/nfl-big-data-bowl-2020

项目链接,该项目代码已经public,大家可以copy下来直接运行

https://www.kaggle.com/holoong9291/nfl-big-data-bowl

github仓库链接,更多做的过程中的一些思考、问题等可以在我的github中看到

https://github.com/NemoHoHaloAi/Competition/tree/master/kaggle/Top61%25-0.01404-zzz-NFL-Big-Data-Bowl

一些基本概念

  • 美式足球:进攻方目的是通过跑动、传球等尽快抵达对方半场,也就是达阵,而防守方的目的则是相反,尽全力去阻止对方的前进以及尽可能断球;
  • 球场长120码(109.728米),宽53码(48.768米),周长是361.992米;
  • 球员:双方场上共22人,进攻方11人,防守方11人,进攻方持球;
  • 进攻机会:进攻方共有四次机会,需要推进至少十码;
  • 进攻方:进攻方的职责是通过四次机会,尽可能的向前推进10码或者达阵,以获得下一个四次机会,否则就需要交出球权;
  • 防守方:防守方则是相反,尽可能的阻止对方前进,如果能够断球那更好,直接球权交换;
  • handoff:传球;
  • snap:发球;
  • 橄榄球基本知识点我了解
  • QB:四分卫,通常是发球后接球的那个人,一般口袋阵的中心,但是也不乏有像拉马尔-杰克逊这样的跑传结合的QB,目前古典QB代表是新英格兰爱国者NE汤姆-布雷迪
  • RB:跑卫,通常发球后进行冲刺、摆脱等,试图接住本方QB的传球后尽可能远的冲刺;

球场码线图

一个常见的开球前站位图

数据字段介绍、绘图分析

字段信息:

  • GameId - a unique game identifier - 比赛ID
  • PlayId - a unique play identifier -
  • Team - home or away - 主场还是客场
  • X - player position along the long axis of the field. See figure below. - 在球场的位置x
  • Y - player position along the short axis of the field. See figure below. - 在球场的位置y
  • S - speed in yards/second - 速度,码/秒
  • A - acceleration in yards/second^2
  • Dis - distance traveled from prior time point, in yards
  • Orientation - orientation of player (deg) 球员面向
  • Dir - angle of player motion (deg) 球员移动方向
  • NflId - a unique identifier of the player - NFL球员ID
  • DisplayName - player's name - 球员名
  • JerseyNumber - jersey number - 球衣号码
  • Season - year of the season
  • YardLine - the yard line of the line of scrimmage
  • Quarter - game quarter (1-5, 5 == overtime) - 当前是第几节比赛,5为加时
  • GameClock - time on the game clock - 比赛时间
  • PossessionTeam - team with possession - 持球方
  • Down - the down (1-4) - 达阵
  • Distance - yards needed for a first down - 距离拿首攻所需距离
  • FieldPosition - which side of the field the play is happening on
  • HomeScoreBeforePlay - home team score before play started - 赛前主队分数
  • VisitorScoreBeforePlay - visitor team score before play started - 赛前客队分数
  • NflIdRusher - the NflId of the rushing player
  • OffenseFormation - offense formation
  • OffensePersonnel - offensive team positional grouping
  • DefendersInTheBox - number of defenders lined up near the line of scrimmage, spanning the width of the offensive line
  • DefensePersonnel - defensive team positional grouping
  • PlayDirection - direction the play is headed
  • TimeHandoff - UTC time of the handoff - 传球时间
  • TimeSnap - UTC time of the snap - 发球时间
  • Yards - the yardage gained on the play (you are predicting this) - 目标
  • PlayerHeight - player height (ft-in) - 球员身高
  • PlayerWeight - player weight (lbs) - 球员体重
  • PlayerBirthDate - birth date (mm/dd/yyyy) - 生日、岁数
  • PlayerCollegeName - where the player attended college - 大学
  • Position - the player's position (the specific role on the field that they typically play) - 场上位置
  • HomeTeamAbbr - home team abbreviation - 主队缩写
  • VisitorTeamAbbr - visitor team abbreviation - 客队缩写
  • Week - week into the season
  • Stadium - stadium where the game is being played - 体育场
  • Location - city where the game is being player - 城市
  • StadiumType - description of the stadium environment - 体育场类型
  • Turf - description of the field surface - 草皮
  • GameWeather - description of the game weather - 比赛天气
  • Temperature - temperature (deg F) - 温度
  • Humidity - humidity - 湿度
  • WindSpeed - wind speed in miles/hour - 风速
  • WindDirection - wind direction - 风向

定义问题

回归预测,Target是码数,但是最终结果需要转换为条件概率分布;

Evaluation Function

Continuous Ranked Probability Score (CRPS);

项目流程分享

定义模型输出结果到概率分布的转换类

这里竞赛需要的并不是具体的码数,而是码数对应的概率分布,也就是所有码数在一次进攻中的概率,所以需要这样一个转换类,如下:

缺失值处理

训练数据上看,缺失情况不严重,缺失字段如下:

这里对缺失的处理根据不同类型的字段采取不同的方式:

  1. 天气相关字段,由于天气具有连续性,因此采用前向填充较为合理:
  2. 体育场类型,严格来说应该是通过baidu、google等去搜索,但是NFL的相关信息baidu搜到的太少,google上看也没找到,所以用取值最多的来填充:
  3. FieldPosition,这个字段的缺失不同于以上两个,通过对数据的分析,它的缺失源于在中线开球时,此时没法明确指出是在哪个半场,所以缺失,这里用一个特别的值来填充,“Middle”;
  4. OffenseFormation,进攻队形,实际缺失了5条,统一用取值最多的来填充即可;
  5. DefendersInTheBox,防守方在混战线附近的人数,通过观察数据可以通过球队、对手、以及防守组成员来填充DefendersInTheBox:
  6. Orientation 球员方位-角度,Dir 球员移动-角度,只有一条缺失,且该球员正常上场了的,应该是技术型缺失,用mean填充即可;

异常、重复等处理

  1. StadiumType:存在不同名但是同意思的情况,这里要整理后归一处理,避免对模型产生干扰;
  2. 存在PossessionTeam既不是HomeTeamAbbr也不是VisitorTeamAbbr,共有120场比赛中出现这种情况;
  3. 草皮字段处理;
  4. Location字段也存在重复含义但是不同值的情况需要归一;

EDA:探索性数据分析

下面是通过matplotlib绘制的一场比赛中的多个进攻防守回合的展示图,黑色三角形是QB,红色是进攻方,淡蓝色是防守方:

可以清楚的看到每次进攻不同的站位,以及整个推进的过程,这里我记录的一份NFL比赛手记,爱国者vs乌鸦,新老QB的正面交锋,非常精彩,可以对照着看一下;

特征工程

这里由于我个人对橄榄球的了解也并不是很多(强推电影弱点),所以特征工程部分做的并不是很好,从结果看Top61%也反映除了这个问题,但是我依然觉得具有一定的参考意义,下面我会分析每个新特征构建的目的,以及我的想法;

  1. WindSpeed,WindDirection:直观看,对比赛影响应该不大,可能存在某些传球手喜欢顺风或者逆风,但是影响应该很小,所以我这里选择丢弃;
  2. PlayerHeight:转为球员身高,身高无疑对比赛是有关系的;
  3. PlayerBirthDate:生日转为岁数,岁数可以表示一个球员的身体状况是否处于巅峰等;
  4. 开球到传球的时间 - (TimeHandoff-TimeSnap):我认为这一时间的长短一定程度上决定了战术的选择,而战术肯定是影响了进攻码数的;
  5. 比赛进行时间 - (15-GameClock+Quarter*15):比赛进行了多久对球员们的体力、战术选择等都有很大影响;
  6. Position_XX:用于统计当前进攻中场上各个角色的人数组成,这也跟战术选择密切关系;
  7. goal区:码线对方半场10码或10码内,此时距离达阵不到10码,一般这种情况下战术选择会变得与之前不太一样,不管是防守方还是进攻方;
  8. 首攻危险:这是我自己定义的,即当目前进攻方仅有一次进攻机会,而所需继续进攻的码数大于5时,我认为是有首攻危险的,此时很可能丢失球权,down为4,且distance大于5;
  9. 距离达阵还有多少码:一般距离的不同,防守方的防守策略会有不同,距离较远一般会较为保守,距离较近则会比较激进;
  10. 其余object特征做label encode处理;

聚合数据并整理聚体统计特征

这里要注意,训练数据每一行表示的是一次进攻中一个球员的情况,我们预测的是每次进攻,因此需要把每22条数据聚合为1条,这个过程中会有一些数据统计特征的产生,下面简介整个流程:

  1. 延迟特征:即每个球员分别在之后0.5s,1s,2s,3s后的位置信息;
  2. 平均特征:分为进攻方和防守方,平均速度、平均加速度、平均身高、平均体重、平均年龄;
  3. 持球人为中心特征:当前、延迟0.5s,1s,2s,3s时,进攻方和防守方球员与他的平均距离;
  4. 持球人为中心特征2:当前、延迟0.5s,1s,2s,3s时,进攻方和防守方球员在持球人3码、5码内的人数估计;

一次进攻的成败,大部分情况下取决于四分卫的发挥,而对其发挥其重要作用的,除了他自己,就是他身边的队友以及对手的数量,这一定程度上影响了他的可选择空间大小;

这一段的处理代码较多,只截取了一部分,如下:

测试数据处理

测试数据处理与训练数据保持一致即可;

建模

到此,数据处理完毕,后续就是建模、调参、combine等优化处理了,这一步我没有花太多精力,模型选择ExtraTreesRegressor,由于其使用了oob,因此不需要CV,结果如下:

最后

大家可以到我的Github上看看有没有其他需要的东西,目前主要是自己做的机器学习项目、Python各种脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:
https://github.com/NemoHoHaloAi

kaggle竞赛分享:NFL大数据碗(上篇)的更多相关文章

  1. 老李分享:大数据框架Hadoop和Spark的异同 1

    老李分享:大数据框架Hadoop和Spark的异同   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  2. 老李分享:大数据测试之HDFS文件系统

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  3. 老李分享:大数据框架Hadoop和Spark的异同

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  4. 老李分享:大数据框架Hadoop和Spark的异同 2

    Spark数据处理速度秒杀MapReduce Spark因为其处理数据的方式不一样,会比MapReduce快上很多.MapReduce是分步对数据进行处理的: ”从集群中读取数据,进行一次处理,将结果 ...

  5. Kaggle大数据竞赛平台入门

    Kaggle大数据竞赛平台入门 大数据竞赛平台,国内主要是天池大数据竞赛和DataCastle,国外主要就是Kaggle.Kaggle是一个数据挖掘的竞赛平台,网站为:https://www.kagg ...

  6. 追本溯源 解析“大数据生态环境”发展现状(CSDN)

    程学旗先生是中科院计算所副总工.研究员.博士生导师.网络科学与技术重点实验室主任.本次程学旗带来了中国大数据生态系统的基础问题方面的内容分享.大数据的发展越来越快,但是对于大数据的认知大都还停留在最初 ...

  7. 大数据学习路线:Zookeeper集群管理与选举

    大数据技术的学习,逐渐成为很多程序员的必修课,因为趋势也是因为自己的职业生涯.在各个技术社区分享交流成为很多人学习的方式,今天很荣幸给我们分享一些大数据基础知识,大家可以一起学习! 1.集群机器监控 ...

  8. 阿里巴巴年薪800k大数据全栈工程师成长记

    大数据全栈工程师一词,最早出现于Facebook工程师Calos Bueno的一篇文章 - Full Stack (需fanqiang).他把全栈工程师定义为对性能影响有着深入理解的技术通才.自那以后 ...

  9. 大数据竞赛平台——Kaggle 入门

    Reference: http://blog.csdn.net/witnessai1/article/details/52612012 Kaggle是一个数据分析的竞赛平台,网址:https://ww ...

随机推荐

  1. linux虚拟机设置固定IP并实现联网,主机与虚拟机实现互ping

    ifconfig eth0 up 启用第一块网卡 onboot=yes 自动启动 service network restart 重启网络服务 使用虚拟机添加一块桥接网卡 cp eth0 eth1 复 ...

  2. 2018-8-10-win10-uwp-进度条-WaveProgressControl

    title author date CreateTime categories win10 uwp 进度条 WaveProgressControl lindexi 2018-08-10 19:16:5 ...

  3. PowerShell 通过 WMI 获取系统安装软件

    本文告诉大家如何通过 WMI 获取系统安装的软件 通过 Win32_Product 可以获取系统安装的软件 Get-WmiObject Win32_Product | Format-List Capt ...

  4. 个人脚手架搭建 -- charmingsong-cli

    个人脚手架搭建 -- charmingsong-cli 目的 为了解决多次构建相同功能的项目,在一定程度上需要定制化以及私有化设置 设计 问题 为什么不用现成的脚手架生成? 如果利用vue或者reac ...

  5. 2018-2-13-wpf-GifBitmapDecoder-解析-gif-格式

    title author date CreateTime categories wpf GifBitmapDecoder 解析 gif 格式 lindexi 2018-2-13 17:23:3 +08 ...

  6. mysql5.7密码修改与报错分析

    1.修改密码 修改密码: vim /etc/my.cnf 的mysqld字段加入skip-grant-tables 重启MySQL,service mysqld restart 终端输入 mysql ...

  7. JSR303 数据检验

    原文:https://blog.csdn.net/qq_28867949/article/category/7370730 一.JSR-303简介 JSR-303 是 JAVA EE 6 中的一项子规 ...

  8. JMeter分布式负载测试(吞吐量控制器)

    在本节中,我们将学习如何使用吞吐量控制器在JMeter中创建分布式负载测试计划. 出于测试目的,我们将在我们网站 www.yiibai.com 的URL下的某些网页上创建分布式负载.这些网页包括: 主 ...

  9. docker 挂载目录挂载不上**

    最近做项目做一个shared Dynamodb, 使用docker挂载一个image,发现怎么都挂载不上, 使用 $ pwd E:\Work\Aws\git\schema\dynamodb\local ...

  10. python类方法、类属性和静态方法

    class Game(object): #类属性 num = 0 #实例方法 def __init__(self): #实例属性 self.name = "laowang" #类方 ...