全文共4004字,预计学习时长8分钟

来源:Pexels

近年来,交通事故频繁发生。如果你和笔者一样常年居住在大都市,那么可能你也听说过,或是亲眼见到过事故现场,甚至曾卷入到某次交通事故中去。由于发生频率极高,交通事故一直是全世界人类致死的主要原因,每年夺走约数百万人的生命。因此,及时开发一种能够预测交通事故以及识别事故频发路段的系统,将能够挽救更多的生命。

预测交通事故的确困难重重,但也并非毫无可能性。交通事故的发生并不是完全随机的,而是受到多种因素影响,比如驾驶员的身体状况、车型、车速、交通状况、道路结构和天气。因此,通过研究交通事故历史记录,分析上述因素与交通事故之间潜在的因果关系,有助于据此创建事故预测器。

幸运的是,许多交通事故记录都公开发布。例如,英国政府就公开了2002年以来全国交通事故的详细记录。因此,基于这一数据集,笔者同自己的团队共同创建并安装了一个机器学习模型,该模型能够准确预测在大伦敦区何时何地可能会发生交通事故。

在这篇文章中,笔者将介绍该项目整个完成过程。并且,该项目的所有代码都已上传至GitHub代码库,具体模型也可以从该网站获取到。

【道路交通事故】——在该项目中,笔者团队创建了一个机器学习模型,用以预测不同地区交通事故的发生概率。

kteo7.pythonanywhere.com

获取经验的方式:目标

在正式着手项目之前,笔者团队设定了一个明确的目标:创建一个便于大众使用的交互式交通事故预测器。实现这一目标的最佳方式就是部署已训练的预测器至网站,并且该预测器网站将能够完成以下任务:

  • 允许用户输入其出发地和目的地(都必须在大伦敦区范围内),并且帮助用户找到两地间最优驾驶路线。
  • 允许用户自行挑选出行日期和具体时间,并且帮助用户识别出在已选时间范围内,该路线上的事故频发路段。

实现这一目标的具体步骤如下图所示,后文将对其进行详细阐述。

项目步骤

数据收集

设定具体目标后,需要继续收集相关数据。笔者团队最终选择了以下两个数据集。

Kaggle

本项目主要使用的数据集是由英国政府官方发布的一份交通事故详细记录,储存于Kaggle平台。该数据集包含2000年至2014年间发生于英国约160万起交通事故的详细记录。并且,该数据集主要分为33个板块,每个板块分别记录了事故的具体细节,比如事故时间、地点、严重程度,以及当时的天气与交通状况等。在该项目中,笔者团队主要对2012年至2014年间发生于英国大伦敦区的交通事故进行分析研究。

Dark Sky

在道路交通事故中,天气状况是极其重要的影响因素。虽然上文提到的Kaggle数据集也包含气象信息,但是这些信息仍然不足以支撑该项目的进行。因为在使用Kaggle数据集中weather_condition一栏的信息时,存在两个问题:

  • 第一,它假定天气在一天中稳定不变。但是如果真正去过伦敦就会发现,这个假设并不符合实际情况,因为伦敦天气变化异常频繁。
  • 第二,它只包含天气情况的历史记录。但是,为了利用weather_condition栏的信息来预测还未发生的事故,则需要找到一种方法来对天气进行预测。

因此,笔者团队决定充分利用Dark Sky上提供的气象信息,Dark Sky是美国一家专门从事天气预报的公司。Dark Sky不仅提供以往的天气信息,而且还会预测未来的天气状况,因此,这也正好能在最大程度上帮助到该项目的进行。

数据处理

DBSCAN聚类算法

在研究数据集后,会发现伦敦几乎每一条街道都曾是事故地点。的确如此,因为在伦敦这样一个大都市,大大小小的交通事故时有发生。以下这幅图是通过Tableau创建,图中标红的事故地点分布于一张伦敦地图之上。从下图大家可能会惊讶地发现,整个城市处于一片“红海”之中。

上图是一幅伦敦城区地图,图中每一个红点表示2012年至2014年间发生的某起交通事故。显而易见,伦敦的交通事故极其频繁(至少以前是这样的)。

虽然在整个城区都曾发生过交通事故,但是某些区域的事故概率显然要高于其他地区。为了系统找出事故频发路段,于是将上图中的事故地点划分为簇类。并且,如果在2012至2014年这两年间,某一25米路段内发生了至少14次交通事故,那么就将这一路段定义为一簇。

之所以应用DBSCAN聚类算法来对簇类进行划分,主要是因为其速度较快,并且能够找到任意形状的簇类和识别噪声点。

处于簇类以外的事故地点被视为噪声点,因此需要将其从后续分析中剔除。

DBSCAN 聚类算法原理展示图

最后,DBSCAN聚类算法能够成功识别出473处事故频发路段。以下这幅图通过应用地理分析软件ArcGIS,对所有的热点路段进行了可视化处理。从图中可以看出,事故频发路段主要集中于伦敦各大主干道,比如A11和A13。

伦敦事故频发路段图

负采样

在这一阶段,已经得到了数百个事故频发路段。但是,此时需要澄清的一点是,这些热点路段的事故概率也并非100%。例如,就伦敦城区主干道上的事故频发路段而言,仅在交通高峰期事故风险偏高,平常时间段还是相对安全。另一方面,在急转弯路段,如果天气晴朗,那么也不会有太大问题;但要是碰上雨雪天气,那么也有可能变成死亡路段。

因此,接下来的任务就是要找出,在何种情况下这些热点会被“激活”。这样一来,这一项目就变成了一个经典的二元分类问题,即需要找出能够“激活”热点的因素组合,例如天气、时间等。

然而,目前所收集到的数据仍然不足以创建一个分类模型。训练分类器既需要正样本,又需要负样本,但是目前只有正样本,即is_accident目标词是1的记录。因此,还需要一种方法来产生负样本,即“非事故”记录。

之前也讲到过,能够使用正样本来生成负样本,并且这一方法由Yuan等人提出。本质上来说,这一方法需要为簇中每一个正样本随机生成三个负样本。例如,如果某一簇位于Abbey Road,并且该路段曾发生过15起交通事故,那么需要为这一路段随机合成45个“非事故”记录。除了地点,其他有关于负样本的预测性特征也需要随机挑选,比如“非事故”事件的时间、地点等。需要注意的是,随机生成的负样本不能与实际的正样本相匹配。

探索与观察

在探索已清理的数据集后,笔者团队进行了几个有趣的观察。因此,下文将对观察发现进行详细阐述。

一年中哪个月份发生的交通事故最多?

通过以上这幅热图,可以了解到一年中每个月份以及一周中每天发生交通事故的次数。仔细观察后会发现,九月至十二月交通事故发生频率较高。因为在这段时间伦敦是秋天,气温较低,多雾多雨。但是出乎预料的是,在一二月这种寒冷的冬季月份中,交通事故反而很少发生,可能是因为那时人们也不太愿意驾车外出。

一天中哪个时间段发生的交通事故最多?

这幅热图显示的是一周中每天以及一天中每个时间段交通事故发生的次数。不出意外,大部分的交通事故都发生在交通高峰期,即八点到九点的早高峰和三点到七点晚高峰(图中紫色区域)。并且相比之下,周五的情况尤其糟糕。

每起事故涉及多少车辆?

以上柱状图展示了每次交通事故所涉及的车辆数量。仔细观察后会发现,大部分交通事故涉及一至两辆车。这也符合大众常识,因为大部分交通事故都是一辆车突然偏轨,或者两辆车相撞。

伦敦哪个区发生交通事故最频繁?

以上柱状图显示了发生于伦敦不同行政区内交通事故的数量。仔细观察后会发现,Westminster发生交通事故最频繁,事故发生频率最低的则是KingstonUpon Thames。下图以一种不同的方式呈现了同样的信息:它用深紫色标记事故频发区。

监督学习

完成了以上预处理步骤之后,将继续进入最后的建模阶段。在这个阶段,需要先将数据集以70:30的比例分割为训练数据集和测试数据集。

通过应用Python的scikit-learn库,能够对模型进行训练和评估。笔者团队测试了许多常用的分类模型,比如SVM、逻辑回归,以及随机森林。接着,测量并比较了各个模型的具体表现,主要是依据其准确率和ROC曲线下的面积。下表总结了建模结果。

仔细分析后会发现,表现最佳的模型是只训练了数值特征的随机森林模型。最终,笔者团队选择安装的模型正是随机森林。具体安装过程会在下文详细介绍。

安装

接下来,需要应用一个基于Python的web框架Flask将scikit-learn模型安装到网络应用程序上。网页的前端显示是由HTML5UP网页上的template创建而成。所有的html、javascript,和CSS代码都被集成到Flask应用中。

然后,通过一个Python网络部署服务PythonAnywhere将该应用发布于网络上。如果感兴趣,可以访问网站kteo7.pythonanywhere.com,以下是该网站的截图。

在这里,笔者将就Flask应用的运行提供更多细节。

在网页前端,用户可以在特定字段输入其选择的出发地和目的地。该文本区域应用了Google Places API,因此拥有自动完成功能。并且,网页还应用了下拉式选单,用户可以通过该选单来直接选择日期与时间(可以是过去或者是现在某个时间点,也可以是未来48小时内某一时间)。

一旦完成输入,POST请求就会发送至后端框架。在这里,输入数据可以充当函数call_google的增强。已知出发地和目的地,该函数就会对GooglePlaces API发出指令,使其给出两点间的最优驾驶路线。具体来说,函数会给出均匀分布在路线上各路径点的经纬度。

此时,经纬度信息则成为另一个函数calc_distance的输入信息。接着,该函数会以这些路径点为圆心,“绘制”半径为50米的虚拟圆环,并且检查是否有事故地点落在这些路径范围内。

如果有某一簇在圆环内,那么另一个函数call_darksky就会给Dark Sky API发送请求。之后,该函数将对该地点某一特定时间的天气情况进行预测。

在集合了天气数据和时间日期信息之后,最后的预测函数将执行一个二元预测,即在选定时间和天气情况下,该相关事故地点是否被“激活”。然后,预测结果会发送至前端并展示在屏幕上。

下图展示的就是该交互式模型的动图。图中,笔者选择了一个未来的日期和时间,出发地和目的地分别定在Hyde Park和King's Cross。从图中可以看到,该模型选择了一条途径Gloucester Place和A501的路线,并且将这两条路的交叉路口标记为事故频发路段。

同样,如果感兴趣,可以点击该网站kteo7.pythonanywhere.com获取这一交互式交通事故预测模型。在它还未失效的情况下(预计到2020年年初左右),笔者非常鼓励大家积极学习和使用这一模型。

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

化身预言家:利用机器学习与谷歌地图实时预测交通事故风险相关推荐

  1. 谷歌官方回应了,99 部手机行为艺术「捉弄」谷歌地图后续

    _ By 超神经 内容导读:谷歌地图对于交通是否拥堵的判断依据是什么?它存在缺陷吗?一位叫 Simon Weckert 的艺术家,通过一个简单的实验,成功欺骗了谷歌地图的路况判断,在空旷的大马路上,制 ...

  2. 谷歌如何通过机器学习实现逼真AR实时自拍效果

    https://www.toutiao.com/a6666190519732797956/ 谷歌分享了他们是如何通过机器学习来实现逼真的AR实时自拍效果 (映维网 2019年03月09日)增强现实可以 ...

  3. 谷歌地图api 微信小程序_使用Google的融合位置提供程序API进行实时位置跟踪

    谷歌地图api 微信小程序 Location tracking and monitoring have seen a surge in modern application development w ...

  4. 谷歌地图实现车辆位置实时跟踪

    谷歌地图没有直接给路书的功能,在这里模拟一个,车辆上会随时传一个坐标值,通过后端的桥接,即时反馈给前端这些数据,得到坐标点,就可以进行地图打点,实现一种类似导航的效果,来展示位置所在. 本 Chat ...

  5. python 根据地址求经纬度 谷歌_js获取ip地址利用谷歌地图获得经纬度

    js获取ip地址利用谷歌地图获得经纬度-www.jquerycn.cn var  massage=null; function userip(ip){ $.getScript("http:/ ...

  6. 图神经网络让预估到达准确率提升50%,谷歌地图实现新突破

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载. 机器之心报道 编辑:魔王.杜伟.小舟 公交车.出租车等交通工具的到达时间是影响公众出行的一大因素.所以,预估到达时 ...

  7. AI未满:堵在技术升级路上的谷歌地图

    作为一个地图控,回想起当时在谷歌卫星地图里找到了自己出生地后的惊奇和兴奋,至今依然感叹科技带给每个普通人的思想震撼--只需一台电脑就可以拥有"上帝视角",轻轻滑动鼠标就能游历世界各 ...

  8. 图神经网络让谷歌地图更智能

    对于公众出行领域而言,交通工具的到达时间是主要的影响因素,预估到达时间(ETA)准确率已经成为非常实际的研究课题.近日,英国人工智能公司DeepMind 与谷歌地图展开深度合作,利用图神经网络(Gra ...

  9. 高德地图联手中国气象局,积水地图 AI 版实时预测道路积水

    5月31日消息,高德地图今日宣布与中国气象局公共气象服务中心达成战略合作,双方将在气象预警.大数据共享等诸多方面展开深度合作.在接入了中国气象局权威和精细化的气象数据之后,高德地图可为用户提供基于位置 ...

最新文章

  1. python给用户输出提示_python3.4控制用户输入与输出的方法
  2. Kafka技术架构那些事儿
  3. Linux课程设计八音盒,单片机课程设计——八音盒精要.doc
  4. 2020-12-11 keras通过model.fit_generator训练模型(节省内存)
  5. Docker中部署Mysql8数据库
  6. python 素描化图像_python实现图片素描效果
  7. [leetcode] 53.最大子序和
  8. C#自定义ConfigSections节 操作 。
  9. 在 windows 下使用 Xming+Putty 显示 Linux 下软件图形界面
  10. 作者:​邵蓥侠(1988-),男,博士,北京明略软件系统有限公司技术经理。...
  11. 当数据改变时,VUE是如何实现DOM更新的?
  12. 洛谷P3676 小清新数据结构题(动态点分治)
  13. 关于VS2017提示I/O文件操作函数需要加上_s的解决办法
  14. SpringBoot2整合Flyway(二)
  15. 怎么打开kux格式?如何把kux格式转换成mp4
  16. Pointofix非常好用的一款屏幕书写软件
  17. user后面的计算机名更改,更改电脑用户名(可更改C:\Users\用户名)
  18. 2k的地址范围 计算机组成原理,计算机组成原理课后习题
  19. Linux 下软件包的安装,压缩,解压(详细)
  20. 银行提供了整存整取定期储蓄业务,存期分为1年,2年,3年,5年,到期取本息之和,年利率如下 1年 2.25% 2年 2.7% 3年 3.24% 5年

热门文章

  1. 五洲御瓷精彩绽放2020第八届特色酒店案例分享论坛暨十周年庆典
  2. 信号与系统第一章--基本知识
  3. Multi-way PCA——多维主成分分析
  4. $(this) 自己、兄弟姐妹、长辈、长辈的兄弟姐妹增加/删除class
  5. 关于Debian10的网络配置
  6. 2018年网络安全大事记
  7. VM虚拟机中如何设置ip地址
  8. HMC5983求解偏航角
  9. STFT的综合分析--滤波器组求和(FBS)和叠相相加(OLA)
  10. matlab 保存当前图像,Matlab保存图像的方法总结