博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
化身预言家:利用机器学习与谷歌地图实时预测交通事故风险
阅读量:2091 次
发布时间:2019-04-29

本文共 4453 字,大约阅读时间需要 14 分钟。

全文共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,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

 

 

转载地址:http://gmqqf.baihongyu.com/

你可能感兴趣的文章
hadoop map reduce 阶段笔记
查看>>
java jackcess 操作 access
查看>>
Git问题Everything up-to-date解决
查看>>
Hadoop HDFS文件操作的Java代码
查看>>
Hadoop学习笔记—3.Hadoop RPC机制的使用
查看>>
Hadoop学习笔记—22.Hadoop2.x环境搭建与配置
查看>>
JTS Geometry关系判断和分析
查看>>
GIS基本概念
查看>>
Java文件操作①——XML文件的读取
查看>>
java学习总结之文件操作--ByteArrayOutputStream的用法
查看>>
Java生成和操作Excel文件
查看>>
Java的三种代理模式
查看>>
java静态代理与动态代理简单分析
查看>>
JTS Geometry关系判断和分析
查看>>
阿里巴巴十年Java架构师分享,会了这个知识点的人都去BAT了
查看>>
idea如何显示git远程与本地的更改对比?
查看>>
SDO_GEOMETRY结构说明
查看>>
oracle 的 SDO_GEOMETRY
查看>>
往oracle中插入geometry的两种方式
查看>>
Oracle Spatial中的Operator操作子 详细说明
查看>>