推薦演算法中的特徵工程

語言: CN / TW / HK

分享嘉賓 楊旭東 阿里巴巴 演算法專家

編輯整理:楊佳燁 電子科技大學

出品平臺:DataFunTalk

導讀: 深度學習時代,某些領域,如計算機視覺、自然語言處理等,因為模型具有很強的特徵表達能力,特徵工程顯得不那麼重要了。 但在搜推廣領域,特徵工程仍然對業務效果具有很大的影響,並且佔據了演算法工程師很多精力。 資料決定了效果的上限,演算法只能決定逼近上限的程度,而特徵工程則是資料與演算法之間的橋樑。 今天將和大家分享推薦場景下的特徵工程,主要圍繞下面四點展開:

  • 為什麼要精做特徵工程

  • 何謂好的特徵工程

  • 常用的特徵變換操作

  • 搜推廣場景下的特徵工程

01

為什麼要精做特徵工程

特徵工程就是將原始資料通過一系列變換對映到新的向量空間,使演算法模型能夠在新的向量空間中更好地學習資料中的規律。在完整的機器學習流水線中,特徵工程佔據了資料科學家很大一部分的精力,主要原因是特徵工程能夠顯著提升模型效能,大大簡化模型複雜度,降低模型的維護成本,高質量的特徵在簡單的線性模型上也能表現出不錯的效果。在機器學習領域,“Garbage In, Garbage Out”是業界的共識,特徵工程處於機器學習流水線的上游位置,處理結果的好壞關係到後續模型的效果。

關於特徵工程的三個誤區:

1. 誤區一:深度學習時代不需要特徵工程 

近些年,深度學習在計算機視覺、自然語言處理等領域取得巨大成功。這種end-to-end的學習方式使得在這些領域手工做特徵工程的重要性大大降低,因此可能會有人覺得深度學習時代不再需要人工做特徵工程。然而,在搜尋、廣告、推薦等領域,特徵工程依然是非常重要的,因為這些領域的特徵資料主要以關係型結構組織和儲存。資料行記錄不同的樣本,資料列記錄樣本的不同特徵,以表格形式儲存在資料庫中。所以在關係型資料上的特徵生成和變換操作主要有以下兩大型別:

  • 基於行的特徵變換(row-based) :新的特徵是由同一樣本的其他特徵變換得到的,比如數值型特徵的縮放變換。

  • 基於列的特徵變換(column-based) :對所有樣本資料做統計、聚合才能得到,如最大值、最小值、平均值等。

深度學習模型在一定程度上可以學習到row-based的特徵變換,比如PNN、DCN、DeepFM等都可以建模特徵的交叉組合操作。然而,其很難學習到column-based的特徵變換,這是因為深度模型一次只能接受一個小批次的樣本,無法建模到全域性的統計聚合資訊,而這些資訊通常是十分重要的。因此即使是深度學習模型也是需要精做特徵工程的。

2. 誤區二:有了AutoFE工具就不需要手工做特徵工程

我認為AutoFE的研究尚處於初級階段,在使用效率上的問題還沒有得到很好的解決。另外,特徵工程非常依賴於資料科學家的業務知識、直覺和經驗,通常帶有一定的創造性和藝術性,因此很難被AutoFE工具取代。

3. 誤區三:特徵工程沒有技術含量

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

02

何謂好的特徵工程

高質量的特徵應具有區分度,相互獨立,簡單可解釋性強等特點,對所有的機器學習任務都適用。

在推薦領域,我們對特徵工程有一些其他要求。首先特徵工程的伸縮性要強,支援高基數特徵,支援大資料場景下的推薦任務;其次特徵的設計還要讓模型線上預測的時候支援高併發度,預測效率高;並且特徵的設計要具有靈活性,一個好的特徵工程應該適用於多個模型任務;最後也是最重要的,特徵工程要對資料分佈變化有一定的魯棒性,因為在真實的場景中,資料分佈變化在某種程度上來說是難以避免的,比如電商場景下經常會有些大促活動,這些活動的舉辦就會對資料分佈產生影響,能夠適應這種變化的特徵才稱之為一個好特徵。

03

常用的特徵變換操作

1. 數值型特徵的常用變換

1)特徵縮放

特徵縮放就是把一些取值範圍較大的特徵縮放到較小的範圍內。如果不做特徵縮放,較大值的特徵會支配梯度更新的方向,導致梯度更新在誤差超平面上不斷震盪,模型學習效率變低。另外,一些基於距離度量的演算法,如KNN,K-means等也很大程度上會受到是否進行特徵縮放的影響。不做特徵縮放,取值範圍較大特徵會支配距離函式的計算,導致其他特徵失去作用。常用的特徵縮放方法包括Min-Max、Z-score、Log-based、L2-normalize、Gauss-Rank等,其原理都比較簡單,關鍵在於如何根據不同場景選擇最適合的方法,下面我們通過幾個思考題來具體說明一下:

思考題1:如何量化短視訊的流行度(假設以播放次數來衡量)?

參考答案:短視訊的播放次數在整個樣本空間中服從冪律分佈,即長尾分佈,少量的熱門視訊播放次數會很高,大量的長尾視訊播放次數都相對較少。這個時候最好採用Log-based變換,即先對播放次數取log,取完log之後的值做Z-score標準化處理,最終得到的值分佈比較均勻。如果不做log變換直接用Z-score處理,會導致大部分特徵值被壓縮到一個非常窄的區域。

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

參考答案:首先商品的價格不能量化商品“貴”或“便宜”的程度,因為不同品類的商品價格區間本來差異就很大。比如,1000塊錢買到一部手機,顧客感覺很便宜;但同樣1000塊錢買一隻滑鼠,顧客就會覺得這個商品的定價很貴。因此,量化商品“貴”或者“便宜”的程度時就必須要考慮商品的類目,這裡推薦的做法是做Z-score標準化。要注意的是Z-score的均值和標準差的計算都要限制在同類商品集合內,而不是對整個資料集,並且最好採用葉子類目,即最細一層的類目,但如果葉子類目的商品種類太少,回溯一層也是可以的。

思考題3:如何量化使用者對新聞題材的偏好度(假設以閱讀次數來衡量)?

參考答案:不同使用者的活躍度是不同的,有些高活躍使用者可能對多個題材的閱讀量都比較大,而一些低活躍使用者對可能只對某幾個題材有中等的閱讀量。我們不能因為高活躍度的使用者對某題材的閱讀量大於低活躍度使用者對相同題材的的閱讀量,就得出高活躍度使用者對這種型別的偏好度大於低活躍度使用者對同類型題材的偏好度,這是因為低活躍度使用者的雖然閱讀量較少,但卻幾乎把有限精力全部貢獻給了該型別的題材,高活躍度的使用者雖然閱讀量較大,但卻對多種題材“雨露均沾”。所以建議對這種問題先按照使用者分組,組內再做Min-max歸一化。

最後介紹一下Gauss Rank,是推薦系統中效果比較好的一個特徵變換操作。首先我們對資料的統計值做一個排序,從小到大或從大到小都可以,得到資料的Rank值,然後將Rank值縮放到(-1,1)區間,最後呼叫erfinv逆誤差函式,就可以將變換後的Rank值分佈調整為高斯分佈。深度學習模型偏好高斯分佈的資料輸入,這也是為什麼深度學習中經常使用的一個操作是Batch Normalization。

(2)對異常值的處理

資料中存在異常值(上圖中紅色區域)時,用Z-score、Min-max這類特徵縮放演算法都可能會把轉化後的特徵值壓縮到一個非常窄的區間內,從而使這些特徵失去區分度。這裡介紹一種新的特徵變化方法:Robust scaling,其中median(x)是x的中位數;IQR為四分差,等於樣本中75%分位點的值減去25%分位點的值。經過Robust scaling變換,如上圖最後一列資料所示,資料中較小的值依然有一定的區分性。然而,對於這種存在異常值的資料,最好的處理方法還是提前將異常值識別出來,然後對其做刪除或替換操作。

(3)分箱處理(Binning)

分箱就是將連續的特徵離散化,以某種方式將特徵值對映到幾個箱(bin)中。 比如預測電商場景下使用者的點選率,其中有一個特徵是時間特徵,即一天24小時,但並不是說時間值越大點選率就會越高。 通過歷史資料顯示,深夜事件段使用者點選率都比較低,午飯和晚飯後使用者比較活躍,點選率較高,依靠這些經驗將一天劃分為不同時間段再輸入給模型可以增加模型的表達能力。  

為什麼要做特徵分箱?

  • 引入非線性變換,增強模型效能 。因為原始值和目標值之間可能並不存線上性關係,所以直接使用模型預測起不到很好的效果。

  • 增強模型可解釋性 。通過分箱可以得到一個分段函式,模型可解釋性更強。

  • 對異常值不敏感,防止過擬合。 異常值最終也會被分到一個箱裡面,不會影響其他箱內正常特徵值,分箱的在一定程度上也可以防止過擬合。

  • 最重要的是分箱之後我們還 可以對不同的箱做進一步的統計和特徵組合 。比如按年齡段分箱後對不同年齡段的人群做一個CTR統計。

分箱有無監督和有監督兩種方法 。無監督方法包括固定寬度分箱、分位數分箱、對數轉換並取整等,實際中應用較多,有監督的方法應用較少。下面再做兩個思考題來說明一下分箱的具體應用:

思考題1:如何衡量使用者的購買力?如何給使用者的購買力劃分檔位?

背景 :電商場景下使用者的購買力是一種很好的屬性,可以反映使用者的消費傾向,使用者是傾向於高質量消費還是高性價比消費。購買力是長期的穩定的使用者畫像,與使用者近期的消費金額無關。

參考答案 : 首先要劃分商品的價格檔位,根據商品類目分組,組內按價格升降排序,利用等寬分箱方法得到價格檔位。然後根據使用者的歷史消費行為把其購買過的商品的價格檔位聚合到使用者身上,注意同一個使用者對不同類商品的購買力也是不同的,比如有的使用者願意花高價購買電子產品,對其他種類的商品的購買力一般,因此可以針對每個類目計算購買力。

思考題2:經緯度如何分箱?

參考答案 :經緯度是一個整體,不能把其拆開成多個獨立變數來單獨做分箱,而是要把這些變數當做一個整體來考慮。經常用到的一個方法是GeoHash,簡單來說就是把地圖劃分成一個二維網格,不同的網格有唯一的hash編碼,代表不同的區域。

上圖是使用者在不同類目下行為的統計值,如果做全域性分箱會導致活躍度高的使用者瀏覽過的類目都被分到高桶號中,活躍度低的使用者都被分到低桶號,這並不能很好地區分使用者的偏好程度。比如Alice對Beauty類目的偏好程度與Bob對Sport類目的偏好程度是差不多的,這兩個類目都是彼此的首選,採用全域性分箱無法反映出這種相似性。 因此推薦場景下,使用者的統計特徵需要先按照使用者分組後再做分箱,不建議全域性做分箱 。並且我們分箱後要儲存的應該是箱號,而不是具體範圍值。

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

(1)交叉組合

如上圖,當特徵f1和f2單獨存在時都不具備很好的區分性,組合為一個整體就能夠做出很好的預測。如上圖右邊的散點圖,藍色和黃色分別代表正負樣本x1和x2,本身是線性不可分的,但我們引入一個特徵組合x3=x1x2後就可以用sign(x3)來做預測。

(2)分箱處理

類別型的特徵有時候也是需要做分箱的,尤其是存在高基數特徵時,不做分箱處理會導致高基數特徵相對於低基數特徵處於支配地位,並且容易引入噪音,導致模型過擬合。 類別型特徵的分箱方法通常有以下3種:

  • 基於業務理解 。例如對userID分箱時可以根據職業劃分,也可以根據年齡段來劃分。

  • 基於特徵的頻次合併低頻長尾部分(Back off)。

  • 基於決策樹模型。

(3)統計編碼

統計編碼就是找到一個與類別本身以及目標變數相關的統計量來代替該類別特徵,把類別特徵轉化為一個小巧、密集的實數型特徵向量。

  • Count Encoding,統計某類別型特徵發生的頻次 。一般需要做特徵變換後才能輸入給模型,建議的特徵變換操作包括Gauss Rank、Binning。

  • Target Encoding,統計某類別特徵的目標轉化率 。如目標是點選就統計點選率,目標是成交就統計購買率。同時目標轉化率需要考慮置信度問題,比如10次瀏覽有5次點選和1000次瀏覽500次點選置信度是不一樣的,所以對於小的點選次數我們需要用全域性的點選率做一個平滑處理。

  • Odds Ratio ,可以用來度量使用者對某一類目商品的偏好程度相對於其他類目是什麼樣的水平 。如上圖所示,Alice對Bag類別的偏好程度相當於對其他類別偏好程度的0.7906。

  • Weight of Evidence,度量某類別特徵不同分箱下取值與目標的相關程度 。值為正表示正相關,值為負表示負相關。

3. 時序特徵

時序特徵包括統計過去1天、3天、7天、30天的總行為數或行為轉化率,還可以對當前值和歷史值做差異比較。比如在電商場景下,商品的價格相較於之前是升高了還是降低了可作為使用者購買意願的重要特徵。另外還有行為序列特徵,這是需要模型來配合的。

04

搜推廣場景下的特徵工程

推薦系統是關係型資料下的資料探勘問題,面臨的挑戰主要有高基數特徵、大資料樣本、線上推理的實時性要求等。為了應對這些挑戰,業界最常用的做法是大量使用統計特徵。

通過對使用者或商品某些特徵在不同的行為型別、不同時間週期、不同的標籤上分別統計正負樣本數量得到統計特 徵。 其中不同的標籤對應多目標推薦場景,例如既要做CTR預估又要做CVR預估,點選和轉化是不同的目標,所以我們要分別統計正負樣本。 這些統計量經過特徵變換,包括特徵縮放、分箱和統計編碼後作為最終特徵向量的一部分。 這裡推薦使用Gauss Rank來做特徵縮放,因為Gauss Rank對特徵的分佈變化具有一定的魯棒性,不易收到流量波動的影響。

在統計正負樣本數量之前,要先對推薦的實體(如使用者、物品、上下文)進行分箱,稱為bin counting,如上圖所示。在得到使用者和商品的分箱統計特徵後,我們還可以對這些特徵進行交叉組合得到新的統計量,稱為cross counting,這些統計量最後都會轉化為特徵。

為防止出現特徵穿越,各統計量的統計時間都要放在樣本事件的業務時間之前 ,如上圖時間軸所示,Train predictor階段只能在其之前的Counting部分做統計計數。 最終把各粒度的統計量特徵變換後的值拼接為一整個特徵向量。

那麼如何能把所有的特徵都考慮到,做到不重不漏呢? 可以按照如下描述的結構化方法來列舉特徵:

  • 列存實體 。推薦場景的實體主要是使用者、商品和上下文;廣告場景的實體主要是使用者、廣告、搜尋詞和廣告平臺。

  • 實體分箱 。可以針對使用者或物品的自然屬性來分箱,例如使用者可以針對每一個使用者畫像做分箱,物品可以基於類目、價格等做分箱,得到單維度的特徵,利用歷史行為資訊對單維度特徵做統計、編碼。

  • 特徵交叉 。在實體分箱的基礎上做特徵交叉,得到二階、三階或更高階特徵。

最後總結,搜推廣場景下的常用特徵工程套路可以總結為一個詞“Bin&Counting”,也就是先做bin,再做counting,中間結合cross counting。

05

互動問答

Q1:手動做特徵工程相比於XGBoost、LightGBM等可以自動分箱的方法有什麼優點和缺點?

A1:XGBoost這類樹模型就是我們之前提到的有監督分箱中基於決策樹的方法。這類基於GBDT的模型很難處理高維度的特徵,當特徵維度比較高的時候,它的執行效率是比較低的。我們可以通過這類模型精選一些特徵,然後再把這些特徵輸入給其他模型,如深度神經網路,LR等,相當於利用GBDT作為一個特徵工程來初步提取特徵。

Q2:特徵工程這類經驗性知識怎麼獲取和學習?

A2:學習特徵工程的知識還是要深入理解業務。比如在某個場景下,我們認為年齡是一個比較重要的特徵,但是現階段使用者畫像裡沒有這個特徵,那麼我們首先要想辦法通過一些現有特徵,如使用者的購買行為將年齡值預測出來。雖然預測出的年齡值與真實年齡值存在差異,但使用者的真實年齡並不重要,重要的是他在平臺上購物傾向所體現出的“購物年齡”,我們後續只會針對他的“購物年齡”做一個預測。此外,和有經驗的人或團隊交流也是可以收穫很多特徵工程經驗的。

今天的分享就到這裡,謝謝大家。

在文末分享、點贊、在看,給個3連擊唄~

01 / 分享嘉賓

楊旭東

阿里巴巴  演算法專家

多年推薦演算法從業經驗,知乎專欄《演算法工程師的進階之路》作者。

02 / 免費下載資料

03 / 預約看直播 免費下載PPT

04 / 關於我們

DataFun: 專注於大資料、人工智慧技術應用的分享與交流。發起於2017年,在北京、上海、深圳、杭州等城市舉辦超過100+線下和100+線上沙龍、論壇及峰會,已邀請超過2000位專家和學者參與分享。其公眾號 DataFunTalk 累計生產原創文章700+,百萬+閱讀,14萬+精準粉絲

  分享、點贊、在看 ,給個 3連擊 :point_down: