摘 要:对海量交通数据进行分析,可为实现智能交通调度提供一定的参考依据,并为进行相关可行性分析提供有效支撑。本文利用Python和Pandas数据处理模块,对成都市1.4+万辆出租车的GPS记录进行分析处理。借助于机器学习中的回归算法,实现对某出租车在某时段行驶于某条线路所需时间的预测,并通过网页交互的形式,为用户提供出租车及出行路线推荐方案。
关键词:数据挖掘;机器学习;路线推荐;智能交通
中图分类号:U491.14;TP181 文献标识码:A 文章编号:2096-4706(2018)12-0016-03
Traffic Data Analysis and Application Based on Machine Learning
ZHANG Teng,LIN Guimin,QIU Lida,LIU Chaoming,WEI Yujing
(College of Physics and Electronic Information Engineering,Fuzhou 350108,China)
Abstract:Analysis of massive traffic data provides a convenient reference for modern traffic scheduling and feasibility prediction,and provide effective support for relevant feasibility analysis. This article uses the Python and Pandas module to deal with the GPS records of more than 14 thousand taxis in Chengdu. Through the regression prediction via machine learning,the forecasting of required time for a taxi to travel on a certain period of time is realized. Finally,the recommendation of travel routes and taxis for users through a web page is provided.
Keywords:data miming;machine learning;routes recommendation;intelligent transportation
0 引 言
城市化的发展以及机动车数量的增加,在给人们的生产生活带来便利的同时,也造成了交通拥堵等负面影响。在智能手机高度普及的当下,借助各种手机App,人们的出行更具有计划性。通过向手机地图App提供当前位置信息以及目的地位置信息,它就会给你推荐各种出行方案,对于不同的交通工具,也会优先给你推送耗时最短的行程规划[1]。这种相对专业并且可靠的出行方案对于不经常出门的人来说非常实用,只要明确了目的地就能提前定制并且规划自己的出行方案,防止类似耽误航班、约会迟到这样的事情发生。这类能够提供行程推荐服务的地图App的核心技术就是一个完整的推荐系统,保证推荐系统的实时性,才能在有效时间内为用户提供推荐服务。一个推荐系统要依托于它所使用的推荐算法,而要保证推荐算法的可靠性,就需要大量采集并记录实际生活中的数据,以此来训练出一个健壮的算法模型。从本质上来说一个地图App实现行程推荐服务依靠于对交通数据进行采集分析,并依据公交、高铁这种有固定班次的交通工具的时刻表或者在合理范围内推断交通状况,利用推荐算法对参数进行处理,从而预测道路的通达时间。
要想设计并制作这样一款产品,需要从数据处理开始,使用处理后的数据来训练,生成预测模型,再通过这个模型进行预测,这样就完成了推荐系统的核心部分。数据的选择,最好是数据量大并且能提供较多实用信息的车辆行车记录。GPS数据是研究道路问题,分析道路状况的一种非常实用的数据。由于GPS数据是对交通数据的实时性记录,采集得到数据集记录量多,因此必须对其进行预处理。预处理在于提取有用的数据,例如经纬度位置记录、时间点距离,然后统计整理提取到数据,以此为基础计算出其他数据,例如行驶路程、行驶速度。通过这样的处理就能把一条条GPS数据转化成我们进行基本测算所使用的距离,平均速度,从而计算出通过某条路线所需大致时间。对于同种交通工具的不同状态,使用回归预测(Regression Analysis Prediction Method)来生成预测模式用以进行道路通达时间预测比较合适[2]。
设计一个基于GPS数据的推荐系统需要明确,从GPS数据的处理,到回归模型的创建,再到推荐系统的实现,是一个自下而上的过程。虽然本次设计的网页应用展示部分相对简洁直观,但是推荐算法的生成——回归模型的创建才是项目最核心的部分,正如盖楼需要先打好根基。从繁多冗余的信息中提炼出有用的信息,并“烹饪”这些信息,将最终生成的结果直观地展现出来,推送给用户,才是一个推荐系统的价值所在。
1 交通数据分析模型设计
设计主要包括了训练集处理模块,预测集处理模块,回归预测模块和Web启动模块,如图1所示。除了最开始导入的数据集外,用于生成回归模型和推荐结果的都是模块生成的csv文件。
(1)训练集处理模块(train_set.py):用于处理导入的“train+日期.txt”文件,并将生成的数据表以csv文件格式保存,生成名为“trainset+日期.csv”的文件。(2)预测集处理模块(predict_set.py):用于处理导入的“predPaths_test.txt.”文件,并将生成的数据表以csv文件格式保存,生成名为户“preResult.csv”的文件。(3)回归预测模块(regrPredict.py):导入训练集处理模块生成的csv文件用于训练模型和预测评估,导入预测集生成的csv文件用于预测,将生成的结果命名为“fnresult.csv”存入磁盘。(4)Web启动模块:导入回归预测模型生成的csv文件,根据网页提交的数据表单数据从csv文件中获取满足条件的记录用于推荐和预测。
1.1 数据导入与导出模块
数据表使用for语句进行遍历,并使用isin()方法从数表中提取出符合条件的GPS记录,这样就能以“数据块”的方式来处理数据,提高效率的同时还能降低系统内存的占用。由于过滤出来的各条GPS记录在时间轴上并不是绝对有序的,所以在处理遍历结果之前要先依据时间栏(timing)进行排序,之后需使用if语句对记录进行分类处理,即根据载客状况的不同,将载客(1)和空载(0)的记录归类到一起,再通过一些转化函数来处理记录中的数据。
从数据表中获取的数值有些是不能直接使用的,比如时间“2014/8/3 21:18:46”需要先转化成秒数才可以参与计算,GPS记录之间的距离差也需要通过公式对经纬度数据进行处理才能计算出来,而且从数据表中获取的时间是str类型,需要使用int()函数转化为整型才能使用。
时间的处理:通过字符串分割方法split()分割日期和时间,然后再进行一次分割获取小时数、分钟数和秒数,最后再通过单位转化算出总秒数t(单位:s)。
总秒数t=小时数*3600+分钟数*60+秒数(将当前记录时刻用秒表示,方便计算时间间隔)。
经纬度处理:将两个记录的经纬度传入距离计算函数,通过公式计算出两点间的球面距离dist(单位:m)。
其中:lat1、lat2分别为两点的纬度,dlat、dlon为两点的纬度差和经度差,2R=12756274m,R为地球的半径。
将处理后的数据用不同的列表进行储存汇总,最后生成dataframe数据框对象,并使用Pandas中的to_csv方法将这个数据表写入磁盘中。
1.2 回归预测模块
本设计主要想实现的功能是预测道路通达的时间,给用户推荐耗时最短的行车方案,即某天某辆出租车(在此条件下筛选出来的平均行驶速度最快的出租车)在某个时间段从A地通过某条路径到达B地所需的时间。同时GPS记录中也提供了一些可用来预测的特征,例如出租车ID、路径距离(通过记录点之间的不同的经纬度求得)、载客状态、时间点等信息,把这几个影响通达时间的数据当成变量,确定几个变量之间是否存在相关关系,如果存在,则找出它们之间合适的数学表达式——回归方程。由于各种客观因素,如果采用线性回归来训练回归模型,预测准确度(实时预测精度为70%~80%)将差强人意(只有路径距离这一个特征符合线性条件),相比之下非线性回归——逻辑回归会是更好的选择。
我们选取了逻辑回归作为应用的核心算法,实例化模型:
regr=linear_model.LogisticRegressionCV(
Cs=np.logspace(-2,2,20),cv=2,
fit_intercept=True,multi_class=\"ovr\",
penalty=\"l2\",solver=\"lbfgs\",tol=0.01)
(其中,参数cv用于交叉验证,multi_classs用于选择分类方式,sovler用于选择优化算法,tol为计算阈值,避免过度计算)
为了对监督性学习(特征值已知)进行评估,我们需要把数据集切分成训练集和测试集。由上一步骤整理后的训练集按日期分为多个csv文件,这里就不再对其进行切分,而是选取双数日期(4号,6号,8号等)的数据作为训练集,选取单数日期作为测试集(3号,5号,9号等)。
回归模型训练出来后我们需要对它的可靠性进行评估。本设计采用的评价标准为平均百分比误差(mean absolute percentage error),误差越小,说明回归预测的准确率越高。
1.3 网页展示模块
web.py是Python中的一个轻量级的Web服务模块,可以实现基本的网页后端功能,包括路由的配置,网页模板添加等。通过几行代码就能创建的一个简单的Web网页应用。通过POST请求获取用户提交的表单数据,提交的数据经过处理后,使用web.template.render()方法(模板渲染)将它传入网页模板,然后就可以通过浏览器窗口看到打印出来的数据。
为了进行预测我们必须提供参数给回归模型,所以用户在使用时必须提供位置信息和出发时间,对于时间处理起来不难,但是仅仅得到位置信息我们是无法使用的。因此借助第三方API我们可以将位置信息转化为经纬度信息,然后再通过求距离的函数求出行车路线的距离,结合推荐得到的参数就可以完成行车时间的预测。把位置信息转化为经纬度的业务处理函数:
def getLatLon(str):
data = {
output: json,
ak: ********************************,
akcallback: ************}
data[address] = str
# 将用于认证的ak,akcallback通过字典封装传给url,接入API
get = requests.get(
http://api.map.baidu.com/geocoder/v2/,
params=data
)
获取到的数据为json字符串,可以通过json模块中的loads()函数将其转化为字典对象,然后通过key值取出其中的数据。
预测结果(行车时间)是通过html直接在网页中显示出来的,用户在输入完出行信息之后,点击提交,就会跳转到显示结果的页面。
2 应用展示与评价
应用的展示部分是本次设计的最后阶段,这里通过网页的形式进行展示,与GUI应用体验效果没有太大的差距,其能在一定程度上与用户进行交互。设计二级界面,实现了查询输入页面与查询结果显示页面之间的跳转。
通过默认主机地址localhost:8080访问首页,可看到如图2所示的界面,让用户可以输入要查询的信息。查询之后,系统将返回一个推荐结果,如图3所示。
3 结 论
本课题“基于GPS信号的交通线路推荐系统设计”是以Python语言为编程工具,使用Pandas数据处理模块,对成都市1.4+万辆出租车的GPS信号记录进行处理,并且通过使用Numpy矩阵处理模块结合scikit-learn机器学习模块中的逻辑回归算法,实现对某出租车在某时段下行驶某条线路所需时间的预测。并通过网页交互的形式,为用户提供交通路线推荐,同时也能够开发出一款具有实际使用价值的应用。
参考文献:
[1] 姜桂艳,常安德,李琦,等.基于出租车GPS数据的路段平均速度估计模型 [J].西南交通大学学报,2011,46(4):638-644.
[2] 王志杰,王庆.基于多元回归分析的坐标转换方法研究 [J].工程勘察,2013,41(10):62-65.
作者简介:张腾(1996-),男,福建福清人,学士。主要从事光学、图像处理;通讯作者:林贵敏(1981-),男,福建泉州人,副教授,硕士。主要从事图像处理、机器学习研究。