machineLearning-基于XGBoost的出租车出行时间预测

基于XGBoost的出租车出行时间预测

梅凯

摘要:为了预测纽约乘坐出租车时间,利用纽约市出租车和豪华轿车委员会发布的数据进行预测,在使用K-means聚类后提取了一定数量的特征向量,最后通过XGBoost对数据进行了模拟和分析,并通过均方根误差(RMSE)作为评价指标。结果表明,将XGBoost参数min_child_weight=1(叶子节点最小权重值,小于1就不进行划分),eta=0.5(过拟合取值),colsample_bytree=0.9(对每一个生成的树进行二次采样的比例),max_depth=6(最大深度,过大可能会过拟合),subsample=0.9(训练子集的子样本比例,防止过拟合),lambda=1(使用L2正则化,防止过拟合)时,均方根误差最小,模拟效果达到最优。特征向量对影响出行时间的重要性由大到小依次是distance_haversine(正线距离)、direction(方位)、distance_dummy_manhattan(曼哈顿距离)、dow_6(星期六)、dow_5(星期五)、pick_cluster(上车类簇)。

关键词:XGBoost;出租车;时间预测;K-Means;机器学习

0 引言

    近年来出租车一直使人们主要的出行工具,收到地铁和公交车的影响,选择乘坐出租车的乘客略有减少。为了优化出租车服务,从市场角度出发,根据影响人们乘坐出租车因素,较准确的预测乘客乘坐出租车出行时间,从而进一步出租车公司提供的服务。

    常用的出租车属性时间的预测主要是以是以机器学习中的算法为基础,包含多元线性回归、支持向量机、随机森林、GBRT、XGBoost、神经网络算法中的BP算法和LSTM算法等。本文将从出租车的市场业务角度出发,提出一种基于 XGBoost 算法的出租车出行时间预测模型。通过2家公司提供的数据,对训练集的预测,然后比对验证集,计算均方根误差,从而准确预测出行时间,满足出租车公司的营销策略导向指引类的业务需求。

1 资料与方法

1.1 数据来源

    数据集是纽约市出租车和豪华轿车委员会发布的数据集,其中包括上车时间,地理坐标,乘客人数以及其他几个变量。分为训练集合测试集2个数据集,其中训练集包含1458644例数据,测试集包含652134例数据;vendor_id只有2个值1和2代表2家公司;passenger_count    乘客人数最少0人最多9人;trip_duration乘车时间最短有1秒,最多有3526282秒。

表1-1 训练集样例数据

id

vendor_id

pickup_datetime

dropoff_datetime

passenger_count

id2875421

2

2016/3/14 17:24

2016/3/14 17:32

1

id2377394

1

2016/6/12 0:43

2016/6/12 0:54

1

id3858529

2

2016/1/19 11:35

2016/1/19 12:10

1

id3504673

2

2016/4/6 19:32

2016/4/6 19:39

1

id2181028

2

2016/3/26 13:30

2016/3/26 13:38

1

pickup_longitude

pickup_latitude

dropoff_longitude

dropoff_latitude

store_and_fwd_flag

trip_duration

 

-73.9822

40.76794

-73.9646

40.7656

N

455

 

-73.9804

40.73856

-73.9995

40.73115

N

663

 

-73.979

40.76394

-74.0053

40.71009

N

2124

 

-74.01

40.71997

-74.0123

40.70672

N

429

 

-73.9731

40.79321

-73.9729

40.78252

N

435

 

1.2 数据预处理

    在训练集和测试集中均未发现缺失值,在处理过程中发现了异常值。我们发现训练集中乘车时间最大有3526282秒,最少只有1秒,为了避免异常值对实验结果的影响,这里取平均值加减2倍的标准差这一区间的数据;发现有的坐标点异常远,猜测是录入数据时失误,这里只取纽约城的边界点范围内的数据(纬度(40.63, 40.85) 经度(-74.03, -73.75));最后还发现数据中只出现2次乘客为9人的情况,也将这一异常值删去;测试集比训练集少一列dropoff_datetime属性,后续建模预测此时间,然后将数据日期时间处理为编译软件可识别的时间。

    通过1.5.0和1.5.1的介绍,我们求出了起点到终点的曼哈顿距离一起出行的方位,将这些计算出来的数据存储到数据集中,得到如下表数据(distance_dummy_manhattan:曼哈顿距离,direction:方位角)。

表1-2 方位角和距离

id

vendor_id

distance_haversine

distance_dummy_manhattan

direction

id2875421

2

1.499

1.735

99.97

id2377394

1

1.806

2.431

-117.154

id3858529

2

6.385

8.204

-159.68

id3504673

2

1.485

1.661

-172.738

id2181028

2

1.189

1.199

179.474

1.4 特征处理

    由于出租车属性种类并不多,作为特征维度太少,因此需要进行特征处理,即从特征中选出特征子集,这里将原始特征变量做哑变量处理。

从时间属性,获取到关于月份的哑变量6个,关于一个月内的哑变量31个,关于一周内的哑变量7个,一天内的哑变量24个;从服务商属性获得2个公司的哑变量;从乘客数量属性获得7个哑变量;此前是否记录行程属性获得2个哑变量;从K-means聚类获得的100个类簇分别获得上车哑变量100个,下车哑变量100个。

最后在训练集中获得285个属性,测试集获得284个属性(1.3提到测试集比训练集少一列dropoff_datetime属性),形成如下表3形式的数据。

表1-3 特征提取后训练集数据

log_trip_duration

distance_haversine

distance_dummy_manhattan

direction

pickup_cluster

dropoff_cluster

vi_1

vi_2

pc_0

pc_1

6.122

1.499

1.735

99.97

7

21

0

1

0

1

6.498

1.806

2.431

-117.154

22

72

1

0

0

1

7.662

6.385

8.204

-159.68

58

84

0

1

0

1

6.064

1.485

1.661

-172.738

88

39

0

1

0

1

6.078

1.189

1.199

179.474

18

13

0

1

0

1

h_21

h_22

h_23

dow_0

dow_1

dow_2

dow_3

dow_4

dow_5

dow_6

0

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

1

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

1

0

1.5 模型算法

1.5.0    已知经纬度求2点间的方位角和距离

    由于数据只给了经度和纬度,想要求出2点间的距离还需要进一步进行处理。这里Aj:A点经度,Aw:A点纬度,Bj:B点经度,Bw:B点纬度,c:AB夹角角度,C:弧线AB的弧度,从而有得出方位角c的公式:

 

通过上面求出的方位角公式和地球半径R可以直接求出,距离L的公式:

 

 

 

1.5.1    曼哈顿距离(出租车距离)

两点在南北方向上的距离加上在东西方向上的距离,即。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。

所有本次研究用曼哈顿距离表示上车坐标和下车坐标之间的距离。

1.5.2    K-means聚类

K-means算法是最常用的聚类算法,在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

1.5.3    XGBoost算法

这次用boosting算法的XGBoost,该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。(叶子结点数过多可能会过拟合)

1.6 统计分析和结果评价

    采用python3.7进行统计学分析。为了准确和全面的评估模型,这里用均方根误差来作为预测结果的评价标准。均方根误差的公式为:

 

1.7 模型训练和验证

    根据以上算法,建立分类模型。将处理后的数据进行多次训练,对不同参数进行的多次调整,最终得到最佳结果。

2 统计学分析

2.1 比较训练集和测试集的相似性


图2-1 旅行次数与时间折线图

    图能够将数据的趋势直观的表达出来,通过乘车次数和时间的关联或许可以将天气的变化或者发生的某一特殊事件间接的表示出来,从而找出一些异常值。在图2-1中,发现2016年1月到2月之间和2016年5月底六月初乘车次数有较大幅度的下降。我再查找2016年纽约的新闻发现,1月24日罕见的暴风雪降临纽约,造成大面积瘫痪;在5月底,纽约天气没有异常,但发生了罢工和罕见奇观造成了人群聚集,也一定程度影响了出行次数。这些因素在后续预测中是需要排除在外的。


图2-2 训练集和测试集出行坐标散点图

    图2-2中训练集和测试集的坐标分布并没有明显的区别,唯一不同的是图中点的密度有所不同,这是训练集数据量接近2倍的测试集导致的。

2.2 乘客人数对乘车时长影响的分析

表2-1 乘客人数所占数据

乘客人数

0

1

2

3

4

5

6

所占数据

52

1018715

206864

58989

27957

76912

47639

猜测乘客人数的多少可能会影响上车下车时间和乘车时停车的次数从而影响乘车时长, 在综合查看图2-3和表2-1,并未发现乘客人数对乘车时间由多少影响。乘客人数多集中在1人和2人,发现乘客人数为0时的乘车平均时间也有两百多秒,这可能是异常数据。


图2-3 乘客人数和乘车时间柱状图

2.3 特征提取后的变量和平均速度的关系

    在提取了这些变量后我们可以根据图2-4直观的看到一天内的24个小时,一周内的7天,一年内的12月份对车辆平均行驶速度(曼哈顿距离/乘车时间)的影响。如图4所示:


图2-4 时间和平均速度折线图

    从图2-4中可以清晰的看出在一天内平均速度的高峰发生在早上5点到9点,以及晚上8点后;一周内平均速度的较高值出现在周五、周六、和周日,一般这些时间是放假的时间,交通状况较平时上班要好很多,所以速度有所提高;而平均速度和月份的关系似乎并无明显关联。

    接着,我们可以在地图上显示平均速度,来判断城区和郊区和平均速度的关系,如图5(这里只记录了该坐标点出现的次数大于100的点):


图2-5 平均速度散点图

    图5中,黑点表示坐标点重复出现的次数小于100次,颜色越绿表示速度越高(如同红绿灯),红色表示速度很慢,黄色表示速度一般,可以看出在一些偏远地区平均速度要比城区的要高一些。

2.4 公司类别和出行时间的关系

    最后,还可以探究公司类别的不同是否对出行时间有所影响,根据图2-5-显示,公司2的平均乘车时间略微比公司1多十几秒,并没有多大差别。


图 2-5 公司类别和出行时间

3 算法原理

3.1    K-means聚类

3.1.1    K-means原理

    在1.5.2简要概述了k-means, 这里会具体的解释算法原理。假定给定数据样本X,包含了n个对象,
其中每个对象都具有m个维度的属性。Kmeans算法的目标是将n个对象依据对象间的相似性聚集到指定的k个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。对于Kmeans,首先需要初始化k个聚类中心,然后通过计算每一个对象到每一个聚类中心的欧式距离,如下式所示:

 

上式中,表示第i个对象表示第j个聚类中心的表示第i个对象的第t个属性,表示第j个聚类中心的第t个属性。

    依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇,K-means算法用定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下:

 

上式中,表示第l个聚类的中心,表示第l个类簇中对象的个数,表示第l个类簇中第i个对象,。

3.1.2    K-means算法流程

    算法流程具体为:

输入:样本集,聚类簇数k

过程:

1:从D中随机选择k个样本作为初始均值向量

2:repeat

3: 令

4: for j=1,2,…,m do

5: 计算样本,与各均值向量的距离:

6: 根据距离最近的均值向量确定的簇标记:

7: 将样本划入相应的簇

8: end for

9: for i=1,2,…,k do

10: 计算新均值向量:

11: if then

12: 将当前均值向量更新为

13: else

14: 保持当前均值不变

15: end if

16: end for

17:until 当前均值向量均未更新

输出:簇划分

3.1.2    使用K-means聚类

    由于训练集数据有1458644例,用普通K-means算法造成计算时间过程过长,本次实验用的是基于K-Means的Mini Batch K-Means聚类算法,Mini Batch KMeans是一种能尽量保持聚类准确性下但能大幅度降低计算时间的聚类模型,其原理基本同于K-means,还使用了一个分批处理的方法对数据点之间的距离进行计算,分批处理的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。

    在数据中先将上车的经度和下车的经度,上车的纬度和下车的纬度拼接在一起,选择100个簇进行聚类,结果如图:


图3-1 聚类后100个簇坐标散点图

3.2    XGBoost算法

3.2.1    XGBoost算法原理

    XGBoost是”eXtreme Gradient Boosting”的简称,是由Chen开发的一种实现可扩展,便携的分布式的Gradient Boosting算法的一个库。其中Gradient Boosting属于集成算法的Boosting方法中的一种类别,Boosting方法将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到最小。Gradient Boosting则是通过加人新的弱学习器来改善已有弱学习器的残差,将多个学习器相加起来得到最终的预测结果,由于在添加新的学习器时使用了梯度下降算法来最小化损失,所以称之为Gradient Boosting,由于Gradient Boosting

需要每次构造一个树并将其添加到整个模型中,这使得实现起来比较耗时且精度低,而XGBoost由于训练时可用所有的CPU内核来进行并行化建树,除此之外可以利用分布式计算来训练非常大的模型,这使得训练时间得以缩短。

XGBoost的目标函数除损失函数项之外还包含了正则惩罚项将二者结合起来整体求最优解,用于权衡损失函数的下降和模型的复杂程度,正则化项的加人可以降低模型的方差,使得通过训练集学习得到的模型更加简单,从而防止产生过拟合。其目标函数为:

 

上列式子中,为损失函数,为正则惩罚项(惩罚函数),与树的叶子节点的数量T和叶子节点的值有关,表达式为:

 

上式中为自己设置的参数。传统的GBDT在求解的过程中只利用了一阶导数的信息,而XGBoost对于损失函数做了二阶的泰勒展开使得求解的精度更高。其第次的损失函数为:

 

对上式做二阶泰勒展开,得到:

 

其中一阶导数为,二阶导数为。为了得到获取最优分割,通过计算分裂后的值减去分裂前的值,从而计算其得到的增益,其树节点的分裂公式:

 

在树节点分裂的过程中XGBoost通过添加阈值进行剪枝以此来限制树的生成,同时通过添加系数对叶子做平滑处理从而防止产生过拟合,在寻找最佳分割点的过程中,不是选择传统的枚举各个特征的所有可能的分割点的贪心算法,而是根据百分位法列举几个可能成为最佳分割点,从这些可能的分割点中根据上式计算找到最佳的分割点。由于XGBoost算法所表现出来的良好性能,使其在众多领域的应用越来越广泛。其中包括企业风险预测、电力预测、动作识别、糖尿病的预测等。

    本实验通过采用XGBoost算法,对出租车数据集进行模型训练,不断地寻找最佳的树模型加人到已有模型中,在每一轮的迭代过程中更新样本的预测值:

 

其中,代表第轮迭代,即每次都寻找一个最佳的模型加人到已有模型中使得目标函数式的值最小并且预测值更加逼近真实值。通过在模型训练的过程中调参获取较优的参数集合,获取到最优的预测模型。

3.2.2应用XGBoost

    XGBoost需要3个数据集分别为训练集、测试集、验证集,验证集用来验证训练集训练出来的模型的准确性,然后再去预测测试集。这里验证集用取了20%的训练集数据。

    为了使得训练出来的效果较好,进行了不断的调参测试,防止过拟合,均方根误差作为评估指标。最后得出将参数min_child_weight=1(叶子节点最小权重值,小于1就不进行划分),eta=0.5(过拟合取值),colsample_bytree=0.9(对每一个生成的树进行二次采样的比例),max_depth=6(最大深度,过大可能会过拟合),subsample=0.9(训练子集的子样本比例,防止过拟合),lambda=1(使用L2正则化,防止过拟合)时,均方根误差最小。特征重要性以及相应决策树(部分)如图所示:


图3-2特征重要性


图3-3决策树(部分)

    图3-2显示了影响乘车时间的最主要6个特征主要是distance_haversine(正线距离)、direction(方位)、distance_dummy_manhattan(曼哈顿距离)、dow_6(星期六)、dow_5(星期五)、pick_cluster(上车类簇)。这也证明了乘车路程长确实要消耗更长的时间,人们更喜欢周末进行长途旅行。

    通过验证集验证了建立好的模型准确率,均方根误差为0.41530,最后完成了对测试集的预测,部分数据见下表:

表3-1测试集出行时间预测(部分)

id

id3004672

id3505355

id1217141

id2150126

id1598245…

trip_duration

871.7976

795.0335

414.8733

1200.345

326.3035…

4 结论

    本文提出了一种基于XGBoost的出租车出行时间预测模型,通过在目标函数中采用RMSE函数作为误差函数使得模型充分的拟合训练数据集,减小模型的偏差,同时在目标函数中增加L2正则化惩罚项,是的模型不易于产生过拟合,从而提高模型的稳定性。利用基于XGBoost的出租车出行时间的预测模型对测试集进行预测加以分析,结果显示误差较小,有较高的准确性。

5 参考文献

[1]冷菲,李巍.基于XGBoost对肺鳞癌和肺腺癌的分类预测[J].首都医科大学学报,2019,40(06):889-893.

[2]齐建东,黄金泽,贾昕.基于XGBoost-ANN的城市绿地净碳交换模拟与特征响应[J].农业机械学报,2019,50(05):269-278.

[3]沈倩倩,邵峰晶,孙仁诚.基于XGBoost的乳腺癌预测模型[J].青岛大学学报(自然科学版),2019,32(01):95-100.

[4]黄达文,方芃岚.基于XGBoost算法的用电电量预测的实践应用[J].现代信息科技,2017,1(04):10-12.

[5]徐义峰,陈春明,徐云青.一种改进的k—均值聚类算法[J]计算机应用与软件2008.3vol.25NO.3:275-277

补充说明:

New York City Taxi Trip Duration 建立一个模型,预测纽约市出租车旅行的总行驶时间。 您的主要数据集是纽约市出租车和豪华轿车委员会发布的数据集,其中包括上车时间,地理坐标,乘客人数以及其他几个变量。 https://www.kaggle.com/c/nyc-taxi-trip-duration/data

简介:

数据说明:

train.csv – the training set (contains 1458644 trip records)

test.csv – the testing set (contains 625134 trip records)

列名 解释
Id 每次旅行唯一标识符
vendor_id 指示与行程记录关联的提供者的代码
pickup_datetime 仪表使用的日期和时间
dropoff_datetime 仪表关闭的日期和时间
passenger_count 车辆中的乘客人数(驾驶员输入的值)
pickup_longitude/ dropoff_longitude 仪表 使用/关闭 经度
pickup_latitude/ dropoff_latitude 仪表 使用/关闭 纬度
store_and_fwd_flag 该标志表示在将记录发送到卖方之前,行程记录是否已保存在车辆内存中,因为车辆没有与服务器的连接-Y =存储并转发; N =不是商店和前程
trip_duration 行程持续时间(以秒为单位)

代码参考url:

R语言https://www.kaggle.com/headsortails/nyc-taxi-eda-update-the-fast-the-curious

Python:https://www.kaggle.com/gaborfodor/from-eda-to-the-top-lb-0-367

Python:https://www.kaggle.com/drgilermo/dynamics-of-new-york-city-animation

Python :https://www.kaggle.com/aakashnain/eda-nytaxi

Python :https://www.kaggle.com/karelrv/nyct-from-a-to-z-with-xgboost-tutorial

模型算法参考:

L2和L1正则化:https://blog.csdn.net/red_stone1/article/details/80755144

曼哈顿距离和方位角:https://blog.csdn.net/luoguopeng/article/details/76322348

Kmeans算法参考:https://blog.csdn.net/qq_32892383/article/details/80107795

Xgboost python参考:https://xgboost.readthedocs.io/en/latest/python/python_intro.html

machineLearning-基于XGBoost的出租车出行时间预测》有7个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注