數(shù)據(jù)中臺(tái):從0到1打造一個(gè)離線推薦系統(tǒng)
編輯導(dǎo)語(yǔ):如今電商平臺(tái)發(fā)展的十分迅速,很多用戶都會(huì)選擇在各種電商平臺(tái)進(jìn)行消費(fèi),并且現(xiàn)在的電商平臺(tái)對(duì)于推薦算法的機(jī)制更加精確;本文作者分享了關(guān)于如何從0到1搭建一個(gè)離線推薦系統(tǒng)的全流程,我們一起來(lái)了解一下。
之前文章講了《數(shù)據(jù)中臺(tái):2個(gè)實(shí)戰(zhàn)案例教你搭建自動(dòng)化營(yíng)銷平臺(tái)》;這篇文章我們以一個(gè)電商類推薦系統(tǒng)項(xiàng)目為例,介紹從0到1搭建一個(gè)離線推薦系統(tǒng)的全流程。
一、離線推薦系統(tǒng)設(shè)計(jì)思路
對(duì)于電商類產(chǎn)品來(lái)說(shuō),實(shí)時(shí)的推薦系統(tǒng)已經(jīng)是標(biāo)配的功能,因此我們的目標(biāo)是做一個(gè)實(shí)時(shí)的推薦系統(tǒng),但如果我們還沒有推薦系統(tǒng),那么一步做出實(shí)時(shí)推薦系統(tǒng)還是有些難度的。
我們可以分兩個(gè)階段實(shí)施,第一階段先設(shè)計(jì)一個(gè)離線的推薦系統(tǒng),做到隔天推薦,第二階段再基于這個(gè)離線的推薦系統(tǒng)進(jìn)行改造,做出實(shí)時(shí)推薦系統(tǒng)。
搭建推薦系統(tǒng)的核心問(wèn)題是召回算法的選擇,在剛開始搭建推薦系統(tǒng)時(shí)可以選擇一些經(jīng)過(guò)驗(yàn)證的、邏輯清晰、運(yùn)營(yíng)穩(wěn)定的召回算法;基于物品的協(xié)同過(guò)濾算法、基于商品內(nèi)容的推薦算法都比較適合電商產(chǎn)品,一些大型的電商巨頭如亞馬遜、淘寶也都在使用。
二、離線推薦系統(tǒng)算法選型
在實(shí)際項(xiàng)目中,我們使用的第一個(gè)召回算法是基于物品的協(xié)同過(guò)濾算法。
構(gòu)建推薦系統(tǒng)的最基礎(chǔ)的算法是基于用戶的協(xié)同過(guò)濾算法和基于物品的協(xié)同過(guò)濾算法,這是標(biāo)配。
上文曾提到這兩個(gè)算法的優(yōu)缺點(diǎn),對(duì)于電商產(chǎn)品來(lái)說(shuō),其實(shí)更適合使用基于物品的協(xié)同過(guò)濾算法,該算法的核心原理是:如果大多數(shù)人購(gòu)買商品a的同時(shí)又購(gòu)買了商品b,那么我們就可以向買了商品a的用戶推薦商品b。
在實(shí)際項(xiàng)目中,我們使用的第二個(gè)召回算法是基于商品分詞的算法。整體思路是:先基于用戶的歷史行為數(shù)據(jù)找出用戶可能喜歡的商品,將商品名稱通過(guò)ES搜索引擎進(jìn)行分詞操作,并且給每個(gè)分詞進(jìn)行打分,然后通過(guò)分詞搜索商品庫(kù)中能夠匹配到的商品,搜索引擎會(huì)自動(dòng)給出匹配的分?jǐn)?shù)。
比如一個(gè)用戶喜歡的商品的名稱為“秋冬新款韓版破洞寬松長(zhǎng)袖T恤”,通過(guò)分詞處理后就可以得出用戶偏好的分詞有秋冬、新款、破洞、寬松等,通過(guò)這些分詞在商品庫(kù)中搜素就能得到可能和“秋冬新款韓版破洞寬松長(zhǎng)袖T恤”相似的商品;這種推薦方式也屬于內(nèi)容推薦的一種,實(shí)現(xiàn)起來(lái)比較容易。
在冷啟動(dòng)的情況下,我們會(huì)用到保底算法。在實(shí)際項(xiàng)目中,我們使用的保底算法基于商品的熱度模型。商品的熱度模型定義了商品近60天的銷售指數(shù),商品的瀏覽人數(shù)、加購(gòu)人數(shù)、收藏人數(shù)等指標(biāo)被分別賦予不同的權(quán)重,用來(lái)計(jì)算商品的熱度。對(duì)于一個(gè)新用戶,或者一個(gè)使用各種召回推薦算法都沒有算出感興趣商品的用戶,我們可以在熱銷商品中篩選出基于用戶偏好的熱銷商品。如果無(wú)法確定用戶的偏好,我們可以直接推薦熱銷的商品給用戶,這是保底策略。
接下來(lái)要選擇排序算法,每個(gè)召回算法都會(huì)計(jì)算出用戶感興趣的商品,那么我們?nèi)绾螐倪@些召回算法推薦出來(lái)的商品中選出一部分推薦給用戶呢?
前文已經(jīng)講過(guò)——如果每個(gè)地方出來(lái)的狀元都彼此不服,那么我們就再統(tǒng)一進(jìn)行一次考試,通過(guò)考試的成績(jī)決定,也就是將這些不同算法推薦出來(lái)的商品進(jìn)行排序;推薦的最終目的是讓用戶瀏覽我們的商品,最理想的結(jié)果就是讓用戶購(gòu)買我們推薦的商品。我們需要預(yù)測(cè)用戶是否會(huì)點(diǎn)擊我們的商品,從而根據(jù)預(yù)測(cè)的點(diǎn)擊率排序。
接下來(lái)筆者介紹一下推薦算法中常用的排序算法:“GBDT+LR”算法。
筆者簡(jiǎn)單介紹一下“GBDT+LR”算法。GBDT(Gradient Boosting Decision Tree),即梯度提升決策樹;LR(Logistic Regression),即邏輯回歸。使用“GBDT+LR”算法預(yù)測(cè)點(diǎn)擊率需要兩個(gè)數(shù)據(jù):特征和權(quán)重。
特征比較好理解,比如一個(gè)用戶的年齡、地址,該用戶近期瀏覽過(guò)某品類的商品的次數(shù),加購(gòu)過(guò)這個(gè)品類的商品次數(shù)類似等,都是特征。
權(quán)重是由人工制定并通過(guò)數(shù)據(jù)再不斷優(yōu)化的參數(shù)。比如一個(gè)用戶如果瀏覽過(guò)這個(gè)品類,我們覺得用戶有40%的可能喜歡該品類;一個(gè)用戶如果加購(gòu)過(guò)這個(gè)品類,我們覺得用戶有60%的可能喜歡該品類。這里面的40%和60%,就是我們?cè)O(shè)定的權(quán)重。
GBDT模型的具體操作可以理解為:不斷對(duì)一個(gè)用戶提問(wèn)。
- 比如向用戶提問(wèn):是女性用戶嗎?
- 如果答案為“是”,再問(wèn):喜歡毛衣嗎?
- 如果答案為“是”,再問(wèn):喜歡哪個(gè)價(jià)格段的毛衣?
這些提問(wèn)按照層級(jí)組織起來(lái)。對(duì)于不同答案再提出不同的新問(wèn)題,直到最后得出最終答案:用戶對(duì)這個(gè)商品滿意嗎?這就是GBDT模型。該模型天然可以肩負(fù)起組合特征的任務(wù),第一個(gè)問(wèn)題相當(dāng)于樹的根節(jié)點(diǎn),最后得到的答案相當(dāng)于葉子節(jié)點(diǎn),整條提問(wèn)路徑就是若干個(gè)特征的組合。
GBDT的優(yōu)點(diǎn)是自動(dòng)挖掘用戶的特征,得到最佳的特征組合,省去構(gòu)建特征工程的煩瑣工作。
邏輯回歸(Logistic Regression, LR)又稱為邏輯回歸分析,是分類和預(yù)測(cè)算法中的一種,通過(guò)歷史數(shù)據(jù)的表現(xiàn)對(duì)未來(lái)結(jié)果發(fā)生的概率進(jìn)行預(yù)測(cè);例如,我們可以將用戶喜歡某商品的概率設(shè)置為因變量,將用戶的特征屬性,例如性別,年齡,注冊(cè)時(shí)間、偏好品類等設(shè)置為自變量。根據(jù)特征屬性預(yù)測(cè)用戶對(duì)某件商品喜歡的的概率。
在實(shí)際項(xiàng)目中,我們可以找產(chǎn)品線的產(chǎn)品/運(yùn)營(yíng)人員一起討論下推薦方案。他們對(duì)業(yè)務(wù)更了解,可能會(huì)提出一些好的建議;比如筆者在構(gòu)建推薦系統(tǒng)過(guò)程中,同公司的產(chǎn)品/運(yùn)營(yíng)人員就提出了以下建議。
1)筆者所在公司的電商產(chǎn)品定位快時(shí)尚女裝,所以幾乎每天都會(huì)新品上架,而新品上架7天后就基本沒有貨了,這種情況給推薦算法帶來(lái)很大挑戰(zhàn);而且新款一般不會(huì)有太多的交易數(shù)據(jù),無(wú)論是基于物品的協(xié)同過(guò)濾算法,還是基于用戶的協(xié)同過(guò)濾算法只會(huì)推薦很少新款。
經(jīng)過(guò)與產(chǎn)品/運(yùn)營(yíng)人員的討論,我們決定為商品打上“新款”或“舊款”標(biāo)識(shí)。因?yàn)槊恳患唐范挤旁谀硞€(gè)專場(chǎng)內(nèi),而專場(chǎng)都有開始時(shí)間和結(jié)束時(shí)間。如果商品所在的專場(chǎng)沒有結(jié)束,那么我們會(huì)給商品打上“新款”標(biāo)識(shí);如果商品所在的專場(chǎng)已經(jīng)結(jié)束,那么我們會(huì)給商品打上“舊款”標(biāo)識(shí)。如此一來(lái),只要提高基于內(nèi)容的推薦算法中“新款”標(biāo)簽權(quán)重,這樣就能更好地推薦新款商品。
2)為了應(yīng)對(duì)實(shí)際的業(yè)務(wù)場(chǎng)景,需要增加一些過(guò)濾條件。比如對(duì)于下架的商品、用戶若干天內(nèi)購(gòu)買過(guò)的商品,我們需要在提交給用戶的最終推薦結(jié)果中將之去除;對(duì)于一些退貨率比較高的商品,我們?cè)O(shè)置了一個(gè)閥值,如果商品的退貨率超過(guò)該閥值,那么這些商品也會(huì)在推薦列表中被統(tǒng)一去除。
3)需要考慮商品的上架時(shí)間和用戶訪問(wèn)高峰期因素。筆者所在公司的電商平臺(tái)一般都是在早晨10點(diǎn)左右上架一次商品,在下午18點(diǎn)左右也會(huì)上架一次商品,而中午12點(diǎn)左右和晚上20點(diǎn)左右是用戶訪問(wèn)的高峰期,也是用戶下單的高峰期。
如果離線推薦系統(tǒng)的計(jì)算引擎只在晚上計(jì)算,那么在早晨10點(diǎn)左右和下午18點(diǎn)左右上架的商品,大部分都不能被推薦出來(lái),這就需要調(diào)整離線推薦系統(tǒng)的計(jì)算調(diào)度;首先在中午12點(diǎn)左右進(jìn)行一次計(jì)算,保證在上午10點(diǎn)左右上架的新品都能出現(xiàn)在用戶的推薦列表中,然后在下午19左右進(jìn)行一次計(jì)算,保證在18點(diǎn)左右上架的新品也能出現(xiàn)在下一次用戶訪問(wèn)高峰期的推薦列表中。
三、離線推薦系統(tǒng)開發(fā)過(guò)程
接下來(lái),筆者從工程角度講一下應(yīng)該如何搭建推薦系統(tǒng)。
1)首先需要數(shù)據(jù)開發(fā)工程師根據(jù)推薦算法的需要準(zhǔn)備幾類數(shù)據(jù)。
第一類是用戶的基礎(chǔ)數(shù)據(jù),如表1-1所示,此類數(shù)據(jù)可以用來(lái)挖掘用戶的特征。
第二類是用戶行為數(shù)據(jù),如表1-2所示,比如用戶在什么時(shí)間對(duì)商品有瀏覽、加購(gòu)、下單等行為。此類數(shù)據(jù)是召回算法的基礎(chǔ)支撐數(shù)據(jù)。
第三類是商品相關(guān)的數(shù)據(jù),如表1-3所示,比如商品的品類、是否上/下架等基礎(chǔ)信息。此類數(shù)據(jù)可以讓算法工程師快速獲得商品的相關(guān)信息。
當(dāng)算法工程師和數(shù)據(jù)開發(fā)工程師按照召回算法和排序算法的規(guī)則完成開發(fā)后,就會(huì)形成最終用戶的推薦結(jié)果,一般存儲(chǔ)在MySQL等關(guān)系型數(shù)據(jù)庫(kù)中,通過(guò)接口對(duì)外提供服務(wù)。
每個(gè)用戶獲得的最終推薦結(jié)果的參數(shù)如下:
- 用戶ID:用戶的唯一標(biāo)識(shí)。
- 商品ID:商品唯一標(biāo)識(shí)。
- 召回算法ID:召回算法的唯一標(biāo)識(shí),用于統(tǒng)計(jì)召回算法的效果。
- 點(diǎn)擊率:用戶點(diǎn)擊的概率,一般是取值在0和1之間的小數(shù)。
- 計(jì)算時(shí)間:產(chǎn)生推薦結(jié)果的時(shí)間,一般存儲(chǔ)近幾次的計(jì)算結(jié)果。
基于推薦結(jié)果的數(shù)據(jù),數(shù)據(jù)中臺(tái)的后端開發(fā)工程師就可以開發(fā)對(duì)外的服務(wù)接口,如表1-4所示;請(qǐng)求參數(shù)包括用戶ID、頁(yè)碼、每頁(yè)商品數(shù)量。響應(yīng)參數(shù)主要包括用戶ID、推薦商品列表,商品列表可以通過(guò)JSON的格式存儲(chǔ)。
2)搭建推薦系統(tǒng)還需要其他部門同事的配合,比如產(chǎn)品線的產(chǎn)品/運(yùn)營(yíng)人員。
運(yùn)營(yíng)人員需要在產(chǎn)品的功能界面中預(yù)留一個(gè)位置,類似淘寶網(wǎng)的“猜你喜歡”頻道,可以基于自己的產(chǎn)品特性來(lái)選擇位置;運(yùn)營(yíng)人員還需要協(xié)調(diào)UI資源,設(shè)計(jì)推薦位的LOGO、背景圖等。
電商產(chǎn)品線的產(chǎn)品經(jīng)理需要協(xié)調(diào)前/后端開發(fā)工程師完成推薦位置的前/后端和數(shù)據(jù)埋點(diǎn)開發(fā)的開發(fā)工作。前/后端開發(fā)工程師負(fù)責(zé)調(diào)用數(shù)據(jù)中臺(tái)的推薦接口,完成推薦功能界面的開發(fā)。
數(shù)據(jù)埋點(diǎn)開發(fā)要解決2個(gè)問(wèn)題:
一是要知道每個(gè)場(chǎng)景、每個(gè)算法、每天的交易額,當(dāng)用戶加購(gòu)時(shí),要把場(chǎng)景ID、算法ID,同商品一起加入購(gòu)物車中,當(dāng)用戶下單時(shí)再將場(chǎng)景ID、算法ID一并加入結(jié)算。
二是我們要統(tǒng)計(jì)每天有哪些用戶訪問(wèn)我們的推薦位,點(diǎn)擊了哪些商品,就需要針對(duì)推薦模塊做一個(gè)常規(guī)的埋點(diǎn),埋點(diǎn)方法可以參考第2章“數(shù)據(jù)采集”部分內(nèi)容;有了這些埋點(diǎn)數(shù)據(jù),我們就可以計(jì)算推薦位每天產(chǎn)生的總交易額、總訪問(wèn)用戶數(shù)等相關(guān)商業(yè)指標(biāo),也可以通過(guò)查看每個(gè)算法的準(zhǔn)確率、召回率、覆蓋率這三個(gè)指標(biāo),來(lái)找到最合適的算法。
數(shù)據(jù)中臺(tái)主要承擔(dān)算法的開發(fā)、推薦接口的開發(fā)、推薦系統(tǒng)的數(shù)據(jù)分析等工作。推薦系統(tǒng)的方案設(shè)計(jì)大概需要1周時(shí)間,另外需要3天的時(shí)間來(lái)評(píng)審方案,電商產(chǎn)品線的產(chǎn)品經(jīng)理進(jìn)行前/后端和埋點(diǎn)的開發(fā)工作大概需要1周的時(shí)間,數(shù)據(jù)中臺(tái)針對(duì)算法的開發(fā)工作大概需要1個(gè)月的時(shí)間。
由此可知,打造一個(gè)簡(jiǎn)單版本的推薦系統(tǒng)預(yù)計(jì)共需要2個(gè)月左右的時(shí)間。
四、離線推薦系統(tǒng)測(cè)試
至此,推薦系統(tǒng)的整個(gè)開發(fā)流程就結(jié)束了,接下來(lái)需要進(jìn)行推薦系統(tǒng)的測(cè)試。
為了方便測(cè)試,我們可以開發(fā)一個(gè)快速拿到每個(gè)用戶推薦結(jié)果的功能,方便產(chǎn)品經(jīng)理和測(cè)試人員查看推薦數(shù)據(jù)。這項(xiàng)開發(fā)工作需要滿足三方面要求。
- 可以快速查詢每種召回算法帶給每個(gè)用戶的推薦結(jié)果。
- 可以快速查詢通過(guò)排序算法生成每個(gè)用戶的最終推薦結(jié)果。
- 可以快速查詢向用戶展示的最終推薦結(jié)果。
要想開發(fā)查詢推薦結(jié)果的功能,最好配上商品的圖片,看商品圖片比看商品名稱,更令人印象深刻,如圖11-13所示,可以快速篩選出某個(gè)算法在某天為某個(gè)用戶推薦的結(jié)果。
用戶推薦界面
測(cè)試工作的流程如下:
1)需要對(duì)召回算法進(jìn)行測(cè)試
召回算法主要需要測(cè)試其算法的邏輯是否正確。一般來(lái)說(shuō),算法工程師和測(cè)試工程師需要合作完成測(cè)試用例的驗(yàn)證。算法工程師按照測(cè)試工程師的要求提供數(shù)據(jù),測(cè)試工程師則負(fù)責(zé)驗(yàn)證算法邏輯的準(zhǔn)確性。
2)需要對(duì)排序算法的結(jié)果和用戶最終的推薦結(jié)果進(jìn)行測(cè)試
因?yàn)檫壿嫳容^復(fù)雜,這兩個(gè)步驟的測(cè)試很有挑戰(zhàn)性。在這里推薦一個(gè)簡(jiǎn)單的方法,項(xiàng)目組可以一起定義幾類典型用戶,比如:無(wú)用戶行為的用戶;有歷史行為數(shù)據(jù),但很久沒來(lái)訪問(wèn)的用戶;有歷史行為數(shù)據(jù)并且最近很活躍的用戶。
對(duì)于第1類用戶,可以驗(yàn)證一下推薦給他們的結(jié)果是否符合冷啟動(dòng)的策略。
對(duì)于第2類用戶,他們雖然有歷史行為,但是歷史行為的數(shù)據(jù)陳舊,無(wú)法再利用,需要驗(yàn)證一下推薦給他們結(jié)果是否符合我們制定的策略。
對(duì)于第三類用戶,可以讓算法工程師基于他們最近的行為,推薦給他們可能喜歡的商品,然后對(duì)比他們喜歡的商品,檢查推薦的商品是否有很大的誤差;假如某用戶喜歡50~100元價(jià)格段的牛仔褲,而我們推薦給他的結(jié)果都是500元以上的牛仔褲,那么推薦結(jié)果就有問(wèn)題了。
3)最后還需要對(duì)過(guò)濾的規(guī)則進(jìn)行測(cè)試
比如對(duì)“用戶近期買過(guò)的商品不能出現(xiàn)在推薦列表中”“退貨、缺貨率很高的商品不能出現(xiàn)在推薦列表中”等過(guò)濾規(guī)則進(jìn)行測(cè)試。
相關(guān)閱讀:
《不以用戶價(jià)值為目的的數(shù)據(jù)指標(biāo)設(shè)計(jì)就是耍流氓》
《數(shù)據(jù)采集實(shí)戰(zhàn):商品詳情頁(yè)數(shù)據(jù)埋點(diǎn)》
#專欄作家#
Wilton董超華,微信公眾號(hào):改變世界的產(chǎn)品經(jīng)理,人人都是產(chǎn)品經(jīng)理專欄作家。暢銷書《數(shù)據(jù)中臺(tái)實(shí)戰(zhàn)》作者,曾任職科大訊飛,現(xiàn)任富力環(huán)球商品貿(mào)易港數(shù)據(jù)中臺(tái)產(chǎn)品負(fù)責(zé)人。主要分享商業(yè)、產(chǎn)品、運(yùn)營(yíng)、數(shù)據(jù)中臺(tái)相關(guān)原創(chuàng)文章。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自 Unsplash,基于 CC0 協(xié)議
- 目前還沒評(píng)論,等你發(fā)揮!