2017/07 -- 2017/09 天池智慧交通預(yù)測(cè)賽思路及模型總結(jié)(二)
前提回顧
前面一篇的天池智慧交通預(yù)測(cè)賽思路及模型總結(jié)(一)中總結(jié)了比賽中的數(shù)據(jù)處理缀踪、特征選擇以及基本機(jī)器學(xué)習(xí)模型的使用缆八,算是一個(gè)baseline的做法吧供搀。
本片博客主要介紹比賽過程中使用到的Static(線性規(guī)則模型)宴偿。
Static模型概覽
LightGBM和Xgboost從回歸模型的角度針對(duì)短時(shí)交通流的預(yù)測(cè)給出了相對(duì)較好的Mape值,一方面來源于特征選取地較為恰當(dāng)钟沛,另一方面是對(duì)模型的參數(shù)集的合理配置。但是通過對(duì)測(cè)試集的預(yù)測(cè)值與真實(shí)值進(jìn)行比對(duì)之后局扶,發(fā)現(xiàn)相對(duì)于時(shí)序數(shù)據(jù)的單點(diǎn)預(yù)測(cè)來說恨统,雖然一次性預(yù)測(cè)未來一個(gè)小時(shí)的所有點(diǎn)總體來看Mape值較低叁扫,但是卻沒有單點(diǎn)預(yù)測(cè)的趨勢(shì)性。針對(duì)這一缺陷延欠,考慮使用模型融合的方式加入趨勢(shì)性信息特征陌兑。
通過對(duì)各個(gè)時(shí)間段travel_time與統(tǒng)計(jì)值指標(biāo)的分析,發(fā)現(xiàn)早高峰89點(diǎn)中位數(shù)和眾數(shù)的線性組合可以總體上逼近真實(shí)值由捎,下午日平峰的1516點(diǎn)更偏向于使用樣本期望來反映兔综,而均值和眾數(shù)的線性組合更適用于晚高峰6~7點(diǎn)。這樣的統(tǒng)計(jì)規(guī)律使我嘗試構(gòu)建線性模型狞玛,實(shí)驗(yàn)證明软驰,這樣的模型測(cè)試結(jié)果同樣具有較好的Mape值指標(biāo)。
既然最終以Mape指標(biāo)為評(píng)測(cè)標(biāo)準(zhǔn)心肪,那么是否可以通過對(duì)樣本的分析從而找出局部最優(yōu)Mape所對(duì)應(yīng)的travel_time锭亏,同樣考慮模型融合的方式將其與LightGBM和線性模型進(jìn)行融合。
最優(yōu)Mape值算法的偽代碼如下所示:
Input: travel_time List Link_id List
Output: The best travel_time with best Mape of each Link_id in every time phases
Global variables:
double bestMape = 100.0;
double bestTravelTime minValue maxValue = 0.0;
double step = 0.1;
ArrayList<Double> travel_time= new ArrayList<Double>();
ArrayList<String> linkIdList = new ArrayList<String>();
----START
maxValue = Collections.max(tmpList);
minValue = Collections.min(tmpList);
for var i to limit by step do
ArrayList<Double> tmpMapeList = new ArrayList<Double>();
double realData = 0.0;
double preData = 0.0;
double sum = 0.0;
double mapeTmp = 0.0;
for(int j=0;j<tmpList.size();j++){
tmpMapeList.add(i);
}
Double[] tmpMapeArray = new Double[tmpMapeList.size()]; //預(yù)測(cè)值
Double[] tmpListArray = new Double[tmpList.size()]; //真實(shí)值
for (int r=0;r<tmpList.size();r++){
realData = tmpList.toArray(tmpListArray)[r];
preData = tmpMapeList.toArray(tmpMapeArray)[r];
sum=sum+(Math.abs(Math.abs(realData)-
Math.abs(preData))/Math.abs(realData));
}
mapeTmp = sum/tmpList.size();
if (mapeTmp < bestMape){
bestMape = mapeTmp;
bestTravelTime = i;
}
-----END