数据竞赛:记录3天进入比赛Top3%的全过程
原文首發于這里
這幾天花了3天時間嘗試了一個CCF比賽:大數據時代的Serverless工作負載預測。比賽鏈接:https://www.datafountain.cn/competitions/468/teams
這里簡單記錄一下如何利用三天時間進入Top3%,雖然有2000多隊伍,很多人其實從來都沒有認真做過,三天時間本身就超過80%的人了。所以Top3%,其實真沒什么難度,有巨大難度的是Top5,所以標題黨了一下。
數據概覽
比賽類型為時間序列預測。背景:云計算時代,Serverless軟件架構可根據業務工作負載進行彈性資源調整,這種方式可以有效減少資源在空閑期的浪費以及在繁忙期的業務過載,同時給用戶帶來極致的性價比服務。在彈性資源調度的背后,對工作負載的預測是一個重要環節。云計算,由于提交不同的任務需要調度的計算資源是不同的,為了提前應對,需要計算不同隊列未來一段時間需要的資源。
預測任務是不同隊列未來5個時間點的CPU的利用率和隊列中的Job數。一共有以下隊列需要預測
不同隊列的趨勢確實幾乎完全不同,有可能需要針對某些隊列額外進行調整
快速baseline
第一步,當然是去GitHub搜索一下baseline。其實baseline的重要性比優化還大多,假如滿分是100的話,很多baseline已經做到80了,剩下的20分提升才是慢慢調優。果然找到了一個很強的0.311baseline:https://github.com/siliconx/serverless/blob/main/baseline.ipynb
然后,先花了兩天時間,結合baseline看了一下數據,也緩慢的調整到自己熟悉的代碼結構里。我所習慣的保存方式是這樣:
這里我就花了兩天時間了,才算調整跑通一個baseline。所以最后一天才開始提交,而且只有3次提交機會,目標是能跑贏baseline就行了。讀baseline時產生的一些優化想法:
- 對ID和時間的認識往往能夠提分,比如本題預測的就有同一隊列ID不同階段的預測。可能是采集數據的時候發生了異常,比如說把另一個區域的相同id的隊列數據混在了某個隊列中,選手需要自己做一些判斷哪個是原始的數據。
- 由于xgboost和lightgbm需要損失函數二階可微,而評價函數是自定義的不可微函數,這里調整好也可以上分。
當然模型融合也是直觀簡單的,尤其是樹模型和深度學習模型的融合。 - 預測目標上可做的文章也很多,比如log變換,差分變換
優化 - 在baseline的基礎上進行優化,優化的方向主要有任務、數據、特征、模型(包括不同模型與同一模型的超參數、損失函數等)、驗證、后處理等。在時間緊迫而且對數據不熟悉的基礎上,自然是要抓住主要矛盾,主要嘗試的就是新增特征了。本來應該一開始就熟悉數據的,最后慢悠悠的也沒開始看數據。
第三天也就是比賽結束的最后一天下午四點鐘,終于第一次提交了一下:
第一次提交的排名是82/ 2392,四舍五入之后可以說自己排名Top3%。前排其實有不少小號隊伍,再加上肯定有人比我厲害,隨便提交也在我前面。大概可以得出結論,前面真正認真對待比賽的不超過50個隊伍。即使認真做,前十也不容易達到,但10-30這個區間只要早早參賽且不放棄的嘗試還是可以的。如果再互相組組隊,就更有機會了。但是要做好心理準備,時間序列可能大坑,就是最終排行榜會劇烈抖動。
如果是某些傳統行業的公司,參加了數據比賽且排名前3%,已經足夠寫在簡歷上了。大概,就是能從github上clone下代碼并跑通,并修改一下。但是真正幾斤幾兩,自己心里還是要有數的,baseline是0.311,我的提交加了幾個特征是0.320,第一的成績已經到0.4了,差距巨大。
距離最后的提交時間不多了,已經是下午四點鐘,還有兩次提交機會。第二次準備加更多特征,第三次準備從數據ID上看看做文章,或者嘗試新模型了。都這時候了,也不用管本地測試,不用管特征重要性了,就是梭,一把梭哈。萬一shake到我的好運了呢,機會只給有準備的人。當然還是希望前面認真分析數據、認真搞特征的人能取得好成績。
剛開始想特征的時候要大開大合一點,隨便加,能想到的都加上試試效果再說。然后再精細一點,慢慢想,且開始思考word的為啥work,不work的為啥不work。這一次我又新增了特征,主要是時間序列特征:例如差值,比值,smooth。特征從89變成154
五點的時候再次提交。成績來到了0.32623446000,排名71/2399,已經是2.959%,可以名正言順的說自己Top3%了。當然,最后時刻肯定還是瞬息萬變的,尤其是這個位次,而且由于賽制的原因,有很多小號去參加評測,而且還很靠前。
還剩最后一次提交了,最后一次提交,突然覺得根據上一次的成績,搞一個系數,然后直接提交。系數是用來決定趨勢的,首先判斷是大于1還是小于1,應該根據數據來判斷,我也懶得判斷了。所以直接給第四天和第五天增加2%,再取整。 竟然也有0.0005的微小提高。不過總排名還是在不斷下降的,探榜的小號太多了,總隊伍已經2409了。
最終B榜成績排名51
總結
-
由于是抱著娛樂的心態來參賽,所以完全沒有體會到那種跌宕起伏、那種巨大付出之后努力都付之東流的遺憾、那種中學時等待成績排行時的緊張感,這些心情上的東西都沒有體會很深。在年紀越來越大,心情越來越像流水一樣,本想借此回顧一下這種心情,沒想到知道時間不多而毫無壓力了。
-
代碼上的收獲是大致寫了個可復用的時間序列框架,以后如果再遇到多步的時間序列預測,可以很快的調整得以應用到新數據上。不過只寫了lightgbm相關,深度學習部分此次沒有嘗試。
-
特征導入部分分別嘗試了從原始數據直接pipeline一把梭的方式,以及每塊特征保存為pickle挨個加載這兩種方法。
-
時間序列比賽很容易被坑,由于包含外推的預測很可能發生概念漂移,導致以前的規律不準確,排行榜特別容易shake,不建議新人一上來就打時間序列比賽。尤其這次的賽制,有點縱容小號,兩者疊加就完全不建議了。
-
由于時間以及能力原因,對數據和特征沒有很深的理解。極短時間參賽主要目的其實也是為了把框架性東西以及比賽流程熟悉一下,本次就暫告一段落了。
聯系方式
公眾號搜索:YueTan
總結
以上是生活随笔為你收集整理的数据竞赛:记录3天进入比赛Top3%的全过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 异常处理三种方式
- 下一篇: mvc:annotation-drive