競賽1-阿里天池-口碑客流量預測-題解總結

weixin_33751566發表於2017-06-02

372/4046
賽題描述
https://tianchi.aliyun.com/competition/information.htm?spm=5176.100067.5678.2.WkzvDo&raceId=231591
給出過去16個月的口碑資料,2k商家,包括商家型別、使用者支付行為、使用者瀏覽行為,用這些資料來預測各個商家在接下來14天(11.01-11.14)每天的客流量。

3281836-6d84e7ce0a86d3a3.png
評價指標
3281836-f0e8facd231c7986.png
shop_info
3281836-088cbe6e6e7465ba.png
user_pay
3281836-210e6897dca0482c.png
user_view

難點視覺化時發現

  • 這其中包含雙十一和國慶節的客流預測。但僅有三分之一的商家有去年雙十一的資訊
  • 每個商家開始加入口碑的時間不一,最晚從10月份開始
  • 近三個月有的商家記錄不全

</br>
冠軍題解
@CAT https://tianchi-gitlab.aliyun.com/race231591/gitlab-u2323
用了適合一般時間序列問題的時間序列加權迴歸模型(SJH)
將2016.10.11-2016.10.31及2016.9.20-2016.9.26共計28天作為訓練時間段。選擇了2016.10.18到2016.10.31共計14天、全部2000個商家的客流量作為線下測試集。排除了國慶節的干擾。
均值法,但不是簡單的把訓練集的均值當做迴歸,而是遍歷,用Loss確定最佳迴歸值。
加權

  • 權重一:越靠近測試時間段的樣本的權重越大
  • 權重二:對於一個商家,越遠離該商家開始營業的時間的樣本的權重越大。
  • 權重三:週期(一)(這部分沒太看懂。。

</br>
第三名題解
drop-out的團隊用的是knn,根據官方的測評標準SMAPE作為knn的距離,從歷史資料中尋找最相似歷史片段進行預測填充。同時他們隊將資料以一週為單位聚合,每天的具體資料是以佔一周百分比的形式儲存。

</br>
第四名題解
https://tianchi-gitlab.aliyun.com/race231591/gitlab-u3844?spm=5176.836600.0.0.it2qKD

  • 資料預處理
    資料清洗包含三部分,通過規則清除,通過模型預訓練清除及僅保留銷量統計資訊。
    1 )規則清除:比如單個買家異常消費,或對於一家店鋪銷量以歷史過去14天銷量的μ±2σ為限制,其中μ為均值,σ為均方根,以排除異常的銷量數。
    2)通過模型預訓練清除:商家日銷量,可能存在一些難以預計的大幅波動,如促銷,商家停業等。對於這些規則難以清除的異常值,採用預訓練的方式清除。模型訓練中首先採用欠擬合的演算法模型預訓練,並清除殘差最大的10%(xgboost1,GBDT)和25%(xgboost2)的樣本。
    3)僅保留銷量統計資訊:剔除使用者ID。

  • 預測模型
    多套gradient boosting:xgboost1,xgboost2, GBDT
    歷史均值+knn
    雙十一修正:僅有約1/3的商家存在2015年雙11的銷量記錄,需要通過這部分商家去年雙11資訊,預測其餘商家雙11銷量表現。
    採用xgboost單模型訓練,由於雙11當天對應的工作日不同,2015年資料並不能很好反映出2016年雙11節假日情況,且超市便利店類商店存在大量的資料缺失。為防止過擬合,引數設定均較為保守,最大深度為2,且加了較大的正則項,具體如下: max_depth = 2, learning_rate=0.01, n_estimators=500, reg_alpha=10, gamma = 1

  • 模型融合
    調整多套gradient boosting係數,得到的結果再和均值模型融合。最後對雙十一模型進行微調。

</br>
第十六名題解
https://github.com/RogerMonkey/IJCAI_CUP_2017
用到的模型:ARIMA,GBDT,LR,RF,Extremely Randomized Trees
關於Extremely Randomized Trees的部落格:http://blog.csdn.net/zhaocj/article/details/51648966

</br>
自己的思路 -- 372名
最後來說說自己的思路吧,也跟大神們的題解對比對比,找找不足。
這次比賽和@lyq組隊,是我除了練習賽外參加的第一個資料競賽,我們想到這首先是一個時間序列的迴歸問題,通過查詢資料瞭解到處理時間序列常用的兩週演算法:STL分解和ARMA。
STL是Seasonal and Trend decomposition using loess區域性加權迴歸作為平滑方法的一種時間序列分解方法,分解結果又sensoanl部分,trend部分和remainder三部分。
而ARMA是Auto-Regressive and Moving Average Model。對於非平穩序列(如本題)需要差分或二階差分後再應用。
我們分工一個人做STL分解,一個人構造平穩序列使用ARMA,發現後者效果對於本題不好。所以我們採用了STL分解。


首先視覺化發現,國慶部分的銷量異常,雙十一部分也有變動,所以首先從trainset中把國慶部分去掉。然後發現有的店是平日客流高峰,有的是週末高峰。
通過觀察把商家最後分為四類:(根據資料缺失情況和客流情況)

  • 近三個月有缺失值的商家
  • 只有近三個月完整記錄的商家
  • 春節後有完整記錄,且週末高峰的商家
  • 春節後有完整記錄,且平日高峰的商家
    節假日注意調休安排
    Clustering_by_pattern.py

分類高峰就是統計工作日和週末,然後看哪個日均多。Feature_holiday_workday.py
是否有缺失值就是規則統計



資料缺失嚴重的填了均值。
STL分解需要預處理,不然影響很大。異常點去除:規則去除+手動過一遍



分解後就要分別對得到的幾部分做迴歸預測。季節性部分不變。trend用了LR,前n星期線性組合,GBDT。殘差試了一下天氣擬合。



雙十一是怎麼處理的。
線下測評就是往前推了兩週。

統計每天每個店鋪的平均view量和pay量,作為特徵
user_view.py
user_flow.py
user_flow_clsddification.py 回頭客(>5次)

加上所在位置、人均消費、評分、評論數、門店等級、一級品類作為特徵

相關文章