372/4046
賽題描述
https://tianchi.aliyun.com/competition/information.htm?spm=5176.100067.5678.2.WkzvDo&raceId=231591
給出過去16個月的口碑數據,2k商家,包括商家類型、用戶支付行為、用戶瀏覽行為,用這些數據來預測各個商家在接下來14天(11.01-11.14)每天的客流量。
難點可視化時發現
- 這其中包含雙十一和國慶節的客流預測。但僅有三分之一的商家有去年雙十一的信息
- 每個商家開始加入口碑的時間不一,最晚從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次)
加上所在位置、人均消費、評分、評論數、門店等級、一級品類作為特征