【資料探勘】【總結】專案總結之KDD2017
序
KDD CUP 2017從四月開始做,到今天(0508)已經做了一段時間,成績目前雖然較以前有了不少提升,但距離頂尖還有不少距離。
最近把想到的好實現的東西都實現了,效果也都不錯,但是貌似遇到了瓶頸,現在捋一捋思路,看看還有什麼地方可以繼續提高。
由於目前只做了volume的部分,所以下文中只涉及vol。
Data Analysize
接觸到資料,首先做了一些簡單的分析和視覺化。然後定了基本思路。
定義問題
- 高速公路收費口流量預測
- 已知的大部分資料都是高速收費口外(合流區,分流區)的資料
輸入:
- 目標區域的道路網路拓撲
- 車輛軌跡
- 車型
- 收費口歷史流量
- 天氣
- 節假日
輸出:
- 預測路口A-收費口1之間的通行時間
- 收費口流量
視覺化
- plot(y)之後發現時間區間包含了十一假期,流量會有異常,而預測區間內不包含法定節假日,推測該部分資料對預測幫助不大,所以在後來當作異常資料給處理掉了。
- 流量的週期變化十分明顯,週期為一天,常識上也認為每週會有對應的變化。
- 長期趨勢不明顯。
基本思路
- 通行時間和收費口流量應該是強相關的(不一定是同一時段)
volume:
- 迴歸:收費口的時空特性,作為feature,應該有個baseline了
- 相似性分析:kNN找出歷史資料中相似情形的流量作為預測(在沒有明顯趨勢特徵的情況下,效果應該可以)
- 更多的研究高速公路特性,收費口上下游流量,可以結合通行時間,test中找出上游流量,以此作為預測
- 時間序列演算法,時序資料平穩化處理。。
- stacking以上。。。
travel time:
- 後面再做
資料預處理
- 異常檢測處理
- 移除十一期間的資料
- 流量基本符合正態分佈,使用
$3\sigma$
原則,對於每個tollgate-dir對計算並刪除界外資料
- 類別特徵編碼
- 基本特徵中的類別特徵均以數值化表示,進一步區分的話進行啞變數編碼
- 簡單的比較發現模型對於編碼不敏感
- 標準化(數值縮放)
- 將所有數值以MaxMinScaler()縮放到(0, 1)
- 對svr, knn有影響
基礎特徵及模型
舉辦方除了提供流量資料,還提供了期間的天氣資訊。
先提取了最直觀的特徵:
- 時間資訊
- 提取流量資料中time_window中的時間資訊。
- month
- day
- day of week
- hour
- time_window of day
- 天氣
- 預設的天氣資料
- 溫度
- 氣壓
- 降水
模型先用了幾個整合樹模型:
- gradient boost tree regression
- random forest regression
- xgb
以及幾個基本模型:
- linear regression
- svm regression
- knn
- decision tree
這裡先用比較粗糙的方式進行預測,存在著很多問題,但是已經有了第一次提交,這時候預設引數下,gb, rf等效果比較好的模型成績已經接近0.20
存在問題:
- 特徵存在較多冗餘。
- 除了tw和dayofweek其他特徵的importance都較低。
- 模型使用預設引數gb欠擬合較嚴重。dt之類過擬合。
交叉驗證
一般步驟是調整模型引數,使預測結果在測試集上的mape更低。
這裡的理解資料分為為訓練集,驗證集,測試集(線上)。
有不同的劃分方法:
- train_test_split劃出訓練集以及驗證集
- 簡單,易於實現
- 資料集較小時,浪費了一部分資料(一般認為資料越多,學習上限越高)
- 與驗證集結果差別較大(驗證集較少時,有過擬合的可能)
- 使用交叉驗證,不需要單獨的驗證集
- 實現需要一定工作量,不過sklearn中集成了不少cv函式,提供了便利。
- 實際交叉驗證的mape可以一定程度和線上成績掛鉤,比較適合作為調參的標準。
- 充分利用資料,目前採用的方法是,使用全部資料做預測,交叉驗證得出一個oof_score。還有一種思路是將交叉驗證中的模型結果做平均,是否存在差別需要嘗試呢,值得思考
存在問題:
- 交叉驗證的結果只能體現模型引數的調整結果。
- 對於超引數(資料,特徵)的調整,交叉驗證的結果還無法用來橫向對比。
- gb等模型交叉驗證的速度較慢。
- grid search目前理解就是流程化的cv比較,需要對每個引數的範圍有所掌握才好使用,所以暫時米有采用。
模型調參
調參首先理解偏差方差均衡,然後調整引數使模型表現處於方差和偏差的均衡位置。
sklearn中模型的大部分引數都是和模型複雜度成正比(其實不然。。。),畫出train_score, 和test_score可以更加直觀。
實際上,目前的經驗來說,直接找到test_score的最低點就好了,這樣引數的train_score的表現可能過擬合,但經驗上來說,線上的成績變化與cv得到的oof_score(test_score)保持一致。
整合模型中常用的引數:
- max_depth(控制子模型中決策樹的深度,直接體現模型的複雜度)
- 同樣的表現,gb(max_depth=3~6), rf(max_depth=5~10)
- n_estimators子模型數量,這個引數與直觀有較大不同。
- 不直接體現模型的複雜度,反而gb中較少的子模型數更可能過擬合
- 與步長(learning_rate)協同調整
- 實際操作中,較大的子模型數可以換來效能的提高(上萬,雖然訓練時間極大增加)
線型模型調參經驗:
- lasso, ridge是lr新增l1, l2正則化項後的演算法
- 二者的區別有待研究
- 正則化是為了減少過擬合
- 目前的資料來看,lr表現為欠擬合,所以兩個改進演算法的表現反而不如lr
svr, knn:
- 這兩個模型涉及到特徵之間距離的計算,所以最好預處理時進行縮放標準化。
特徵工程
特徵提取
短期流量
特徵工程貫穿資料探勘專案的始終,對成績的影響也相當大。放在最後的步驟闡述。
除了基本特徵外,目前加入了短期流量特徵。
考慮到test資料中短期流量只給出了每天的4h,為了避免特徵缺失的情況,將訓練集的時間區間縮減到4h,所幸有限資料集的成績還有些許提升。
考慮到基本模型和特徵均沒有體現趨勢,所以只有4h,對成績的影響不大,後續可以考慮使用全資料集的模型,對結果進行stacking。
短期流量特徵對於不同時間段可能是有缺失的,上一次客流量預測比賽中就卡在了這裡。這一次不想特徵工程做的太難看,所以加入了tw*short_vol作為區分。
more
- 基本特徵的簡單運算
- 模型預測結果(與stacking的區別聯絡呢?)
- 通行時間
特徵篩選
上述特徵中存在不少弱特徵和冗餘,以gb.feature_importaces_為依據簡單的刪掉幾個弱特徵後效能有了一定提升。但是保留的比例該是多少還有待斟酌。
模型整合
做了stacking,較基礎模型有一定提升。
stacking用白話來說就是,對基礎模型再訓練,綜合多個基礎模型,按照準確率分配權重,整合輸出。
模型整合中的基礎模型不止侷限在不同的演算法,可以擴充套件到各種超引數(特徵,資料集等)的組合,可以綜合各種方法優勢。
後續工作
目標:前50(現在130+)
考慮到還有二十天左右時間。還是更多的學習吧,所以travel time先不做了。
下面一週做時間序列演算法
再一週做特徵工程
- 組合已有特徵
- 加入travel time特徵
- 加入模型預測結果作為特徵
- 特徵篩選
賽後更新
之後有了一點進步loss: 0.1439最高在109名,換資料之前也還在200+。
還是有很多不足,繼續學習!