天天看點

LR在CTR中的實踐經驗

比如我們要開個網站賣書,使用LR模型預估一下使用者點選某本書的機率。

1 為什麼選用LR

  1. 離線訓練和線上預測非常快
  2. 記憶體占用少
  3. 效果跟xgboost、深度模型差不多
  4. 模型簡單,友善調參
  5. 模型易于解釋,排查問題友善

第4點和第5點非常重要,工作實踐中大多數時間都是在排查問題,根據badcase調參數。

2 特征選擇

使用者側特征:uid、性别、年齡、城市、like_words、等等

商品側特征:itemid、價格、出版社、key_words、等等

比對特征:like_words和key_words的交集、等等

上下文特征:浏覽時間、入網方式、用戶端、等等

2.1 盡量不用統計特征

有些統計特征對預測點選率非常有用,比如:這本書曆史上的點選率、使用者平均每個月買幾本書、圖書的好評率/銷量是多少。但是不建議使用這些統計特征,原因有二:

  1. 在構造樣本時統計類特征很容易出錯,因為統計類特征是動态變化的。比如圖書銷量,你要統計每一次特征的浏覽發生之前該圖書的銷量,那才是使用者當時看到的銷量。這種統計方法說起來也不複雜,但實操過程中很容易出錯。
  2. LR僅利用大規模離散特征就能取得不錯的效果。使用者和圖書曆史的點選率通過uid和itemid這兩個特征就可以學習到,當然這兩個特征必須要one-hot。

2.2 一定要找到影響點選率的主要特征

什麼是“主要特征”?如果該特征取不同的值可能會導緻點選率有十倍百倍的差異,且該特征的不同取值在樣本中的占比都比較大。按照這個定義,你可能會發現like_words和key_words的交集并不是主要特征,而圖書的展現位置才是,第2頁的點選率跟第一頁的點選率可能會差10倍之多。

如果不把主要特征加進來,模型可能就是失效的。

2.3 可以使用替代特征

如果某些比較好的特征甚至是主要特征,剛好是統計類特征,怎麼辦?盡量找到表态特征替代它。舉例:

使用者過去1個月登入過幾次  -->  使用者的app版本号。這兩個特征都可以把比較活躍和非常不活躍的使用者區分開。

使用者下單頻率  -->  使用者的會員等級。這兩個特征都可以把經常購物和不經常購物的使用者區分開。

4 特征的形式

LR模型适合使用大規模離散特征,xgboost适合使用小規模統計類的連續特征。在使用時LR,連續特征隻需要進行簡單的離散化操作,比如直接用round,或者先取對數再round。

4.1 one-hot

把所有特征都離散化之後,再進行one-hot,這樣id類的特征會變成高維稀疏特征,比如你有1億個使用者,那麼光uid就對應1億個特征。訓練模型時隻需要針對那些非 0 的次元更新相應的參數就可以了,模型訓練的 時間複雜度隻跟 X 的非 0 次元數有關。同樣,模型存儲時隻存儲有過更新的參 數即可,記憶體開銷與 X 的總次元沒有關系。

4.2 特征哈希

one-hot 形式得知道總共有多少種取值,才 能對各個取值編号,線上實時訓練模型時我們不可能事先取得所有的樣本,也 就無法窮舉離散特征的所有取值。一種解決辦法是将特征哈希到一個固定的值 域,比如全國的城市數大概在 210 量級,可以把城市名哈希成 [1,214] 上的一個 整數,城市就用 214 維的 one-hot 向量來表示,不同城市被哈希為同一個數字的 機率幾乎為 0,且哈希之後的值直接對應 one-hot 向量中 1 元素的下标。

更簡單的方法是把所有特征都hash到同一個很大(比如2^64)的空間,即把uid、年齡、城市、itemid等等全部使用同一個hash函數進行映射,當然需要把特征名和特征值拼接起來再做hash。由于hash後的空間很大,是以不同特征之間沖突的機率很低。

4.3 特征組合

LR是線性模型,表達能力有限。模型不足,特征來補。通過人工組合特征來使LR具有非線性表達能力。比如“性别_男_手機_ios”可能是個有用的特征,通常兩個特征組合就可以了,超過3階的人工特征組合都沒有什麼收益,這也是為什麼xgboost的深度不建議超過5的原因。特征組合會導緻特征次元極具膨脹,是以不建議高維特征(比如uid)跟其他特征進行組合,不建議高階組合。

其實樹模型學習的就是特征組合,是以可以用xgboost來代替人工的特征組合。

5 調參

這裡的調參,指的是上線後根據發現的badcase來調整參數。

在CTR項目中一個好的模型主要在學習的就是item的熱度,試想一下你打算在電商網站上買一本機器學習相關的書,你大機率會點選那些非常熱門的圖書,在大多數推薦場景中熱度高于個性化因素。

使用FTRL進行訓練的好處在于:學習率是動态調整的,且不同特征上的學習率是不同的。這一點在我的書裡面有詳細的解釋。

有些場景下商品的熱度變化得比較快,模型需要及時感覺到這種變化,itemid對應的學習率就需要調得大一些。

正則化的目的是防止模型去拟合少數的樣本。在你的系統中如果點選率很低,則曆史樣本需要很多得到的點選率才比較可信,此時需要加大itemid上的正則系數。

LR在CTR中的實踐經驗