天池比賽 菜鳥-需求預測與分倉規划 賽后總結


比賽結束差不多快2個月了,懶癌發作一直沒寫總結,正好隊友豐哥要參加一個面試,想把當時的思路神馬的總結一下,順手治好了我多年的拖延症吶~

由於是第一次參加這種大型的比賽,也知道牛人遍地走,所以當時並沒有太大的信心,目標是能混進前100就謝天謝地了,結果第一賽季85,第二賽季82,高興之余也看到了第一頁那些大神們是多么厲害。

 

大體思路基本上是這樣:

1、最初先對數據進行觀察,抽樣查看各種商品每個特征的變化規律,先肉眼觀測一下各種特征和最終銷量之間的粗略關系,並發現不是所有商品都擁有完整數據,即有些商品很晚才開始銷售,另外有些商品中間沒有數據,我們采用了填0處理,以保證數據連續性。

 

2、由於最終要預測的是2周(2015.12.28周一-2016.1.10周日)的總需求量(qty_alipay_njhs),我們將數據按照沒2周(周一-周日)為一個周期划分開,並且跳過了雙11(11.10,11.11,11.12)和雙12(12.11,12.12,12.13)以避免這兩個活動產生的異常數據對銷量結果的影響。由於這兩個周期各少了三天,所以所有特征采用取每個周期的平均值,最終預測也是預測2周的平均值,只要再×14就是總需求量(qty_alipay_njhs)。數據采樣基本從2015.6開始,過早的數據過於久遠,我們認為沒有參考的價值。另外,全國和分倉分開預測。【一點反思:是否采用滑窗采樣增加一些數據會更好?】

 

3、既然是預測數值,那應該是用回歸,最先考慮是使用SVR(支持向量機),但效果並不好,而且SVR加入懲罰參數C之后訓練變得很慢,所以考慮改變算法。

 

4、考慮改用GBRT算法(可擬合非線性,且由於是ensemble方法,泛化性較好),成績有所提高,且訓練和預測速度都較快,過程中發現輸入特征由最初的25個減少到5個時效果會有所提高(且有些被刪去的特征的feature_importances_並不為0,可能是剪枝的問題?),另外考察各個參數,其中損失函數為lad時結果最優,其余不表,當時調參沒有采用Grid Search,基本靠手動試值。【一點反思:其實調參還是很有講究的,當時的結果可能陷入了局部最優解,后來發現了知乎上的一篇大神文https://www.zhihu.com/question/34470160只能感慨自己畢竟too young啊!】

 

5、由於調參后算法的結果已經很難再提高,此時發現有些商品直接用前兩周的均值預測效果更好,於是考慮采用GBRT結果和前兩周均值加權平均,效果提高明顯(優於GBRT也優於取平均),另外考慮加入一些修正規則,比如補少成本低於補多成本的,可以將預測值向下修正(乘上一個小於1的系數),補多成本較低的則將預測值向上修正。

 

6、由於在回歸上已經無法提高,經由其他高手交流經驗,嘗試時間序列分析方法(主要是ARIMA),時間序列分析之前,對除雙11、雙12以外的部分異常值進行了異常值過濾。此外,我們還將商品分為數據量<21天的和數據量≥21天的兩種,前者直接采用均值預測,后者采用時間序列方法預測,之后在python中使用rpy2庫,調用R中的auto.arima,自動預測結果。然而效果跟GBRT半斤八兩。

 

7、再次考慮融合方法,並加入另一種時間序列分析方法ETS,此外將GBRT換成了xgboost,最終結果由XGBR、前兩周均值、ARIMA、ETS四者加權平均而成,這就是第一賽季的思路了。

 

第二賽季基本上是沿襲了第一賽季的思路,由於阿里的平台沒有提供時間序列類的方法,所以我們只能考慮xgboost和均值的加權平均,可能由於平台比較蛋疼,第二賽季參加的人少,所以前進了那么一丟丟。

其實回頭來看,這次在實戰中真是現學了很多東西,比如ARIMA這種,但欠缺的地方還是太多太多,尤其是特征工程這一塊,幾乎等於是沒有做(包括完全沒有想過要歸一化或者標准化之類的處理……),而調參上則是根本沒有理解參數的意義,完全靠瞎貓碰死耗子,諸如此類的還有很多,真的是還有很長的路要走。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM