【數據挖掘】【總結】項目總結之KDD2017

KDD CUP 2017從四月開始做,到今天(0508)已經做了一段時間,成績目前雖然較以前有了不少提升,但距離頂尖還有不少距離。

最近把想到的好實現的東西都實現了,效果也都不錯,但是貌似遇到了瓶頸,現在捋一捋思路,看看還有什麼地方可以繼續提高。

由於目前只做了volume的部分,所以下文中只涉及vol。

Data Analysize

接觸到數據,首先做了一些簡單的分析和可視化。然後定了基本思路。

  1. 定義問題

    • 高速公路收費口流量預測
    • 已知的大部分數據都是高速收費口外(合流區,分流區)的數據

    輸入:

    • 目標區域的道路網絡拓撲
    • 車輛軌跡
    • 車型
    • 收費口歷史流量
    • 天氣
    • 節假日

    輸出:

    • 預測路口A-收費口1之間的通行時間
    • 收費口流量
  2. 可視化

    • plot(y)之後發現時間區間包含了十一假期,流量會有異常,而預測區間內不包含法定節假日,推測該部分數據對預測幫助不大,所以在後來當作異常數據給處理掉了。
    • 流量的週期變化十分明顯,週期爲一天,常識上也認爲每週會有對應的變化。
    • 長期趨勢不明顯。
  3. 基本思路

    • 通行時間和收費口流量應該是強相關的(不一定是同一時段)

    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+。
還是有很多不足,繼續學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章