華為雲大數據挑戰賽熱身賽——交通流量預測賽題分析


1 了解賽題

  - 賽題概況

  - 數據概況

  - 預測指標

  - 分析賽題

1.1 賽題概況

本次比賽任務是利用歷史數據並結合地圖信息,預測五和張衡交叉路口未來一周周一(2019年2月11日)和周四(2019年2月14日)兩天的5:00-21:00通過wuhe_zhangheng路口4個方向的車流量總和。

要求模型輸出格式如下:

{"data":{"resp_data":{"wuhe_zhangheng":[1,4,5,6,4...]}}}

從5:00開始每5min的預測數據,第一個數據為5:00-5:05的流量值,最后一個數據為20:55-21:00。兩天的數據按時間先后放在一起,總共有384個數據。

小提示:如果不考慮天氣、周邊活動、節假日等因素,預測結果可能不准確哦。

1.2 數據概況

首先官方給出的數據說明如下:

 將數據集下載下來以后,可以觀察到數據集文件分布如下:

以上每個文件夾對應一個日期下的數據,打開其中一個文件夾,可以看到如下文件:

由文件名不難看出,每個csv文件為當日對應路口方向上的車流量信息,記事本查看結果如下:

對應官方的說明不難看出,第一列數據對應time,第二列為cross,第三列為direction,第四列為leftFlow,第五列為straightFlow

  · time - 時間

  · cross - 路口名

  · direction - 車流起始方向

  · leftFlow - 左轉車流

  · straightFlow - 直行車流

1.3 預測指標

第一部分(分類問題)

分類問題評價標准:預測的評價還是通過每一個5min預測車流和真實通過車流對比,看看趨勢是否一致(比如10月19日的5:00到5:05的真實車流是4,10月20日的5:00到5:05的真實車流為5,那么只要車流預測值大於4,就得100分,最后得分為所有得分求加權平均(權重為該時間段所在小時的車流量占16小時總車流的比重))。

第二部分(回歸問題)

回歸問題評價標准:預測的評價還是通過每一個5min 預測車流和真實通過車流通過grade公式計算最后得分,加權細則與第一部分相同:

其中wi為權重,xj為真實車流數據,xj拔為預測車流數據,ε為e-9。

最后將兩部分分數做歸一化處理,第一部分占比40%,第二部分占比60%。

1.4 分析賽題

1)此題為傳統的數據挖掘問題,通過數據科學以及機器學習深度學習的辦法來進行建模得到結果。

2)此題是一個典型的回歸問題。

3)主要應用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等數據挖掘常用庫或者框架來進行數據挖掘任務。

4)通過EDA來挖掘數據的聯系和自我熟悉數據。

2 初步代碼

  · 數據讀取

   · 評價指標

2.1 數據讀取

由於官方給的數據分布在不同的文件文件夾中,為了方便觀察和拆分訓練測試集,首先需要把他們合並起來,代碼如下:

 1 import pandas as pd
 2 import os
 3 
 4 csv_list = []
 5 # 指定數據集根目錄
 6 root_path = 'C:/Users/animator/Desktop/pre-data/'
 7 # 獲取所有日期對應文件夾名
 8 for i in os.listdir(root_path):
 9     csv_path = root_path + i
10     # 從日期文件夾中獲取所有csv文件並添加到列表中
11     for j in os.listdir(csv_path):
12         r_path = csv_path + '/' + j
13         csv_list.append(r_path)
14 
15 print("發現csv文件個數:",len(csv_list))
16 
17 # 將列表中所有文件的內容重新寫入新文件allData.csv中
18 for i in csv_list:
19     csv = open(i,'rb').read()
20     with open('allData.csv', 'ab') as f:
21         f.write(csv)
22 print("合並完成!")
23 
24 # pandas顯示首尾數據
25 csv_data = pd.read_csv("./allData.csv",header=None,names=['time','cross','direction','leftFlow','straightFlow'])
26 print(csv_data.head(10))
27 print(csv_data.tail(10))

運行結果如下:

2.2 評價指標

2.2.1 分類指標代碼

 1 import numpy as np
 2 
 3 y1 = np.random.randint(0,10,(16,12))
 4 y2 = np.random.randint(0,10,(16,12))
 5 y_ = np.random.randint(0,10,(16,12))
 6 print("前一天天真實值:",y1)
 7 print("當天真實值:",y2)
 8 print("當天預測值:",y_)
 9 r_y_b = (y2 - y1 >= 0)
10 p_y_b = (y_ - y1 >= 0)
11 print('真實趨勢(True為增量>=0,False為增量<0):',r_y_b)
12 print('預測趨勢(True為增量>=0,False為增量<0):',p_y_b)
13 compare = r_y_b==p_y_b
14 print('趨勢比較(True為趨勢相同,False為趨勢不同):',compare)
15 score = compare.astype(np.int)*100
16 print('分值:',score)
17 
18 y_sum = np.sum(y2,axis=1)
19 t_sum = np.sum(y2)
20 print("按小時當日車流量情況:",y_sum)
21 print("當日總車流量為:",t_sum)
22 w = y_sum/t_sum
23 print("各小時占比:",w)
24 
25 grade = 0
26 for i in range(len(w)):
27     grade += (1/12) * np.sum(w[i]*score[i])
28 print("最終分類評分grade=",grade)

運行結果如下:

  

2.2.2 回歸指標代碼

 1 import numpy as np
 2 
 3 def sigmoid(x):
 4     result = 1 / (1 + np.exp(-x))
 5     return result
 6 
 7 
 8 y = np.random.randint(0,10,(16,12))
 9 y_ = np.random.randint(0,10,(16,12))
10 print("當天真實值:", y)
11 print("當天預測值:", y_)
12 
13 y_sum = np.sum(y,axis=1)
14 t_sum = np.sum(y)
15 print("按小時當日車流量情況:",y_sum)
16 print("當日總車流量為:",t_sum)
17 w = y_sum/t_sum
18 print("各小時占比:",w)
19 
20 grade = 0
21 for i in range(len(w)):
22     sum = 0
23     for j in range(len(y[i])):
24         sum += w[i]*sigmoid(30/(pow(y[i,j]-y_[i,j],2)+np.e**-9))*100
25     grade += (1/12)*sum
26 print("最終回歸評分grade=",grade)

運行結果如下:

最后只需要按照官方的評分要求,將分類指標評分和回歸指標評分按4:6進行歸一化就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM