天池智慧交通总结

移动互联网时代的开启使得每出行者都成为交通信息的贡献者,超大规模的位置数据在云端进行处理和融合生成城市全时段

无盲区的交通信息。本届算法挑战赛以“移动互联时代的智慧交通预测”为主题,邀请参赛者基于互联网交通信息建立算法模型,精准预测各关键路段在某个时段的通行时间,实现对交通状态波动起伏的预判,助力社会智慧出行和城市交通智能管控。组委会将通过计算参赛者提交预测值和记录真实值之间的误差确定预测准确率,评估所提交的预测算法。

数据集介绍:

a:路段属性表

每条道路的每个通行方向由多条路段(link)构成,数据集中会提供每条link的唯一标识,长度,宽度,以及道路类型,如表1所示;图1示例了地面道路link1link2的属性信息。


b:link之间按照车辆允许同性的方向存在上下游关系,,数据集中提供每条link的直接上游link和直接下游link,如表2所示;图2示例了link2in_linksout_links


c:link历史通行时间表

数据集中记录了历史每天不同时间段内,2min为一个时间段,每条link上的平均旅行时间,每个时间段的平均旅行时间是基于在该时间段内

进入link的车辆在该link上的旅行时间产出;


大赛提供132条link的静态信息,以及这些link之间的上下游拓扑结构。同时,大赛提供2016年3月至2016年5月每条link每天的旅行时间,以及2016年6月早上[6:00- 8:00)每条link的平均旅行时间。

请选手基于训练数据预测2016年6月份[8:00-9:00)每条link上每两分钟时间片的平均旅行时间。

方法1:利用LR回归来预测

通过比赛提取特征:




  1. # -*- coding: utf-8 -*-  
  2.   
  3. import pandas as pd  
  4. import time  
  5. import numpy as np  
  6. from sklearn import metrics  
  7. from sklearn import tree  
  8. from sklearn.linear_model import LinearRegression  
  9.   
  10. def main():  
  11.     #加载标记数据  
  12.     label_ds=pd.read_csv(r"link_train_0801.txt",sep='\t',encoding='utf8',\  
  13.                          names=['link_id','link_seq','length','width','link_class','start_date','week','time_interval','time_slot','travel_time',\  
  14.                                 'avg_travel_time','sd_travel_time','inlinks_num','outlinks_num','inlinks_avg_travel_time','outlinks_avg_travel_time',\  
  15.                                 'inlinks_atl_1','inlinks_atl_2','inlinks_atl_3','inlinks_atl_4','outlinks_atl_1','outlinks_atl_2','outlinks_atl_3','outlinks_atl_4'])   
  16.     label_ds["link_id"] = label_ds["link_id"].astype("string")  
  17.     label_ds["link_seq"] = label_ds["link_seq"].astype("int")  
  18.     label_ds["length"] = label_ds["length"].astype("int")  
  19.     label_ds["width"] = label_ds["width"].astype("int")  
  20.     label_ds["link_class"] = label_ds["link_class"].astype("int")  
  21.     label_ds["start_date"] = label_ds["start_date"].astype("string")  
  22.     label_ds["week"] = label_ds["week"].astype("int")  
  23.     label_ds["time_interval"] = label_ds["time_interval"].astype("string")  
  24.     label_ds["time_slot"] = label_ds["time_slot"].astype("int")  
  25.     label_ds["travel_time"] = label_ds["travel_time"].astype("float")  
  26.     label_ds["avg_travel_time"] = label_ds["avg_travel_time"].astype("float")  
  27.     label_ds["sd_travel_time"] = label_ds["sd_travel_time"].astype("float")  
  28.     label_ds["inlinks_num"] = label_ds["inlinks_num"].astype("int")  
  29.     label_ds["outlinks_num"] = label_ds["outlinks_num"].astype("int")  
  30.     label_ds["inlinks_avg_travel_time"] = label_ds["inlinks_avg_travel_time"].astype("float")  
  31.     label_ds["outlinks_avg_travel_time"] = label_ds["outlinks_avg_travel_time"].astype("float")  
  32.     label_ds["inlinks_atl_1"] = label_ds["inlinks_atl_1"].astype("float")  
  33.     label_ds["inlinks_atl_2"] = label_ds["inlinks_atl_2"].astype("float")  
  34.     label_ds["inlinks_atl_3"] = label_ds["inlinks_atl_3"].astype("float")  
  35.     label_ds["inlinks_atl_4"] = label_ds["inlinks_atl_4"].astype("float")  
  36.     label_ds["outlinks_atl_1"] = label_ds["outlinks_atl_1"].astype("float")  
  37.     label_ds["outlinks_atl_2"] = label_ds["outlinks_atl_2"].astype("float")  
  38.     label_ds["outlinks_atl_3"] = label_ds["outlinks_atl_3"].astype("float")  
  39.     label_ds["outlinks_atl_4"] = label_ds["outlinks_atl_4"].astype("float")  
  40.     #加载预测数据     
  41.     unlabel_ds=pd.read_csv(r"link_test_0801.txt",sep='\t',encoding='utf8',\  
  42.                          names=['link_id','link_seq','length','width','link_class','start_date','week','time_interval','time_slot',\  
  43.                                 'avg_travel_time','sd_travel_time','inlinks_num','outlinks_num','inlinks_avg_travel_time','outlinks_avg_travel_time',\  
  44.                                 'inlinks_atl_1','inlinks_atl_2','inlinks_atl_3','inlinks_atl_4','outlinks_atl_1','outlinks_atl_2','outlinks_atl_3','outlinks_atl_4'])   
  45.     unlabel_ds["link_id"] = unlabel_ds["link_id"].astype("string")  
  46.     unlabel_ds["link_seq"] = unlabel_ds["link_seq"].astype("int")  
  47.     unlabel_ds["length"] = unlabel_ds["length"].astype("int")  
  48.     unlabel_ds["width"] = unlabel_ds["width"].astype("int")  
  49.     unlabel_ds["link_class"] = unlabel_ds["link_class"].astype("int")  
  50.     unlabel_ds["start_date"] = unlabel_ds["start_date"].astype("string")  
  51.     unlabel_ds["week"] = unlabel_ds["week"].astype("int")  
  52.     unlabel_ds["time_interval"] = unlabel_ds["time_interval"].astype("string")  
  53.     unlabel_ds["time_slot"] = unlabel_ds["time_slot"].astype("int")  
  54.     unlabel_ds["avg_travel_time"] = unlabel_ds["avg_travel_time"].astype("float")  
  55.     unlabel_ds["sd_travel_time"] = unlabel_ds["sd_travel_time"].astype("float")  
  56.     unlabel_ds["inlinks_num"] = unlabel_ds["inlinks_num"].astype("int")  
  57.     unlabel_ds["outlinks_num"] = unlabel_ds["outlinks_num"].astype("int")  
  58.     unlabel_ds["inlinks_avg_travel_time"] = unlabel_ds["inlinks_avg_travel_time"].astype("float")  
  59.     unlabel_ds["outlinks_avg_travel_time"] = unlabel_ds["outlinks_avg_travel_time"].astype("float")  
  60.     unlabel_ds["inlinks_atl_1"] = unlabel_ds["inlinks_atl_1"].astype("float")  
  61.     unlabel_ds["inlinks_atl_2"] = unlabel_ds["inlinks_atl_2"].astype("float")  
  62.     unlabel_ds["inlinks_atl_3"] = unlabel_ds["inlinks_atl_3"].astype("float")  
  63.     unlabel_ds["inlinks_atl_4"] = unlabel_ds["inlinks_atl_4"].astype("float")  
  64.     unlabel_ds["outlinks_atl_1"] = unlabel_ds["outlinks_atl_1"].astype("float")  
  65.     unlabel_ds["outlinks_atl_2"] = unlabel_ds["outlinks_atl_2"].astype("float")  
  66.     unlabel_ds["outlinks_atl_3"] = unlabel_ds["outlinks_atl_3"].astype("float")  
  67.     unlabel_ds["outlinks_atl_4"] = unlabel_ds["outlinks_atl_4"].astype("float")  
  68.       
  69.     outit=pd.DataFrame()#输出结果  
  70.     mr_df=pd.DataFrame()#输出link的mape和rmse  
  71.     mape=0;  
  72.     rmse=0;  
  73.     train_df=label_ds.loc[(pd.to_datetime(label_ds["start_date"])<'2016-06-01')]#训练集  
  74.     valid_df=label_ds.loc[(pd.to_datetime(label_ds["start_date"])>='2016-06-01')]#验证集train_df.sample(frac=0.2)   
  75.     for linkid in range(1,133):  
  76.         #提取训练集、验证集、测试集         
  77.         train_df_id=train_df.loc[(train_df["link_seq"]==linkid)]  
  78.         print "训练集,有", train_df_id.shape[0], "行", train_df_id.shape[1], "列"          
  79.         valid_df_id=valid_df.loc[(valid_df["link_seq"]==linkid)]     
  80.         print "验证集,有", valid_df_id.shape[0], "行", valid_df_id.shape[1], "列"  
  81.         test_df=unlabel_ds.loc[(unlabel_ds["link_seq"]==linkid)]#测试集  
  82.         print "测试集,有", test_df.shape[0], "行", test_df.shape[1], "列"  
  83.         #特征选择  
  84.         #模型训练  
  85.         train_X=train_df_id[['link_seq','time_slot','length','avg_travel_time',\  
  86.                              'inlinks_atl_1','inlinks_atl_2','inlinks_atl_3','inlinks_atl_4','outlinks_atl_1','outlinks_atl_2','outlinks_atl_3','outlinks_atl_4']]  
  87.         train_X=train_X.fillna(0)#空值替换为0  
  88.         train_y = train_df_id['travel_time']#标记  
  89.         model_it=LinearRegression()#tree.DecisionTreeRegressor()  
  90.         model_it.fit(train_X, train_y)     
  91.         #模型验证  
  92.         valid_X=valid_df_id[['link_seq','time_slot','length','avg_travel_time',\  
  93.                              'inlinks_atl_1','inlinks_atl_2','inlinks_atl_3','inlinks_atl_4','outlinks_atl_1','outlinks_atl_2','outlinks_atl_3','outlinks_atl_4']]  
  94.         valid_X=valid_X.fillna(0)#空值替换为0  
  95.         valid_y=valid_df_id['travel_time']  
  96.         pre_valid_y=model_it.predict(valid_X)  
  97.         abs_y=abs(pre_valid_y-valid_y)  
  98.         abs_error=abs_y.sum()#求和  
  99.         mape_id=abs_error/valid_df_id.shape[0]  
  100.         rmse_id=np.sqrt(metrics.mean_squared_error(valid_y, pre_valid_y))#均方差,模型评估  
  101.         print "linkseq="+str(linkid)+"的mape=",mape_id  
  102.         print "linkseq="+str(linkid)+"的RMSE=",rmse_id  
  103.         mr_list=[[linkid,mape_id,rmse_id]]  
  104.         mr_df=mr_df.append(mr_list)  
  105.         mape=mape+mape_id  
  106.         rmse=rmse+rmse_id  
  107.         #模型预测  
  108.         test_X = test_df[['link_seq','time_slot','length','avg_travel_time',\  
  109.                           'inlinks_atl_1','inlinks_atl_2','inlinks_atl_3','inlinks_atl_4','outlinks_atl_1','outlinks_atl_2','outlinks_atl_3','outlinks_atl_4']]    
  110.         test_X=test_X.fillna(0)#空值替换为0  
  111.         test_info = test_df[['link_id','start_date','time_interval']]  
  112.         test_y=model_it.predict(test_X)   
  113.         test_info["travel_time"]=test_y  
  114.         outit=outit.append(test_info)#追加到输出结果  
  115.     print "all mape:",mape/132  
  116.     print "all RMSE:",rmse/132  
  117.     mr_df.to_csv('linkmape.txt',sep='#',index=False,header=None)  
  118.     outit.to_csv('outit.txt',sep='#',index=False,header=None)#输出预测数据   
  119.       
  120. #执行  
  121. if __name__ == '__main__':    
  122.     start = time.clock()    
  123.     main()  
  124.     end = time.clock()    
  125.     print('finish all in %s' % str(end - start))   










  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
天池智慧交通预测挑战赛是由阿里巴巴举办的比赛,旨在通过数据分析和建模预测来优化城市交通系统。参赛者需要利用提供的交通数据集,通过构建模型并进行预测,提供交通出行时间的准确性和效率。这个比赛要求参赛者具备数据分析、建模预测和时间序列预测等相关技能。 参赛者可以先进行准备工作,包括数据集的分割和预处理,然后根据时间序列预测的思路,利用已有的历史数据进行训练模型,并预测未来的交通出行时间。可以根据过去的几个时间点的交通状况预测未来一个时间段的交通状况,进而生成整个月的序列。 具体的建模预测步骤包括:数据集的准备和预处理、特征构建、模型的选择和训练、时间序列预测等。在建模预测过程中,可以使用各种机器学习算法和时间序列预测方法,如回归模型、神经网络、ARIMA模型等,来进行交通出行时间的预测。通过不断调整模型的参数和进行交叉验证,优化模型的性能和准确性。 总之,天池智慧交通预测挑战赛是一个利用数据分析和建模预测的比赛,旨在优化城市交通系统。参赛者可以通过对历史数据的分析和预测,预测未来的交通出行时间,提高交通的准确性和效率。同时,参赛者需要具备数据分析、建模预测和时间序列预测等相关技能。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值