工業(yè)級推薦系統(tǒng)中的特征工程

摘要:深度學習時期,與CV、語音、NLP領域不同,搜推廣場景下特征工程仍然對業(yè)務效果具有很大的影響,并且占據(jù)了算法工程師的很多精力。數(shù)據(jù)決定了效果的上限,算法只能決定逼近上限的程度,而特征工程則是數(shù)據(jù)與算法之間的橋梁。本文嘗試總結一些在推薦場景下做特征工程的常用套路,包括常用的特征變換算子、Bin-Counting技術以及特征查漏補缺的方法。

讀者受益

  1. 深入理解常用的特征變換操作。
  2. 了解優(yōu)質(zhì)特征工程的判斷標準。
  3. 掌握推薦場景下構建高質(zhì)量特征的一般方法。

一、為什么要精做特征工程

在完整的機器學習流水線中,特征工程通常占據(jù)了數(shù)據(jù)科學家很大一部分的精力,一方面是因為特征工程能夠顯著提升模型性能,高質(zhì)量的特征能夠大大簡化模型復雜度,讓模型變得高效且易理解、易維護。在機器學習領域,“Garbage In, Garbage Out”是業(yè)界的共識,對于一個機器學習問題,數(shù)據(jù)和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。

在一個完整的機器學習流水線中,特征工程處于上游位置,因此特征工程的好壞直接影響后續(xù)的模型與算法的表現(xiàn)。另外,特征工程也是編碼領域專家經(jīng)驗的重要手段。

關于特征工程的三個誤區(qū):

1. 誤區(qū)一:深度學習時代不需要特征工程

深度學習技術在計算機視覺、語音、NLP領域的成功,使得在這些領域手工做特征工程的重要性大大降低,因此可能會有人覺得深度學習時代不再需要人工做特征工程。然后,在搜索、推薦、廣告等領域,特征數(shù)據(jù)主要以關系型結構組織和存儲,在關系型數(shù)據(jù)上的特征生成和變換操作主要有兩大類型,一種是基于行(row-based)的特征變換,也就是同一個樣本的不同特征之間的變換操作,比如特征組合;另一種是基于列(column-based)的特征變換,比如類別型特征的分組統(tǒng)計值,如最大值、最小值、平均值、中位數(shù)等。



模型可以一定程度上學習到row-based的特征變換,比如PNN、DCN、DeepFM、xDeepFM、AutoInt等模型都可以建模特征的交叉組合操作。盡管如此,模型卻很難學習到基于列的特征變換,這是因為深度模型一次只能接受一個小批次的樣本,無法建模到全局的統(tǒng)計聚合信息,而這些信息往往是很重要的。綜上,即使是深度學習模型也是需要精準特征工程的。

2. 誤區(qū)二:有了AutoFE工具就不再需要手工做特征工程

3. 誤區(qū)三:特征工程是沒有技術含量的臟活累活

很多學生和剛參加工作不久的同事會有一種偏見,那就是算法模型才是高大上的技術,特征工程是臟活累活,沒有技術含量。因此,很多人把大量精力投入到算法模型的學習和積累中,而很少化時間和精力去積累特征工程方面的經(jīng)驗。其實,算法模型的學習過程就好比是西西弗斯推著石頭上山,石頭最終還會滾落下來,這是因為算法模型的更新迭代速度太快了,總會有效率更高、效果更好的模型被提出,從而讓之前的積累變得無用。另一方面,特征工程的經(jīng)驗沉淀就好比是一個滾雪球的過程,雪球會越滾越大,最終我們會成為一個業(yè)務的領域專家,對業(yè)務貢獻無可代替的價值。

機器學習工作流就好比是一個廚師做菜的過程,簡單來說,清洗食材對應了清洗數(shù)據(jù),食材的去皮、切片和搭配就對于了特征工程的過程,食物的烹飪對應了模型訓練的過程。如果你覺得數(shù)據(jù)清洗和特征工程不重要,莫非是你想吃一份沒有經(jīng)過清洗、去皮、切片、調(diào)料,而直接把原始的帶著泥沙的蔬菜瓜果放在大鍋里亂燉出來的“菜”? 先不說衛(wèi)生的問題,能不能弄熟了都是個問題。

非常建議大家閱讀一下這篇文章《帶你輕松看懂機器學習工作流——以“點一份披薩外賣”為例》。

二、什么是好的特征工程

高質(zhì)量特征需要滿足以下標準:

  1. 有區(qū)分性(Informative)
  2. 特征之間相互獨立(Independent)
  3. 簡單易于理解(Simple)
  4. 伸縮性( Scalable ):支持大數(shù)據(jù)量、高基數(shù)特征
  5. 高效率( Efficient ):支持高并發(fā)預測
  6. 靈活性( Flexible ):對下游任務有一定的普適性
  7. 自適應( Adaptive ):對數(shù)據(jù)分布的變化有一定的魯棒性

參考:《何謂好的特征

三、常用的特征變換操作

1. 數(shù)值型特征的常用變換

a) 特征縮放

為什么要做特征縮放?

如果不做特征縮放,取值范圍較大的特征維度會支配梯度更新的方向,導致梯度更新在誤差超平面上不斷震蕩,模型的學習效率較低。另外,基于距離度量的算法,如KNN,k-means等的效果也會很大程度上受到是否做特征縮放的影響。不做特征縮放,取值范圍較大的特征維度會支配距離函數(shù)的計算,使得其他特征失去本應有的作用。

常用的特征縮放方法如下:

盡管這些特征縮放的方法操作起來都很簡單,屬于一學就會的內(nèi)容,但想要達到熟練應用的程度還是比較難的,需要有一定的業(yè)務經(jīng)驗的積累,“知行合一”是一種很高的境界。關鍵在于是否知道在什么場景下該用什么樣的特征縮放方法。下面我們通過幾個思考題來測試一下自己的掌握程度。

思考題1: 如何量化短視頻的流行度(假設就用播放次數(shù)來代替)?

參考答案:短視頻的播放次數(shù)在整個樣本空間上遵循冪律分布,少量熱門的視頻播放次數(shù)會很高,大量長尾的視頻播放次數(shù)都較少。這個時候比較好的做法是先做log based的變換,也就是先對播放次數(shù)取log,再對log變換之后的值做z-score標準化變換。如果不先做log變換,就直接做z-score或者min-max變換,會導致特征值被壓縮到一個非常狹窄的區(qū)域。

思考題2:如何量化商品“貴”或者“便宜”的程度?

參考答案:商品的價格本身無法衡量商品“貴”或“便宜”的程度,因為不同品類的商品價格區(qū)間本來就可能差異很大,同樣的價格買不同類型的產(chǎn)品給顧客的感受也是不一樣的,比如,1000塊錢買到一部手機,顧客感覺很便宜;但同樣1000塊錢買一只鼠標,顧客就會覺得這個商品的定價很貴。因此,量化商品“貴”或者“便宜”的程度時就必須要考慮商品的品類,這里推薦的做法是做z-score標準化變化,但需要注意的是商品價格的均值和標準差的計算都需要限制在同品類的商品集合內(nèi)。

思考題3:如何量化用戶對新聞題材的偏好度?

參考答案:為了簡化,假設我們就用用戶一段時間內(nèi)對某類新聞的閱讀數(shù)量表示用戶對該類新聞題材的偏好度。因為不同用戶的活躍度是不同的,有些高活躍度用戶可能會對多個不同題材的新聞閱讀量都很大,而另一些低活躍度的用戶可能只對有限的幾種類型的新聞有中等的閱讀量,我們不能因為高活躍度的用戶對某題材的閱讀量大于低活躍度用戶對相同題材的的閱讀量,就得出高活躍度用戶對這種類型的偏好度大于低活躍度用戶對同類型題材的偏好度,這是因為低活躍度用戶的雖然閱讀量較少,但卻幾乎把有限精力全部貢獻給了該類型的題材,高活躍度的用戶雖然閱讀量較大,但卻對多種題材“雨露均沾”。建議做min-max歸一化,但需要注意的是計算最小值和最大值時都限制在當前用戶的數(shù)據(jù)上,也就是按照用戶分組,組內(nèi)再做min-max歸一化。

思考題4:當存在異常值時如何做特征縮放

當存在異常值時,除了第6種gauss rank特征變換方法外,其他的特征縮放方法都可能把轉換后的特征值壓縮到一個非常狹窄的區(qū)間內(nèi),從而使得這些特征失去區(qū)分度,如下圖。這里介紹一種新的稱之為Robust scaling的特征變換方法。x_{scaled}=\frac{x-median(x)}{IQR}

四分位距(interquartile range, IQR),又稱四分差。是描述統(tǒng)計學中的一種方法,以確定第三四分位數(shù)和第一四分位數(shù)的差值。

參考答案:存在異常值,使用Robust scaling或者gauss rank的特征縮放方法。

b) 特征分箱(binning)

數(shù)值型特征的分箱即特征離散化,按照某種方法把特征值映射到有限的幾個“桶(bin)”內(nèi)。

比如,可以把1天24個小時按照如下規(guī)則劃分為5個桶,使得每個桶內(nèi)的不同時間都有類似的目標預測能力,比如有類似的購買概率。

  1. 0-3 Night: 較低的購買概率
  2. 4-7 Early morning: 中等的購買概率
  3. 8-14 Morning/Lunch: 較高的購買概率
  4. 15-20 Afternoon: 較低的購買概率
  5. 21-23: Evening: 高購買概率

為什么需要做特征分箱?

  1. 映入非線性變換,可增強模型的性能
  2. 增強特征可解釋性
  3. 對異常值不敏感、防止過擬合
  4. 分箱之后可以對不同的桶做進一步的統(tǒng)計和組合(與其他特征的交叉)

有哪些分箱方法?

  • 無監(jiān)督分箱
    • 固定寬度分箱(等寬)
    • 分位數(shù)分箱(等寬)
    • 對數(shù)轉換并取整(對數(shù))
  • 有監(jiān)督分箱
    • 卡方分箱
    • 決策樹分箱

思考題1:如何度量用戶的購買力?如何給用戶的購買力劃分檔位?

背景:用戶的購買力衡量的用戶的消費傾向,度量用戶是愿意花高價買高質(zhì)量商品還是愿意花低價買便宜商品。購買力屬于用戶畫像的一部分,是比較長期的穩(wěn)定的,跟近期用戶在平臺上的消費金額無關。

參考答案:
第一步是給商品劃分價格檔位。根據(jù)商品的類目分組,組類按照商品價格排序,并按照等頻或者等寬的分箱方式,得到價格檔位。
第二步是聚合用戶的購買力檔位。根據(jù)用戶的歷史消費行為,把購買商品的價格檔位聚合到用戶身上。

思考題2:地理位置(經(jīng)緯度)如何做分箱?

參考答案:一個物理量如何有多個維度才能表示,那么在做分箱時不能拆分成獨立的多個變量來單獨做分箱,而要這些變量當成一個整體來考慮。經(jīng)緯度的分箱有一個成熟的算法叫做GeoHash,這里就不展開了。

在推薦系統(tǒng)中,用戶的統(tǒng)計特征需要按照用戶分組后再做分箱,不建議全局做分箱。在上面的例子中,Bob對不同Category的行為次數(shù)都比較高,但卻“雨露均沾”,不如Alice對Beauty類目那么專注。如果全局分箱,<Alice, Beauty>、<Bob, Sport>的桶號是不同的,然而Alice對Beauty類目的偏好程度與Bob對Sport類目的偏好程度是差不多的,這兩個類目都是彼此的首選。全局分箱會讓模型學習時比較困惑。

2. 類別型特征的常用變換

a) 交叉組合

如上圖,mean表示預測目標target(二分類)的均值,特征f1和f2單獨存在時都不具備很好的區(qū)分性,但兩種組合起來作為一個整體時卻能夠對target有很好的預測性。

如上圖,當只有x_1x_2時,目標(用藍色和黃色分別表示正樣本和負樣本)不是線性可分的,當引入一個組合特征x_3=x_1x_2時就可以用sign(x_3)來預測目標了。

b) 分箱(binning)

高基數(shù)(high-cardinality)類別型特征也有必要做特征分箱。這是因為高基數(shù)特征相對于低基數(shù)特征處于支配地位(尤其在tree based模型中),并且容易引入噪音,導致模型過擬合。甚至一些值可能只會出現(xiàn)在訓練集中,另一些可能只會出現(xiàn)在測試集中。

類別型特征的分箱方法通常有如下三種:

  1. 基于業(yè)務理解自定義分箱規(guī)則,比如可以把城市劃分為華南區(qū)、華北區(qū)、華東區(qū)等。
  2. 基于特征的頻次合并低頻長尾部分(back-off)。
  3. 基于決策樹模型。

c) 統(tǒng)計編碼

  1. Count Encoding

統(tǒng)計該類別型特征不同行為類型、不同時間周期內(nèi)的發(fā)生的頻次。

  1. Target Encoding

統(tǒng)計該類別型特征不同行為類型、不同時間周期內(nèi)的目標轉化率(如目標是點擊則為點擊率,如目標是成交則為購買率)。
目標轉化率需要考慮置信度的問題,當置信度不夠的時候,需要做平滑,拿全局或者分組的平均轉化率當當前特征的轉化率做一個平滑,公式如下。


  1. Odds Ratio

優(yōu)勢比是當前特征取值的優(yōu)勢(odds)與其他特征取值的優(yōu)勢(odds)的比值,公式為:\theta=\frac{p_1/(1-p_1)}{p_2/(1-p_2)}

假設用戶對類目的行為統(tǒng)計數(shù)組如下:

User,Category Number of clicks Number of non-clicks
Alice,1001 7 134
Bob,1002 17 235
Joe,1101 2 274

那么優(yōu)勢比的計算方法如下:
\frac{(5/125)/(120/125)}{(995/19875)/(18880/19875)}=0.7906

  1. WOE(weight of evidence)

WOE度量不同特征取值與目標的相關程度,越正表示越正相關,越負表示越負相關。

WOE=ln\left( \frac{Event\%}{NonEvent\%} \right)

3. 時序特征

  • 歷史事件分時段統(tǒng)計
    • 統(tǒng)計過去1天、3天、7天、30天的總(平均)行為數(shù)
    • 統(tǒng)計過去1天、3天、7天、30天的行為轉化率
  • 差異
    • 環(huán)比、同比
  • 行為序列
    • 需要模型配合

四、搜推廣場景下的特征工程

在搜索、推薦、廣告場景下高基數(shù)(high-cardinality)屬性表示為特征時的挑戰(zhàn)

  • Scalable: to billions of attribute values
  • Efficient: ~10^(5+) predictions/sec/node
  • Flexible: for a variety of downstream learners
  • Adaptive: to distribution change

為了克服這些挑戰(zhàn),業(yè)界最常用的做法是大量使用統(tǒng)計特征,如下:

對各種類別型特征或離散化之后的數(shù)值型特征,以及這些特征之間的二階或高階交叉組合,按照不同行為類型、不同時間區(qū)間、不同目標(針對多目標任務)分別統(tǒng)計正樣本和負樣本的數(shù)量。這些統(tǒng)計量經(jīng)過特征縮放/分箱和目標編碼后可以作為最終特征向量的一部分。推薦的特征縮放方法為gauss rank,或者使用分箱操作。推薦的目標編碼方法包括Target Encoding、優(yōu)勢比、WOE等。

在統(tǒng)計正負樣本數(shù)量之前,需要對任務涉及的不同實體(如,用戶、物品、上下文等)進行分箱,再統(tǒng)計分箱變量的正負樣本數(shù)量。該操作方法叫做bin counting。這里的binning操作可以是任意的映射函數(shù),最常用的按照實體的自然屬性來分箱,比如商品可以按照類目、品牌、店鋪、價格、好評率等屬性分箱,用戶可以按照年齡、性別、職業(yè)、愛好、購買力等分箱。

另外,為了防止label leakage,各種統(tǒng)計量的統(tǒng)計時間段都需要放在在樣本事件的業(yè)務時間之前(注意圖片下方的時間軸)。最后把各種粒度的統(tǒng)計量處理(縮放、分箱、編碼等)后的值拼接起來作為特征向量的一部分。

那么,怎么樣才能把所有可能的特征都想全了,做到不重不漏呢?可以按照如下描述的結構化方法來枚舉特征。

  1. 列存實體(entity);如果廣告業(yè)務場景的用戶、廣告、搜索詞、廣告平臺。
  2. 實體分箱 & 單維度統(tǒng)計/編碼
  3. 特征交叉 & 多維度統(tǒng)計/編碼

對實體分箱可以玩出很多花樣,比如可以從文本描述信息中抽取關鍵詞作為分箱結果;或者可以基于embedding向量聚類,聚類的結果簇作為分箱結果。然后需要對這些分箱結果進行多輪兩兩交叉得到二階、三階或更高階的組合特征。最后,對這些單維度(一階)特征和各種高階組合特征分別統(tǒng)計不同行為類型(點擊、收藏、分享、購買等)、不同時間周期(最近1天、3天、7天、30天等)、不同學習目標(點擊、轉化等)下的正、負樣本數(shù)量,對這些統(tǒng)計量進行特征縮放、分箱、編碼后作為最終的特征。

五、總結

搜推廣場景下的常用特征工程套路可以總結為一個詞“bin-counting”,也就是先做binning,再做counting,當然別忘了做cross counting。

原文鏈接:https://zhuanlan.zhihu.com/p/518308463

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容