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上的正則系數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM