前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用机器学习和Google Maps对交通事故风险进行实时预测

使用机器学习和Google Maps对交通事故风险进行实时预测

作者头像
代码医生工作室
发布2019-10-15 17:23:07
3.6K1
发布2019-10-15 17:23:07
举报
文章被收录于专栏:相约机器人

作者 | Merardo Antonio

来源 | Medium

编辑 | 代码医生团队

Traffic事故是非常普遍的。如果生活在一个广阔的大都市中,那么很有可能听说,见证甚至参与其中。由于交通事故的发生频率,交通事故是造成全球死亡的主要原因,每年缩短数百万人的生命。因此,可以预测交通事故或容易发生事故的区域的系统可以潜在地挽救生命。

尽管困难,但交通事故的预测并非不可能。事故并非纯粹是随机发生的。它们的发生受到多种因素的影响,例如驾驶员的身体状况,汽车类型,行驶速度,交通状况,道路结构和天气。研究历史事故记录将有助于了解这些因素与道路事故之间的(潜在的因果关系),从而能够建立事故预测因子。

幸运的是,其中一些事故记录是公开可用的!例如,英国政府发布了该国自2002年以来发生的交通事故的详细记录。借助此数据集,创建并部署了一种机器学习模型,该模型可以高度准确地预测何时何地发生事故。可能发生在大伦敦。

在本文中,将完成该项目的过程。完整的代码可以在GitHub存储库中找到,而实时模型可以在网站上访问。

https://github.com/meraldoantonio/AccidentPredictor

https://kteo7.pythonanywhere.com/

目的

在开始这个项目之前,为自己设定了一个明确的目标:希望创建一个交互式的交通事故预测器,任何人都可以轻松访问。认为实现此目标的最佳方法是在网站上部署经过训练的预测变量。该预测器网站应该能够执行以下操作:

  • 允许用户输入起点和终点(两者都必须在大伦敦),并找到连接两者的最佳驾驶路线。
  • 允许用户选择计划进行旅行的日期/时间,并在该时间范围内确定路线上特别容易发生事故的区域。

下图描述了为实现这一目标而采取的步骤。将在以下各节中详细介绍它们。

该项目的步骤

数据采集

确定了目标之后,开始寻找必要的数据。以下是我们最终选择的两个数据集:

Kaggle

用于该项目的主要数据集是英国政府发布并保存在Kaggle上的详细事故记录。数据组中包含大约发生在英国2000年和2014年它由33列其捕获细节之间,如地点,时间,事故各种气象和交通背景的严重性160万件交通事故的详细信息。在此项目中,将自己局限于分析2012年至2014年之间大伦敦的交通事故。

https://www.kaggle.com/daveianhickey/2000-16-traffic-flow-england-scotland-wales/version/8

阴暗的天空

认为天气是造成交通事故的一个特别重要的因素。尽管前面提到的Kaggle数据集包含气象信息,但这还不够。关于使用weather_conditionKaggle数据集的列有两个问题:

  • 它假定天气全天都是恒定的。如果去过伦敦,就会知道为什么这种假设会带来问题-那里的天气变化非常频繁!
  • 它仅包含历史气象记录(显然!)。为了weather_condition用作未来事故的预报器,需要一种获取天气预报的方法。

由于这些原因,决定改用Dark Sky(一家专门从事天气预报的美国公司)提供的气象数据。Dark Sky提供过去的记录和未来的天气预报,完全可以满足目的。

https://kteo7.pythonanywhere.com/darksky.net

数据处理

DBSCAN集群

浏览数据集后,发现伦敦几乎每条街道都曾经是事故现场。这是有道理的-伦敦是一个熙熙city的城市,交通事故(包括轻微事故)非常频繁地发生。下图是使用Tableau创建的,在伦敦地图上叠加了事故发生的位置(红色点)。请注意整个城市是如何沐浴在红色中的!

伦敦市。每个红色斑点表示2012年至2014年之间发生的事故。正如所看到的,伦敦充满了(历史性)车祸!

尽管整个城市都发生了事故,但某些地区比其他地区更容易发生事故。为了系统地识别这些事故热点,将上述事故地点分组。将群集定义为横截面为25米的区域,其中在两年的时间范围内至少发生了14起事故。

使用DBSCAN算法来执行此聚类。选择DBSCAN的原因是它的速度,发现任意形状簇的能力以及对异常值的鲁棒性。落在聚类之外的事故点被视为异常值,因此不在后续分析中。

DBSCAN工作原理的描述

DBSCAN聚类步骤导致发现了473个事故热点。这些热点在下面使用ArcGIS(地理分析软件)可视化。可以看到热点集中在伦敦的主要道路上,例如A11和A13。

伦敦事故热点

负采样

在这一点上,有数百个事故热点。需要澄清的一件事-这些热点在100%的时间内都不容易发生事故。例如,在繁忙时间,伦敦主要干道上的事故热点可能会有危险,但在安静的时候相对安全。另一方面,急转弯的热点在明亮的晴天可能几乎没有害处,但在下雪或下雨天可能会变得致命。

因此,下一个任务是找出这些热点在哪些条件下被“激活”。通过这种方式,项目现在变成了经典的二进制分类问题:需要找出将“激活”热点的因素(例如天气,时间等)的组合。

但是,目前数据还不足以创建分类模型!训练分类器需要正样本和负样本,但只有正样本(即is_accident目标标签为1的记录)。因此,需要一种生成负面样本的方法(即“非事故”的记录)。

先前已经描述了使用阳性样品产生阴性样品。遵循Yuan等人描述的方法。本质上,此方法需要为簇中的每个阳性样本随机生成三个阴性样本。例如,如果在Abbey Road上有一个集群,其中发生了15起事故,那么将在该地点随机合成45条非事故记录。除了它们的位置以外,还随机选择了这些阴性样本的其他预测特征,例如非事故事件的日期和时间。请注意,这些随机合成的阴性样本不会与真实的阳性样本相符。

探索与观察

浏览清理的数据集后,进行了一些有趣的观察。下面将详细介绍一些更有趣的观察结果。

道路交通事故最有可能发生在哪个月份?

上面的热图显示了在每个日历月的一周中的每一天中发生了多少事故。可以看到,从9月到12月这几个月的事故发生频率相对较高。这些是伦敦秋季的几个月,其特征是低温,雾和雨。与直觉相反,在一月和二月的寒冷冬季发生的事故较少。这可能表明人们在此期间不愿开车。

道路交通事故最有可能在一天的什么时间发生?

上面的热图显示了一周中的每一天每一小时内发生了几次交通事故。毫不意外地发现,大多数事故发生在早上高峰时间从上午8点至上午9点以及晚上高峰时间从下午3点至晚上7点(紫色街区)。星期五特别糟糕。

每次事故涉及多少辆车?

上方的条形图显示了基于所涉及车辆数量的事故分布。它表明大多数事故涉及一到两辆车。从直觉上讲这很有意义;大多数事故是由于驶离道路和/或两辆汽车之间发生碰撞而发生的。

在哪个行政区最常发生交通事故?

上方的条形图显示了伦敦不同行政区发生了多少起事故。看到威斯敏斯特排名第一,泰晤士河畔金斯敦排名第二,交通事故最少。下面的地图以不同的方式显示了相同的信息:它以深色的紫色突出显示了容易发生事故的自治市镇。

监督学习

通过上述预处理步骤,终于准备好进行建模阶段!将数据集以70:30的比例分为训练和测试数据集。

Python的scikit-learn库用于模型训练和评估。尝试了常见的分类模型,例如SVM,逻辑回归和随机森林。使用接收器工作特性曲线(AUC-ROC)下的精度和面积来测量和比较模型的相对性能。下表总结了建模步骤的结果。

发现,在测试的模型中,性能最好的模型是仅对数字特征进行训练的随机森林。这是选择用于部署的模型,下面将描述一个过程。

部署方式

然后,使用Python Web框架Flask将scikit-learn模型打包到Web应用程序中。该网站的前端显示是基于从HTML5UP网站获取的免费模板构建而成的。所有的html,javascript和CSS代码都已集成到Flask应用程序中。

然后,该应用程序由专注于Python的网络托管服务PythonAnywhere在线制作。可以访问kteo7.pythonanywhere.com上的网站。这是网站的屏幕截图:

现在,想提供更多有关Flask应用程序工作的细节。

在前端,用户可以在其中输入选择的起点和终点的字段。这些文本字段配备了提供自动完成功能的Google Places API。还有一个下拉菜单,用户可以使用该菜单选择日期/时间(可以是过去,现在或未来48小时内)。

做出这些输入后,就会将POST请求发送到后端框架。在这里,这些输入充当该函数的参数call_google。给定起点和终点,此函数将调用Google Maps API,该API将返回连接两者的最佳行驶路线。更具体地说,该函数返回路线航路点的纬度和经度,这些纬度和经度是沿着路线的规则间隔的点。

纬度和经度用作另一个功能的输入,此功能称为calc_distance. “绘制”从这些航路点起半径为50米的假想圆,并检查是否有任何事故热点落在这些航路点内。

对于落入圆圈中的每个群集,还有另一个功能,call_darksky向Dark Sky API发出请求。此功能将在指定的时间返回该地点的天气预报。

借助天气数据以及有关日期/时间信息的信息,最终预测功能将对所选热点/时间下是否“激活”了关注热点进行二进制预测。然后将这些预测发送到前端,前端会将其显示在屏幕上。

下面的gif显示了互动模型。在这里,选择了未来的日期和时间,选择了起点(海德公园)和终点(国王十字)。可以看到模型选择了一条穿过格洛斯特广场和A501的路线,并将这两条道路之间繁忙的十字路口标记为潜在的事故地点。

同样,可以在kteo7.pythonanywhere.com上访问此模型。鼓励在它仍处于活动状态(直到2020年初一直处于活动状态)时试用它。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档