1. 程式人生 > >【資料探勘】【總結】專案總結之KDD2017

【資料探勘】【總結】專案總結之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+。
還是有很多不足,繼續學習!