1. 程式人生 > >【特徵工程】1 關於推薦系統中的特徵工程

【特徵工程】1 關於推薦系統中的特徵工程

在多數資料和機器學習的blog裡,特徵工程 Feature Engineering 都很少被提到。做模型的或者搞Kaggle比賽的人認為這些搞feature工作繁瑣又不重要不如多堆幾個模型,想入手實際問題的小朋友又不知道怎麼提取feature來建模型。我就用個性化推薦系統做個例子,簡單說說特徵工程在實際的問題裡是怎麼做。

定義

By feature engineering, I mean using domain specific knowledge or automatic methods for generating, extracting, removing or altering features in the data set.

基本上說是,用目標問題所在的特定領域知識或者自動化的方法來生成、提取、刪減或者組合變化得到特徵。這些特徵可能是顯而易見比如說商品的品牌,也有可能需要複雜的模型計算,比如Facebook上使用者A和使用者B之間關係的緊密程度(FB使用了一個決策樹來生成一個描述這個程度的向量,這個向量決定了他們News Feed推薦內容。)。這篇blog覆蓋了一些用領域知識的方法,自動化方法在這裡沒有提及。

背景

個性化推薦系統 Personalized recommender system 比其他的機器學習方法更依賴特徵工程,所以我拿它來當作問題的背景,結合我之前做過的一個推薦系統裡相關經驗來說說特徵工程具體是個什麼東西。

關於推薦系統和個性化推薦系統,可以參看 wikipediahttp://en.wikipedia.org/wiki/Recommender_system 具體不贅述,以下的要點也儘量點到為止,否則這篇又成了“收藏了Mark了”但是不會讀的冗餘長文。以下如果不特別指出,我就用推薦系統作為“個性化商品推薦系統”的簡稱。簡單來說,推薦系統就是你買了商品A,我們給你算出來個推薦列表 B C D E 等等。商業上來說個性化的推薦比一般化的推薦更能吸引顧客點選或購買,所以利用特徵功能提取這些“個性化”的特徵放到推薦模型裡就很重要,比如在我們的推薦系統裡,把“品牌”的特徵加進去,相對於 baseline 提高了20%左右的nDCG。推薦系統可以是機器學習的模型也可以是基於關聯或者統計規則的模型,對後者來說特徵對推薦效果的提升佔的比重更大。

利用領域知識生成和提取特徵

這幾乎是特徵工程裡佔大半時間的工作了:如何描述個性化並且用變量表示成特徵。一般方法就是,想想你就是該商品的目標使用者,你會想要什麼樣的個性化。

比如說我們做一個女性衣服類的推薦引擎,這個網站賣各種牌子顏色尺寸等。我們列出可能相關的一些特徵,然後在實際購買資料裡面檢查他們是否對購買結果產生影響和關聯性。比如,從購買資料裡可以看出,女性對衣服的品牌多數有固定偏好,比如我太太就很喜歡LOFT的衣服。這些能對購買產生影響的因素都可以成為特徵。

這部分工作需要很多領域知識,一般需要一組的研究人員討論,要認真的思考這個特定問題有些什麼和別的問題不同的特徵,也建議和市場部銷售部等有領域知識的專家討論。經驗上來說,這些特徵提取的越多越好,並不用擔心特徵過多,因為推薦系統的資料量都比較大,並且基於一些規則可以很好的篩選特徵。

很多機器學習的方法也可以拿來提取一些比較不容易得到的直接特徵,比如說原始資料裡面沒有人工標記過商品的顏色,這些顏色可以通過影象識別得到。統計規則也可以從銷售資料裡得到一些特徵,比如該商品的流行程度。

注意,這些特徵可能是固定不變的,比如顏色,品牌等。它也有可能隨著時間變化,比如商品的銷售排名。實際經驗來說,時間變化取樣的顆粒度要按照實際推薦效果來決定,很可能過去三個月的銷售排名對推薦效果來說可以很穩定,也或許昨天的排名對今天的推薦效果比三個月平均更好。

特徵的表達

大家都知道特徵可以是“紅”“綠”“藍”這些離散特徵,也可以是1.57這樣的連續值特徵。一個特徵具體如何表達,要看在它在具體模型上怎麼用。某些特定問題更傾向於離散特徵,因為像推薦系統這樣資料很大的情況可以利用模型訓練這些特徵得到比連續值表達更好的效果。

比如說,商品的流行度可以是一個特徵,因為對於某些流行的商品大家都搶著買,喜歡跟風買熱門商品這一特性可以作為推薦的特徵。我們可以按照銷量排名然後歸一化得到每個商品的流行度值,但是直接用這個連續值會有一些問題,比如說使用者甲買了流行度分數為 0.75 0.5 0.2 0.1的四個商品,使用者乙買了流行度為0.7的一個商品,他們兩個怎麼比?

如果還記得演算法書上說的,定義幾個桶buckets,把流行度分到這幾個buckets裡面,可以解決這個問題。比如定義三個桶:很流行1-0。95,較流行0.95-0.75,普通0.75-0.4。這樣使用者甲的特徵就是[0,1,1]使用者乙的特徵就是[0,1,0],這樣你的推薦模型就可以做一些對比他們倆的相似度或者其他推薦計算了。

順道提一下就是,為什麼在這裡直接把0.4之後的丟掉了以及為什麼取了三個buckets。這個要看具體問題裡面具體特徵的用處。

  1. 如果這個模型是學習訓練出來的,可以用一些feature selection的辦法自動去掉一些不需要的bucket。對於那些不是學習出來的模型比如是簡單的相似性模型,按照實際推薦效果思考一下使用者的行為特徵,需要丟棄一些特徵。我之前包含過0.4以下的部分但是實際測試的時候發現推薦結果會惡化,也就是說對於我們的問題,使用者喜歡跟風買熱門的,但是不喜歡一直買冷門的。
  2. 特徵需要按照實際購買資料進行修正和理解。三個buckets是我們系統裡效果最好的。

一個比較高階的例子是 Facebook 在他們的 Machine Learning meetup 上提到的推薦News feed的特徵。每個使用者對於其他使用者的 news 的點贊和留言以及其他的動作都會得到一個評價值,這是一系列的連續值,直接拿來訓練模型效果不好。他們的做法是做了一個簡單的決策樹,訓練的輸入是這些連續值,訓練目標是看對於使用者A是否應該顯示使用者B的 news 。這個決策樹顯然很粗糙,但是樹的每個葉子節點可以成為一個特徵,那麼這些葉子節點就可以當作使用者A的特徵向量,拿來訓練其他模型比如Logistic Regression,效果不錯。

直接特徵和間接特徵

直接特徵 Extacted Feature 就是比如商品的品牌,間接特徵 Derived Feature 可以是從直接特徵或者各種資料組合裡計算推匯出來的。

間接特徵的一個例子還是品牌特徵,拿女性服飾類舉例。比如我太太很喜歡LOFT的衣服,但如果一個推薦引擎使勁給推薦LOFT牌的衣服,她也會很煩。所以品牌並不完全是一個直接特徵,它可以有一些變化。比如從購買資料裡面看到,購買了LOFT牌衣服的,有20%也購買了J Crew牌,15%也購買了Ann Taylor牌。所以 LOFT 這個特徵應該變成一個向量 [LOFT:1, J_Crew:0.2, Ann_Taylor:0.15, … ]。實際效果上它提高了推薦的多樣性,在多個測試函式中都有不錯的提升。

間接特徵另外一個高階一些的例子就是使用者職業。絕大多數使用者都不會填自己的職業等個人相關資訊,主要是因為隱私或者就是因為麻煩。從使用者的購買記錄和瀏覽記錄裡面,我們可以定義幾個預設的職業型別然後使用者的職業預測到這幾個型別裡。比如使用者買過一些轉換插頭和充電器還有旅行電腦包,所以他可能常外出旅行,所以以後推薦的商品可能是輕便攜帶;又比如使用者買過母嬰用品就知道該使用者可能自己是媽媽或者家裡有小孩。

關於間接特徵我印象最深的是美國亞馬遜上的性別特徵。我有一次給我太太買了給女生修眉毛的剃刀,亞馬遜的推薦內容就立刻從推薦相機滑鼠鍵盤等男性特徵較強的變成了推薦時尚雜誌這種有女性特徵的東西。

間接特徵的提取可以用到很多機器學習的技術,比如根據商品的文字描述提取它的文字向量,以這些文字向量為特徵訓練多分類的分類器,可以把商品分類對應到各種使用者職業特徵上。它也可以利用人工標記的型別列表,比如時尚雜誌的女性特徵。它也可以利用一些統計規則,比如單反相機的購買記錄裡,男性的比例會高於女性,所以單反相機的性別特徵向量可以是購買人數性別的比例值。

特徵選擇

這部分的工作就看起來比較高階一些,比較貼近機器學習的研究工作。一般來說是兩個方法:基於領域知識的手工選擇以及自動選擇方法。

對於關聯規則和統計規則的模型來說,手工選擇的比重要大一些。比如我們已有了baseline的特徵向量,現在加進去品牌偏好,給一定的權值,看評價函式輸出的結果是否增強了推薦效果。對於學習的模型來說,可以通過模型自動選擇每個特徵的權值,按照和效果的關聯來調整模型的引數。這裡需要提醒的是,這個選擇過程不是單增單減,很可能遇到兩個特徵組合A+B效果很好,A+C效果也很好,但是A+B+C效果就呵呵了。個人建議在關聯和統計規則裡面把最重要的幾個特徵放進去然後優化關於這幾個特徵的規則,把複雜的特徵選擇留給學習出來的模型。

自動選擇方法就很多了,用的也是常用的各種自動選擇方法,什麼forward selection啊backward selection啊各種regularization等等,全寫在這裡篇幅就太長,推薦看看一些其他關於機器學習裡 feature selection 的blog和綜述。值得提醒的是選擇方法和評價函式的關聯。推薦系統的評價函式一般不是AUC曲線等按照error計算的函式,也就是說推薦的效果並不是按照“精準”來衡量,要遵循特定問題需要的評價函式比如nDCG,所以以error matrix為標準的一些方法可能效果會不好。比如說用PCA降低特徵的維度很可能把那些對推薦效果很重要的長尾特徵給捨棄了。

特徵的組合變化

這部分工作看起來就比較碉堡,可發揮的空間就看你的想像力和經驗了。這裡的組合變化遠不限於把已有的特徵加減乘除(比如Kernel Tricks之類),我舉個比較有想像力的例子。

現在市面上社交網路裡面“你可能認識的人”的推薦演算法幾乎都是基於補全網路的辦法,這樣推薦的人可能只是單純的補充和完善朋友圈,推薦的人可能很無趣,這樣會導致推薦效果不好讓使用者失去接受推薦的興趣。目測新浪微博用的還是這種補全的方法,因為整天向我推薦丁一晨李開復姚晨等人或者最近關注的人的共同關注人,所以推薦的人很無趣幾乎都不會點關注。

斯坦福小帥哥教授 Jure Leskovec 在2010年的一篇文章“Predicting Positive and Negative Links in Online Social Networks”說到過一種基於使用者反饋的推薦“你可能認識的人”的推薦演算法,他把鄰近三人之間的三角關係總共16種正負反饋的組合當作特徵向量用來表達使用者A和被推薦目標使用者C之間的正負反饋,在圖裡去掉一些已知正負反饋的邊來構建訓練資料,用簡單的Logistic Regression訓練模型達到了不錯的效果。可以谷歌找到這篇文章的幻燈片,裡面有圖示講解。

結語

這篇文章就簡單提及一些特徵工程的常用方法,說的是手工提取特徵,從這些入手可以深入研究研究具體問題的具體做法,這是一個很細緻的工作可以多鑽研鑽研。這裡面沒有說到自動提取方法比如深度學習和卷積網路等等,也沒說到推薦系統的其他方面比如大規模使用者聚類。構建一個推薦系統需要涉及很多東西,絕對不是GraphLab或者Mahout跑個協同過濾就能上馬的,這裡面特徵工程是很重要的一部分工作,在很多其他資料和機器學習的工作裡面特徵工程也差不多是從根本上改變模型效果的重要辦法之一。大家在歡樂調參的過程中不妨考慮考慮搞搞特徵。