繼上篇《個性化推薦101》之後,同學們回報還不夠詳細,可能對沒有做過推薦的同學初上手還是不知所措,或者會踩不少坑,故根據自己的經驗分三篇出一個系列更加詳細的指導文檔(主要針對有監督二分類問題),一步步帶大家入門,做推薦并不難,但是要做好也确實不易,歡迎大家一起學習一起進步。
從自身接觸較多的推薦場景,我把推薦分為兩類吧,
1、出号碼包:這類場景一幫是針對某一具體事件,通過算法模型預測給出一批高潛的号碼包,用于精細化營運。比如CLM中的拉新、拉活、拉回流和流失預警,針對某個或某類活動的高潛參與号碼等等。這裡我姑且把它也算做推薦的一類,因為嚴格說來它是推薦的一個特殊場景,因為推薦一般是1對多的情況,而号碼包這類場景更多的是1對1。
2、個性化推薦:真正意義上的推薦,1對多的場景,在複數的物品中找出最可能符合使用者喜好的推薦給他,是以看得出個性化推薦的效果和落地是最直接的,因為我能直接把使用者喜歡的物品推給他而得到資料層面的落地,但是号碼包一般還需要配合具體的營運政策進行再加工,是以落地較後者是不夠直接,不夠高效的,當然也能通過個性化推薦的方式去出号碼包,這個後面也會講到。
1、 第一步:充分了解清楚推薦場景。這是很關鍵但是很容易被忽視的一步,很多同學接到一個推薦項目就馬上開始搭特征訓練模型了,其實在這之前你應該充分和需求方反複溝通清楚她們的訴求,比如标的群體是什麼、事件或推薦的物品是什麼、最終能以什麼樣的形式落地以及她們需求的目标和期望的效果是怎樣的等等。隻有都搞清楚了每個細節,才能對你要做的推薦有個大概的把握,才好規劃下面應該要怎麼去做好。
2、第二步:提取訓練樣本。作為模型搭建的第二步,着實關鍵,一個不精确的訓練樣本,會嚴重影響最終預測或推薦效果的可用性,而這裡樣本的正确選擇,直接取決于對推薦場景的了解是否到位。下面講講具體方法:
(a)我們用的推薦算法更多是有監督的學習,就拿LR(邏輯回歸)這類二分類算法為例,有監督的意思是我們是從已知去預測未知。首先針對一批使用者群體,我們已經知道了他們針對這個推薦場景下的行為結果(标簽),對于二分類問題也就是1或0(正樣本或負樣本),如參與了活動或沒有參與,點選了遊戲或沒有點選等等,一般情況下有行為的使用者作為正樣本,當然也并不絕對,如流失預警中,流失使用者是作為正樣本的,因為我們的目标是預測可能會流失的使用者。是以正負樣本的選擇取決于你的目标是什麼。
(b)好,搞清楚了你的正負樣本分别是什麼後,再來看看應該分别選多少正負樣本(正負樣本比例),這裡可能有兩種不同的情況:
i. 正樣本是少數。比如活動的參與、遊戲的點選等等,這類情況正樣本較負樣本一般是極少的,是以我們就需要在充分保留正樣本的基礎上來選負樣本,是以這類情況建議保留全部正樣本,再按1:X的比例去選擇負樣本,X具體是多少并沒有嚴格規定,可根據資料量适當決定,一般建議4、5比較合适。
ii. 正樣本是多數。比如流失預警,流失使用者作為正樣本占大多數,負樣本的留存的是少數,那這種情況就需要對正樣本做一個抽樣,再按1:X的方式去選取負樣本。
(c)解決了正負樣本的比例問題之後,就需要去框定你的群體範圍,這個其實就是根據第一步的推薦場景來定的。這裡存在兩個點:
i. 取什麼樣本?比如拉新,那就需要取新使用者群體;如果是流失預警,那就需要取還在活躍的使用者群體;如果是某個活動,那就需要取在這個活動中有曝光的使用者群體。總之取的樣本中對正負樣本的條件是公平的。
ii. 取多長周期?這其實是個比較tricky的問題,可以從以下幾方面考慮:
按需求,也就是根據具體推薦場景要求來定。比如需求的推薦場景就是月流失預警,那你的樣本周期就選取一個月就好了,因為我們一般月流失的定義就是上月活躍下月流失,是以取一個月就比較自然。
按頻率,如果這個推薦場景是頻繁做的,且變化比較大的,也就是說你的模型可能需要經常訓練的,那可以根據這個變化頻率來設定樣本周期。比如例行化的活動,這類場景可能變化比較快,需要根據最近的情況來預測後面幾天的情況,就可以把樣本選取的周期縮短一些,具體還需根據具體場景情況來定。
按資料量,某些場景可能使用者的行為是比較穩定的,是可累加的,這類場景就需要考慮樣本的資料量了,太大的資料量可能增加計算和存儲,是以這裡就需要在周期、資料量和你所擁有的計算資源上做一個平衡了。比如遊戲推薦場景,使用者在某類遊戲場景下,對遊戲的偏好一般是穩定的,不會随時間發生太大的變動,也就是說可累加,這裡就根據資料量來定,一般情況下,如果單日資料量不是特别大,可以考慮覆寫7天的樣本量,這樣也能抹掉一周不同日帶來的一些周期性變化。
(d)最終提取完畢的樣本庫表字段是這樣子的:
号碼包
日期分區
使用者辨別
标簽(1或0)
ftime
uin
label
個性化推薦
物品辨別
item
如果最終訓練的時候,你的樣本表和特征表可以分開輸入模型來訓練,在樣本表時間分區上就有個需要注意的點:處于對例行化的支援,我們加入的日期分區,但對于一次訓練來說,這裡的日期分區一般隻表示為一個日期分區,是以如果樣本選取的周期為多天的情況,就需要保留多一個樣本表存儲保留每天日期分區的樣本便于後續關聯對應的特征表(因為為了保證不同天樣本在特征周期上的一緻性,一般會采取每天的樣本關聯前一天的特征,再合并關聯後多天的資料用于模型訓練,後面會詳細講到)。
3、第三步:搭建特征。樣本準備好了,模型的訓練就還剩下特征的搭建和算法的選擇了。如果說樣本的好壞決定了你的方向正不正,那特征的好壞就決定了你的效果大緻高低水準,是整個過程最難最繁瑣的一步。是以這裡又劃分出了大概兩種不同傾向的做法:
(a)如果使用的是LR這類線性模型,想要刻畫好非線性問題(絕大多數現實中的問題都是非線性的),就需要把特征做的足夠複雜和準确,進而引入足夠的非線性性來彌補算法本身的局限,使其能夠拟合複雜的問題,可以說在這類算法下特征的好壞直接決定了模型的好壞,是以對開發同學在業務和資料上的熟悉和敏感程度要求很高,會花不少時間在特征的選取、組合等操作上。
(b)但如果你對現在的業務不夠熟悉對資料不夠敏感,是不是就不能搭建一個高效的模型來呢?也并不是,可以使用一些非線性的算法,比如FM、GBDT、XGBoost乃至NN,這些算法本身對特征提取的要求就沒有那麼高了,甚至能自動篩選出對模型有價值的特征,自動去做組合特征,一定程度上減少人工提取組合特征的工作。
(c)如果在缺乏特征資料的情況下,還可以通過CF(協同過濾)算法,隻用使用者對物品的1對1的行為資料矩陣來做基于相似度上的推薦,這裡又可以大緻分為基于使用者的CF(user-based)和基于物品的CF(item-based);當然還可以通過word2vec這類文本算法把使用者有行為的物品或其他少量特征擴充為高維空間向量,用向量間的相似度去做推薦,以彌補特征不足的現狀。這些方法後續會慢慢介紹。
那到底選哪種做法比較好呢?我想更多的人肯定選擇 b,能簡單的輸出效果不就好了!嗯同意,但是b方式并不是說不需要搭特征了,隻是對特征的複雜度和精确性要求沒有那麼高,但是好的特征不是更能事半功倍,是以如果特征搭的好,一個簡單的算法可能就會達到很好的效果,畢竟複雜的算法雖然對特征要求不高,但是相應要求的計算量也可能會較大。是以經常聽到這樣的事實,你用複雜的模型訓練了好久出來的效果,可能還沒有一個不懂模型的人用經驗規則簡單排序出來的效果好,說明對業務和資料的敏感在效果提升上的重要性。套用一句話呵呵,算法是死的,特征是活的。是以一開始還是建議同學們從特征入手,了解清楚如何搭建高效的特征,後續配合上合适的算法才能如虎添翼。下篇會着重講下特征搭建的方式方法。
手把手帶你做推薦(二):特征搭建
手把手帶你做推薦(三):算法選擇