最好的trick就是保證數據精准前提下,如無必要,不要采樣。既然數據是模型的上限,就不應該破壞這個上限。
聊聊什么是精准。
很多號稱數據清洗的工作,都是工程體系太弱的后果,其實不是算法的問題。比如,沒有曝光日志,用了服務端日志,偽曝光做了負樣本;沒有准確的曝光日志,比如卡片漏出了一個頭用戶根本沒看到就記錄了曝光日志,充當了負樣本;場景里有引流模塊,把用戶在場景外的點擊強插到前面,這個物品的樣本是應當丟掉的,或者在特征上做一些處理,防止把高點擊率歸因給物品,造成整個模型的潰敗。
在精准上,有一個不能稱之為trick的常識,就是處理好點擊事件的delay。構造CTR樣本就是拿曝光日志去join點擊日志,無論這這個日志是在批處理平台還是流式計算平台,由於用戶點擊天然比曝光事件滯后,加上系統本身的延遲,點擊日志會比曝光日志晚到,如果按照一個時間戳截斷兩個日志,會有一些正樣本被誤認為負樣本。如果是天級的樣本,23點之后的樣本有一些是錯的。如果是小時級或流式,曝光日志要delay等待點擊日志多久,要好好評估一下,看看等待多久能讓絕大多數樣本正確。
聊聊什么是必要。
數據量太大,你train不動了,這時候做負樣本的下采樣,但是絕對沒有正向的效果,這也可能是工程體系不夠強大的表現。采樣稍有不慎,還會造成負向效果。做了采樣均值就變了,還要重新矯正預估值,麻煩。
某個用戶行為多,要采樣怕影響整體分布?采樣了才影響整體分布吧,如果數據本身是精准的,我不相信這能有用。
還有人講,說負樣本太多,要采樣。假如是1:1k,其實也沒什么問題。假如是1:1w,那有一億個樣本里才有1w的正例,這個正例本身就太少太偏,業務上這個指標有意義嗎?這個預估不能拆成兩個預估的乘積嗎?如果都不行,我覺得可能用點規則效果更好。
數據彌足珍貴,如無必要,不要采樣,既然數據是模型的上限,就不應該破壞這個上限。好好利用每一條用戶反饋,不出錯,不亂搞,結硬寨,打呆仗,這往往就是最好的策略。