推薦系統中最重要的兩部分是特征和模型,早期模型上沒有很大突破的時候,人工特征工程是推薦系統發展的主要方向。在這里我總結一下做特征工程的思路和不同特征的處理方式。
1. 創造特征的思路
- 業務背景特征
在推薦系統中猜測用戶是否點擊內容,可以仔細分析用戶從打開手機到看到推薦內容的整個過程中的任何因素,比如這個過程大致分為用戶打開手機、用戶看到推薦內容、用戶是否點擊三個過程,針對用戶打開手機這個動作,可以產生的特征是打開的時間、地點、手機的類型、手機應用啟動時間、手機屏幕大小等因素。針對用戶看到推薦內容這個過程,可以找到的特征有推薦內容出現的位置、推薦內容的類型、推薦內容的大小、推薦內容的出現次數、是否有類似推薦內容、推薦和歷史推薦的相關性等等特征。找業務背景特征需要將自己代入業務環境下,思考自己在整個過程中每一個動作和目標之間的關系,最終找到合適的特征 - 數據本身的特征
針對推薦系統來說,推薦涉及到的物件有用戶、推薦內容、推薦平台、客觀環境因素。這些因素背身的特征也是關鍵的因素 - 交叉特征
在早期,無數的工程師竭盡全力創造特征,無窮的特征被發現,創造特征已經成為流水化工作,想要繼續創造新的特征在今天是一件非常困難的事情,所以更好的方式是利用以往創造的特征,從細粒度上描述用戶,所以就出現了特征交叉創造特征的方式。
2. 特征的處理方法
2.1 離散特征
在推薦系統中,大多數特征是離散特征。同時連續特征也會轉換成離散特征,所以離散特征的處理方式決定整個模型的數據輸入。離散特征通常有LabelEncoding、OnehotEncoding、HashEncoding和Embedding四種處理方式。
2.1.1. LabelEncoding
是將離散特征編碼成連續的數字。sklearn.preprocessing.LabelEncoder工具可以實現這個功能。
優點:
直接、簡單
缺點:
只有簡單的數字,數字容易給對數值敏感的模型帶來損失,比如SVM、LR還有NN模型。所以這種方法很少用到。
2.1.2. OnehotEncoding
OneHotEncoder同樣是對離散特征編碼,離散特征中有多少不同的值,就用多少維來表示該特征。sklearn.preprocessing.OneHotEncoder工具可以實現這個功能。onehot之后成為稀疏矩陣,可以用sparse工具存放。
Onehot主要作用在兩個場景上:
1)文字離散特征進行Labelhot之后。在對數據集進行處理時候我們會遇到一些包含同類別的數據(如:country)。這樣的數據是非numerical的數據,所以我們可以用數字來代替,比如不同的國家我們可以用1,2,3區分不同國家,但是這樣會出現一個比較嚴重的問題。就是國家之間的地位是相同的,但是數字有順序大小之分。所以我們用另一種方法,就是將不同的類別(如不同國家)另外分為一個列,屬於這個國家的設置為1,不屬於的設置為0.
2)數字離散特征。原因同上。
優點:
避免數值長度對模型的影響
缺點:
其一,造成維度過高過稀疏的問題。舉例來說對於普通的離散特征用戶類型,可能只有登錄用戶,未登錄用戶,vip用戶等十幾種用戶類型,onehot后維度只增加十幾維。但是對於用戶ID類型(一般是對象原始ID和hash之后的ID)的離散特征,每個ID之間沒有關聯,每個用戶都有一個ID,ID數量巨大,onehot之后的維度增加到成百上千,甚至更多,特征數量急劇增多,整體成為海量稀疏。其二,onehot只有每個特征只在一個數據點上被激活,完全不具有可推廣性。所以推薦系統針對ID類特征做了HashEncoding和Embedding的轉換,也有開發了FM、FFM以及各種深度Embedding模型。
2.1.3. HashEncoding
針對離散特征中的user_id,advertisement_id,直接做one-hot會導致維度爆炸的問題,通過hashing trick對feature先做hash之后取模降低維度,緩減這一問題。這種方式是目前推薦系統用的最廣泛的方式。
優點:
通過哈希函數自定義變換后的維度長度,節約存儲空間和時間;省掉onehot的對照表,只保留hash函數
缺點:
對於相同意義或者相近的詞語容易產生hash沖突,導致結果共享位置,影響模型;hash之后的結果沒有實際意義;hash之后的結果也無法映射到原來的離散特征。
hash方式在推薦系統中的應用,在這篇文章中總結的很好,有興趣的可以看一下。
2.1.4. Embedding
2010年FM模型首次提出為每個特征學習隱向量的概念,通過模型為每個特征學習到一個相關向量,向量大小可以自定義,向量之間存在相似性。這種方式首次解決了維度變化之后特征失去聯系的問題。之后隨着技術的發展,word2vec、FFM模型、DepFM、item2vec等工具都可以產生特征的embedding向量,后來更是everything 皆可embedding的狀態。
優點:
- Embedding向量可以表示詞語之間的關系。訓練模型的過程中,每個嵌入的向量都會得到更新。如果你看到了博客上面的圖片你就會發現在多維空間中詞與詞之間有多少相似性,這使我們能可視化的了解詞語之間的關系,不僅僅是詞語,任何能通過嵌入層 Embedding 轉換成向量的內容都可以這樣做;
- 向量之間具有語義信息,所以基於向量的操作可以帶來更多特征和信息;
- 向量的長度是可控的。
缺點:
需要大量的語料訓練embedding向量,如果數據較少,embedding學習不充分,結果得不到保證。
2.2. 連續特征
在推薦系統,特征是數值類型,且數值是連續具有實際意義的特征被稱為連續特征。
連續特征的廣泛取值范圍對模型的非常大,模型容易傾向連續特征,所以通常將連續離散化,變成離散特征。
2.2.1. 離散化的好處
- 連續特征重要的不是數值,是分段和所處的位置。比如年齡特征,15歲,這個信息是沒有意義的,但是15處於12-18之間,表示青少年,這個特征更有意義。
- 連續特征經常出現小數和異常數字,這些數字容易使模型產生過擬合現象,離散化之后,沒有具體數值,增加數據的健壯性,避免模型過擬合。
- 離散化后得到稀疏向量,稀疏向量內積乘法運算速度只和有值的向量有關,計算速度非常快,計算結果方便存儲,有大量的優化算法,比如CSR、CSC等
- 離散化后的特征增加和減少非常容易,適合模型的快速迭代
2.2.2. 離散的壞處
離散化將是數值變成符號,損失大量數值,帶來的損失也會降低模型的推薦效果。通常會盡可能地從多種角度離散化,避免信息損失。也會考慮合適的離散化標准,比如分桶離散化中桶的大小,分段離散化中段的間隔等等。
2.2.3.離散化的處理方式
- 分箱
分箱法又分為等寬分箱法和等頻分箱法,前者制定定長的間隔將特征放入不同箱子內,后者根據頻率划分箱子,這兩種做法都有一定的缺陷。
等寬分箱法對異常點比較敏感,比如數據正常范圍是30-60,現在出現了一個特征本來是30不小心讀取成了300,那么寬度會被拉長,實例就主要集中在前面的箱體中,后面的箱體幾乎沒有實例,解決的方法主要是設立閾值移除閾值以外的實例。
等頻分箱法的缺陷是完全按照頻率划分會出現實例特征相同卻不在同一個箱體內的情況,解決辦法也很簡單,在划分完成后進行微調就可完成。 - 1R方法
這個方法是分箱法的有監督版本,把前6個實例放入箱子中,然后后面實例放入箱子時,對比當前實例標簽與箱子中大部分實例標簽是否相同,如果相同放入,如果不相同,那么形成下一個6實例的新箱子,等到最后全部放入箱子中,將箱子中大多數實例標簽作為箱子的標簽,再將標簽相同的箱子合並。在大多數算法中使用的是這種方法。 - 基於卡方的方法
首先將數值特征的每個不同值看做一個區間對每對相鄰區間計算卡方統計量,如果大於閾值就合並,遞歸進行直到找不到卡方統計大於閾值的時候停止。 - 基於熵的方法:
其實就是照搬了決策樹的思路,使用合成的方法或者分裂的方法根據熵計算和閾值判定來決定合成或分裂。
知乎上有個關於離散的見解,個人覺得是個新思路,所以記錄在這里:知乎地址
總結來說:推薦系統的特征流程是數據預處理->離散化->Labelhot->Onehot->Embedding->模型