這個本來是準備作為我另一篇文章的一個例子,但是後來越寫越多,因此單獨成文吧。主要講我一直一來耿耿於懷的一個比賽的shake。

題目簡介

根據過去三年厄瓜多某連鎖商店的銷售記錄, 預測54 shops × 3800 items × 16days 的銷量。在僅僅有兩列有效信息的情況下,數據量有7個G之多。

baseline以及帶來的bias

這個比賽裏有一個非常不錯的baseline,將劃分時區滑移,特徵工程的代碼寫的非常簡單明瞭(網址見LGBM Starter),比賽最後幾乎所有隊伍的模型都是在這個baseline基礎上發展起來的,但是我在做的過程中發現這個baseline其實引入了兩個bias:

第一、出題方為了減小訓練集的體積,故數據裏為零的銷量的當天樣本都被刪除了,baseline建模時處理方法直接fillna 為0,這是沒問題的。但是主辦方刪除銷量為零天信息之後,當天是否促銷的信息也刪掉了,由於非促銷佔了絕大多數,baseline於是也是簡單的這部分缺失的信息fill 為false。這就引入了第一個bias,訓練集包括了三種樣本:1.促銷為true且銷量不為零;2.促銷為false且銷量不為零;3.促銷為false且銷量為零。在這樣的數據基礎上訓練,就會得到一個錯誤的結果:只要樣本信息裏促銷為true,則銷量預測必大於等於1,這顯然不符合常理,而且通過對public的prob,也是存在促銷為true且銷量為零的樣本的。第二、這個比賽要求我們預測8.16到8.31的銷量,baseline直接時間滑移為7.26到8.10作為valid,而厄瓜多這個國家的有趣之處在於該國每月1日發薪,故每月的前5天的銷售量要比月均銷售量高出30~10%,也就是說會用這幾天做valid會比test更傾向於往高出擬合。

因此我基於這兩個bias對模型進行了修正:對於第一個促銷為true,則銷量預測必大於等於1的bias,因為是信息缺失,無法做local cv,只能通過public來驗證,因為我採用非常保守的方法,對那些低銷量的預測的結果乘了一個縮小的係數;對於第二bias則是通過local cv來確定,我仔細的把同年4、5、6、7月及前一年8月的下半月都預測了一遍,看到基本下半月的結果基本都是預測結果的95%~98%之間,但出於保守考慮,我也只乘了99%。

賽後的shake以及撕逼

比賽結束前幾天我心裡美滋滋,因為我知道那些只會無腦特徵工程的人肯定沒發現這個問題。但是開榜以後令我大跌眼鏡,那些按照錯誤的baseline做下去的紛紛排名上升。我不做任何bias修正本可以solo第八,做完後處理反倒掉到27名。

正當我不爽的時候,當時的天梯第一giba跳出來說

As I always say: - Trust your local CV. link

在kaggle社區裏,我覺得最嘲諷人的就是說你不懂local cv了,於是sjv馬上跳出來反駁他:由於促銷信息缺失,這題如果能說出trust local cv的言論來意味著根本沒有發現baseline存在bias。

sjv的發言說明我發現的bias是沒錯的,於是我也發了一貼the reason for shaking up,表示名次下降並不是因為沒trust local cv,然後我又在cpmp的8th solution裏說明瞭這個bias,但是很顯然,這兩位當時的天梯第一根本聽不進去。

接下來就引發了sjv和cpmp相互之間的人身攻擊,sjv表示你還丫機器學習還沒入門,去youtube看新手教程吧,cpmp表示我連著兩個時序比賽拿金牌了所以我就是對的。cpmp的這種以結果論英雄邏輯我很反感,何況sjv也是兩個金牌呀。這場撕逼的結果就是sjv直接永久退出比賽圈,搞科研去了(注:sjv是MIT的)。

讓我比較失望的是,我開始以為public前面的人應該都是發現了bias,但是從後面的站隊來看,應該只有sjv, to train them is my cause兩人同意我的觀點,其它人真如giba所說是過擬合public了,根本沒發現bias。

對shake的分析

畢竟數據也是來自於real world,為什麼模型更好反而預測的不如帶有bias的模型呢?有時候就是這麼的無奈,正如我前面所說,模型的兩個bias都是傾向於往高出預測,維持我都進行了縮小處理,萬萬沒想到這一年的八月是「黑天鵝」了嘛,銷量居然要比平時高...帶有bias的模型預測蒙對了帶有bias的result...

一個月後的另一場時序比賽

一個月又進行了一場時序比賽,這是我依然用了對第二個bias的處理方法,結果把我隨手做了一個下午原本400名的模型直接提到了22名A simple method to get 0.009 booster in private(kaggle cto都給點贊~),而sjv的隊友pp二人組則在這個比賽做到冠軍,按照cpmp的以結果論對錯的邏輯,好像還是我們這邊更懂時序比賽local cv哦,算是爭回了一口氣O(∩_∩)O~。

一年半後的回顧和小結

1.在時序預測裏好的模型不一定代表就一定有好的結果,不能以結果論英雄。但是對的就是對的,這次運氣不好,下次也能找回來。

2.現在回頭想,比賽和做研究還不一樣,是隊伍之間橫向的比較,當時就是過於自信自己是對的,兩個submission都做了後處理,沒有拉開區分度,其實對付這種時序題目,完全可以選一個不做後處理的,在錯誤的baseline基礎上去剛特徵工程就行了。giba&cpmp雖然在這場比賽沒有發覺bias,但他們還是值得學習,比如今年的微軟這種數據質量不高的題目以及LANL這種數據很小的,他們又都拿金了,說明他們的在選submmsion的經驗還是夠強。

推薦閱讀:

相關文章