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

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

因爲是第一次參加這種大型的比賽,也知道牛人遍地走,因此當時並無太大的信心,目標是能混進前100就謝天謝地了,結果第一賽季85,第二賽季82,高興之餘也看到了第一頁那些大神們是多麼厲害。面試

 

大致思路基本上是這樣:算法

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

 

二、因爲最終要預測的是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開始,過早的數據過於久遠,咱們認爲沒有參考的價值。另外,全國和分倉分開預測。【一點反思:是否採用滑窗採樣增長一些數據會更好?】函數

 

三、既然是預測數值,那應該是用迴歸,最早考慮是使用SVR(支持向量機),但效果並很差,並且SVR加入懲罰參數C以後訓練變得很慢,因此考慮改變算法。ip

 

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

 

五、因爲調參後算法的結果已經很難再提升,此時發現有些商品直接用前兩週的均值預測效果更好,因而考慮採用GBRT結果和前兩週均值加權平均,效果提升明顯(優於GBRT也優於取平均),另外考慮加入一些修正規則,好比補少成本低於補多成本的,能夠將預測值向下修正(乘上一個小於1的係數),補多成本較低的則將預測值向上修正。qt

 

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

 

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

 

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

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

相關文章
相關標籤/搜索