KKTV Data Game 17.11 Benchmarks
KKTV Data Game 17.11
KKTV Data Game 17.11 剛結束,這是今年第四次辦資料遊戲,同時也是第二次公開競賽。題目是提供用戶過往的使用記錄,推測用戶未來一週的觀影時機(資料都經過去識別化的處理)。比賽前經過多次討論,主題定作我隨口說出的 I’m gonna make him a notification he can’t refuse,推播並不是遊戲的主軸,然而這個題目的應用之一是挑選推播的時機與對象。我依然是主辦人之一,除了設定平台設定與資料檢查之外,最有趣的部份當屬提供遊戲的參考基準。這次共有五個不同的基準,呼應教父的經典台詞,五個基準也對應到五個跟教父有關的角色上。
Benchmark: 生倉新八
生倉新八是漫畫《內衣教父》裡的配角。這個基準由隨機猜測產生。這次比賽的評分方式是 AUC,AUC 的特性是隨機猜測的結果會接近 0.5。
Benchmark: 近藤靜也
近藤靜也是漫畫《內衣教父》的主角。我們假設所有的用戶作息都很規律,有些生活充滿朝氣,用日劇通勤開始新的一天;有些生活多采多姿,以韓劇在睡前劃下美好句點。如果所有用戶的生活都如此規律,這週看劇的模式該跟上週相去不遠。所以我們決定把上週的記錄當作答案直接遞交,得到 AUC 0.678。還好分數不漂亮,不然 KKStream 的資料科學家就要失業了。不過這也是我們在設計比賽時做的第一項檢查:資料裡是否暗藏某種規律?0.678 雖然不是高分,但也顯示用戶習慣與時間的關聯性。
一個有趣的問題是:既然隨機猜測的 AUC 是 0.5,什麼人有辦法交出這個比賽的最低分數?為什麼?
Benchmark: Santino Corleone
Santino Corleone 是教父的長子。驗證資料時,直覺是用戶在 T + 1 週的觀影時間點會與第 T 週的的記錄相關。但是如果第 T 週時有些用戶正在準備資料競賽呢?如果有些用戶去員工旅遊了呢?那就用上所有的資料吧!把每週的資料拿來作線性迴歸,可以達到 AUC 0.82。
一個很笨的方法,而且這個做法會在最後一步再次出現。實際上可以直接用函式庫完成。
Benchmark: Michael Corleone
Michael Corleone 是教父的最年輕的兒子。現在流行把能夠變成圖片的資料交給卷積網路,所以做了一些嚐試。不過還是想試 RNN,所以沒花太多時間在這裡。
Loss function 還是選 cross entropy。另外用了 instance norm 跟 leaky ReLu。
Benchmark: Vito Corleone
因為這個題目跟時間有關,而且平常少有機會接觸 RNN,所以這次決定用 RNN 嚐試。
- 建立基本的模型並確定效能跟卷積網路相近,然後隨意調整參數到超越卷積網路的效能。但是調校模型應該有脈胳可尋,不該隨機嚐試,這是我需要特別練習的地方。
- 尋找改善 LSTM 效果的方法,第一次看到把 initial state 當作變數訓練會有比較好的效果。
- 把整個程式改成隨機產生模型(比如 LSTM 一至五層隨機決定)、訓練、驗證並存下每次的結果。這時候發現兩個有趣的現象:隨機模型的效能有個頂點,偶爾會產生接近頂點的結果,但是機會不多。另外上傳的幾次結果裡,驗證集跟測試集間的 AUC 差距變化很小(AUC(validation) — AUC(test) ~ D)。目前為止所有的模型都是用前四萬個用戶的資料當訓練集,餘下的部份當驗證集,每次訓練過程都保留驗證集 AUC 最高時的結果。
- 開始想試 Bagging,修改程式,一次生成數組的訓練集(最後有 90 組),每次都用隨機的模型在隨機的資料分佈上訓練(但是基礎模型應該有缺陷,所以最後單一模型的 AUC 不高)。到這裡其實純粹只想讓分數變高而已,整個方法越多組越不實用。
- 最後手上有大量的結果(約 90 種資料分佈,619 組結果)。這時候發現另一個有趣的現象:有些分佈會出現很好的驗證 AUC,但是跟測試 AUC 相差很遠,我想這是這組資料該特別花時間研究的部份,為什麼不同的訓練資料分佈結果會差這麼多(驗證 AUC 0.8850 ~ 0.8945)。
- 這時有 90 種資料分佈,該如何 ensemble 呢?發揮想像力的時間到了,用了類似線性組合的方式完成。最後的結果 LSTM 最佳 private score 是 0.88957,ensemble 後到 0.89112,增加 0.00155。
- 變種的Ensemble :目的是整合所有夠好的驗證結果,難處是每一個驗證集的的資料分佈不同。做法是列出所有的驗證集結果,假設所有的驗證資料能覆蓋所有的訓練集與驗證集,透過合理的權重加總後可以得到更好的結果。因為每個驗證集不完全吻合,也就是某些用戶的分數只來自部份的模型,這樣的用戶的分數在加權後同時除以這些模型的權重和。然後持續微調權重讓每個測試集以外的用戶加權分數有更好的 AUC,接著把這組權重用在測試集用戶上得到最後的結果。
Next Step
看到排行榜上的分數就想超越,這是我覺得最有趣的部份。下次我會嚐試不同的方法,比如 gradient boost,再用不同的 model 做 ensemble。
Happy data game!