本文首發(fā)于 博客園
大家可能經(jīng)常會(huì)聽(tīng)到用戶(hù)畫(huà)像這個(gè)詞,但是具體在做的時(shí)候又會(huì)覺(jué)得無(wú)從下手,或者認(rèn)為只是常規(guī)的標(biāo)簽統(tǒng)計(jì),這往往是一個(gè)誤區(qū)。本人在某互聯(lián)網(wǎng)企業(yè)從事了將近一年半的用戶(hù)畫(huà)像開(kāi)發(fā)。從一個(gè)剛剛接觸用戶(hù)畫(huà)像的小菜鳥(niǎo),到現(xiàn)在逐漸成長(zhǎng)為畫(huà)像開(kāi)發(fā)的主力程序員,中間有許多的感受與經(jīng)驗(yàn)想總結(jié)下來(lái),分享給大家,大家也可以討論討論。
用戶(hù)畫(huà)像的應(yīng)用
用戶(hù)畫(huà)像是目前數(shù)據(jù)挖掘當(dāng)中比較容易入門(mén)的一個(gè)領(lǐng)域。它比較熱門(mén)的應(yīng)用便是推薦,最近常說(shuō)的千人千面的核心基礎(chǔ)便是構(gòu)建人群的畫(huà)像,通過(guò)人群的不同畫(huà)像來(lái)做到個(gè)性化推薦。另外廣告也是非常需要用戶(hù)畫(huà)像的支持,通過(guò)個(gè)性化的廣告推送,也可以提高廣告的點(diǎn)擊率,帶來(lái)更高的廣告收入。其次用戶(hù)畫(huà)像很多時(shí)候都是可以做為銷(xiāo)售的線索打包出售給特定的公司和合作伙伴來(lái)直接獲取利潤(rùn)或者交換數(shù)據(jù)。
如果我們將一個(gè)用戶(hù)各方面的畫(huà)像整合起來(lái)使用,它的身份,性別,教育程度,學(xué)歷信息,收入大致范圍,購(gòu)買(mǎi)力,常用位置等等標(biāo)簽一目了然,一個(gè)人的整體形象就躍然紙上。你有時(shí)候會(huì)覺(jué)得隨著用戶(hù)畫(huà)像的技術(shù)的完善,用戶(hù)的隱私會(huì)越來(lái)越少。我目前供職的還僅僅只是一家中型互聯(lián)網(wǎng)公司,用戶(hù)量也并非很多,對(duì)用戶(hù)的各種畫(huà)像挖掘就已經(jīng)到了一個(gè)令我震驚的程度,阿里騰訊等大公司的用戶(hù)畫(huà)像只會(huì)做的更加完善。
用戶(hù)畫(huà)像初相識(shí)
剛開(kāi)始接觸用戶(hù)畫(huà)像并非是我的意愿,所以對(duì)用戶(hù)畫(huà)像完全不了解就開(kāi)始上手了。當(dāng)時(shí)對(duì)用戶(hù)畫(huà)像僅有的直觀影響就是給用戶(hù)打標(biāo)簽,比如一個(gè)人是男的還是女的,有車(chē)還是沒(méi)車(chē),喜歡看什么文章之類(lèi)的。如果做過(guò)機(jī)器學(xué)習(xí)項(xiàng)目的話,會(huì)發(fā)現(xiàn)這個(gè)就是我們平時(shí)自己提取的特征。事實(shí)上剛開(kāi)始做的話,整天便是寫(xiě)sql,從數(shù)據(jù)倉(cāng)庫(kù)以及各種數(shù)據(jù)來(lái)源提取數(shù)據(jù),按照一定的處理邏輯來(lái)規(guī)整數(shù)據(jù),最后處理的數(shù)據(jù)以HIVE 表的形式存到 HDFS,Hbase,Redis。不同的是,我們?cè)谀硞€(gè)項(xiàng)目提取的特征只會(huì)用于這個(gè)項(xiàng)目,一般不會(huì)用于其他的地方。但是用戶(hù)畫(huà)像的一個(gè)基本要求畫(huà)像必須是可以通用的。就需要有一系列的規(guī)范來(lái)保證每個(gè)字段必須是可解釋的,HIVE 表的命名是有意義,數(shù)據(jù)的輸出是規(guī)范一致的。一切的一切都應(yīng)該是有文檔來(lái)記錄以保證畫(huà)像的通用性。
用戶(hù)畫(huà)像的基本前提
用戶(hù)畫(huà)像最重要的其實(shí)就是用戶(hù)了,有人說(shuō)這個(gè)就是廢話。其實(shí)不是的,我們做用戶(hù)畫(huà)像需要獲取這個(gè)用戶(hù)在我們公司網(wǎng)站 pc端,app,m端(在手機(jī)端登錄公司的網(wǎng)站)所有的數(shù)據(jù)。只有獲取了這個(gè)用戶(hù)在我們公司所有的數(shù)據(jù),我們才能獲取這個(gè)用戶(hù)在我們公司最完整的畫(huà)像,否則這個(gè)用戶(hù)的畫(huà)像就是有失偏頗的,不會(huì)那么準(zhǔn)。這個(gè)問(wèn)題完全可以通過(guò)非技術(shù)的手段來(lái)解決,比如用一個(gè)標(biāo)志來(lái)標(biāo)識(shí)用戶(hù)在 pc端,app,和 m端的訪問(wèn)行為,這個(gè)標(biāo)志一般就是我們所說(shuō)的公司賬號(hào)。有些公司是強(qiáng)賬號(hào)體系,比如騰訊的qq號(hào),阿里的淘寶賬戶(hù),微博的微博賬戶(hù),所以這些公司的用戶(hù)畫(huà)像天然就可以做的比較好。但是大部分公司都沒(méi)有這種強(qiáng)賬號(hào)體系,厲害如百度迄今也沒(méi)有自己的強(qiáng)賬號(hào)體系。所以百度掉隊(duì)不是沒(méi)有原因的。
那么那些沒(méi)有自己強(qiáng)賬號(hào)體系的公司是不是就沒(méi)法開(kāi)發(fā)出自己的用戶(hù)畫(huà)像體系呢?其實(shí)也是可以折衷的,那就是用戶(hù)連線。通過(guò)各種連接信息,將同一個(gè)用戶(hù)來(lái)自pc端的 cookie,app端的device_id,m端的cookie 數(shù)據(jù)連接在一起。判斷一個(gè)公司的用戶(hù)畫(huà)像水平基本可以通過(guò)用戶(hù)連線這一塊了解個(gè)大概,這個(gè)也是每個(gè)用戶(hù)畫(huà)像部門(mén)最核心的算法之一。但是通過(guò)用戶(hù)連線來(lái)做的畫(huà)像準(zhǔn)確率畢竟比不上有強(qiáng)賬號(hào)體系的公司。主要是是因?yàn)檫B線的覆蓋率和準(zhǔn)確率一般是矛盾的,如果連線的覆蓋率低了,雖然準(zhǔn)確率高了,但是連的用戶(hù)少了,比如就連線100個(gè)用戶(hù),對(duì)整體畫(huà)像的準(zhǔn)確率不會(huì)有明顯的提升。如果連線的覆蓋率上去了,準(zhǔn)確率往往會(huì)下降,你連線連一堆錯(cuò)的,還不如不連線。這中間的折衷往往是取決于業(yè)務(wù)本身的需求。
用戶(hù)畫(huà)像的類(lèi)別
用戶(hù)畫(huà)像一般是分為兩類(lèi)的。一類(lèi)是實(shí)時(shí)用戶(hù)畫(huà)像,這類(lèi)畫(huà)像的處理邏輯一般都很簡(jiǎn)單,要求迅速響應(yīng),實(shí)時(shí)處理。數(shù)據(jù)從kafaka過(guò)來(lái),通過(guò)storm 等實(shí)時(shí)開(kāi)源框架處理之后存入redis 當(dāng)中。
第二類(lèi)便是離線用戶(hù)畫(huà)像,這類(lèi)用戶(hù)畫(huà)像是把當(dāng)天業(yè)務(wù)方需要的用戶(hù)畫(huà)像提前算好,然后供給業(yè)務(wù)方使用。由于對(duì)數(shù)據(jù)的時(shí)效性要求不是那么的高,可以使用較復(fù)雜的處理邏輯或者各種離線機(jī)器學(xué)習(xí)模型來(lái)保證畫(huà)像的準(zhǔn)確性。數(shù)據(jù)一般存在HDFS 和 Hbase 里面。
離線用戶(hù)畫(huà)像的一般處理邏輯
離線的用戶(hù)畫(huà)像的數(shù)據(jù)來(lái)源一般是來(lái)自采集或者數(shù)據(jù)倉(cāng)庫(kù)。如果是某些特殊數(shù)據(jù)的話,可能得先經(jīng)過(guò)反作弊團(tuán)隊(duì)的預(yù)處理,比如淘寶的刷單行為,某些品類(lèi)異常的瀏覽行為等等。我們利用sql 從這些數(shù)據(jù)源獲取到我們需要的數(shù)據(jù)以后,首先經(jīng)過(guò)用戶(hù)連線將同一個(gè)用戶(hù)的行為全部連線到一起,然后利用 mapreduce 按照一定的處理邏輯進(jìn)行處理。處理完的結(jié)果可以和歷史的數(shù)據(jù)進(jìn)行合并 插入到當(dāng)天的分區(qū)表當(dāng)中去或者存入到 hbase 當(dāng)中。整體而言處理的邏輯是比較的清晰的。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖一 :用戶(hù)畫(huà)像處理的一般邏輯
可能有同學(xué)會(huì)好奇?那么倉(cāng)庫(kù)的數(shù)據(jù)是從哪里來(lái)的。其實(shí)都是來(lái)自我們?nèi)粘T谶@個(gè)公司網(wǎng)站點(diǎn)擊,瀏覽,購(gòu)買(mǎi),評(píng)論等行為。這些數(shù)據(jù)由公司的前端埋點(diǎn)以后,會(huì)不斷的由采集收到倉(cāng)庫(kù)進(jìn)行整理,整理成當(dāng)天的流量日志。大部分的畫(huà)像標(biāo)簽的數(shù)據(jù)源都是流量日志。
用戶(hù)畫(huà)像的體系建設(shè)
單個(gè)的用戶(hù)畫(huà)像很好做,但用戶(hù)畫(huà)像真正想發(fā)揮用途,必須得建立起自己的體系來(lái)。這樣才能對(duì)一個(gè)用戶(hù)進(jìn)行全方面的描述。打包賣(mài)給別人的話,也更加值錢(qián)。初步來(lái)看用戶(hù)畫(huà)像的體系建設(shè)應(yīng)該包括幾個(gè)方面
標(biāo)簽系統(tǒng)的頂層設(shè)計(jì),具體就是我們這個(gè)標(biāo)簽系統(tǒng)系統(tǒng)需要為哪些業(yè)務(wù)方服務(wù),需要涵蓋哪些類(lèi)別,需要做哪些標(biāo)簽
標(biāo)簽系統(tǒng)的維度系統(tǒng)建設(shè),我們的畫(huà)像對(duì)外輸出,如果只是輸出中文的話,不大好用,有時(shí)候也不大好處理,就需要我們將標(biāo)簽的輸出的值數(shù)值化,維度化。整個(gè)標(biāo)簽系統(tǒng)的值都可以通過(guò)一個(gè)統(tǒng)一的數(shù)值系統(tǒng)或者向量系統(tǒng)來(lái)進(jìn)行描述。
標(biāo)簽開(kāi)發(fā)規(guī)范,這個(gè)是保證標(biāo)簽代碼的可維護(hù)性,易讀性。
標(biāo)簽系統(tǒng)的可擴(kuò)展性,由于很多業(yè)務(wù)方都需要根據(jù)自己的需求來(lái)定制化標(biāo)簽,就要求我們的標(biāo)簽系統(tǒng)應(yīng)該是可擴(kuò)展的,外部業(yè)務(wù)方自己定制的標(biāo)簽如果符合我們標(biāo)簽的維度系統(tǒng)以及開(kāi)發(fā)規(guī)范,就應(yīng)該是可以擴(kuò)展進(jìn)我們本身的標(biāo)簽系統(tǒng)的,供給全公司使用。
標(biāo)簽對(duì)外平臺(tái)的開(kāi)發(fā),所有的標(biāo)簽最好只能有一個(gè)統(tǒng)一的輸出口徑對(duì)外輸出,這樣就可以切實(shí)保證只有符合我們標(biāo)簽開(kāi)發(fā)規(guī)范的標(biāo)簽接入其中,同時(shí)也能做好標(biāo)簽系統(tǒng)的權(quán)限管理。
用戶(hù)畫(huà)像當(dāng)前的困境
目前大部分用戶(hù)畫(huà)像都是基于統(tǒng)計(jì)的方法來(lái)做的,這種方法的優(yōu)點(diǎn)是基礎(chǔ)準(zhǔn)確率比較高,但是整體的覆蓋率不會(huì)很高。比如我要在一個(gè)購(gòu)物網(wǎng)站做用戶(hù)感興趣的商品的畫(huà)像。如果我使用基于統(tǒng)計(jì)的方法利用用戶(hù)在購(gòu)物網(wǎng)站 pc,m,app端的點(diǎn)擊,瀏覽,下單,購(gòu)買(mǎi)等一系列用戶(hù)行為來(lái)對(duì)用戶(hù)打標(biāo)簽,只能夠得到用戶(hù)關(guān)于她/他 已經(jīng)點(diǎn)擊,瀏覽,下單,購(gòu)買(mǎi)的商品的畫(huà)像。但是其他商品,我雖然沒(méi)有點(diǎn)擊,不代表我對(duì)這些商品沒(méi)有興趣,可是基于統(tǒng)計(jì)的方法無(wú)法推廣到這些用戶(hù)沒(méi)用點(diǎn)擊,瀏覽,下單,購(gòu)買(mǎi)的商品。
基于統(tǒng)計(jì)的方法無(wú)法進(jìn)行更深層次的推廣,也就是缺乏我們常說(shuō)的泛化能力,只會(huì)死讀書(shū),不會(huì)舉一反三。我們更多的會(huì)通過(guò)使用機(jī)器學(xué)習(xí)或者其他算法來(lái)嘗試解決這個(gè)問(wèn)題。遺憾的是對(duì)于業(yè)界來(lái)說(shuō),這種標(biāo)簽占整個(gè)用戶(hù)畫(huà)像體系的比例也不會(huì)很高。因?yàn)檫@種標(biāo)簽做的費(fèi)時(shí)費(fèi)力,而且效果不一定好。有一個(gè)很關(guān)鍵的原因,我們舉一個(gè)例子來(lái)嘗試說(shuō)明一下。比如某個(gè)汽車(chē)網(wǎng)站想預(yù)測(cè)用戶(hù)有車(chē)無(wú)車(chē),很多時(shí)候該汽車(chē)網(wǎng)站通過(guò)和4s店合作等等途徑能夠獲取到只有哪些用戶(hù)確切有車(chē)。我們?cè)陬A(yù)測(cè)的時(shí)候,可以把這些有車(chē)的用戶(hù)當(dāng)作正樣本來(lái)處理。問(wèn)題在于我們找不到確切無(wú)車(chē)的用戶(hù),相當(dāng)于找不到負(fù)樣本。
一般的做法是我們把流量日志當(dāng)中那些不是確切有車(chē)的的用戶(hù)都當(dāng)作無(wú)車(chē)用戶(hù)來(lái)看,也就是當(dāng)做負(fù)樣本來(lái)看。但是這個(gè)只能說(shuō)明這些用戶(hù)只是在該公司的數(shù)據(jù)庫(kù)里是沒(méi)有買(mǎi)車(chē)的,他現(xiàn)實(shí)生活中可能是有車(chē)的,但是該公司并不清楚這一點(diǎn)。這樣做的后果就是負(fù)樣本里面參入了正樣本,更可怕的是參入的比例有時(shí)候我們也不大好估計(jì)。這種情況就會(huì)導(dǎo)致模型在訓(xùn)練的時(shí)候準(zhǔn)確率下降。
這樣看來(lái)很多基于機(jī)器學(xué)習(xí)的算法其實(shí)都有樣本標(biāo)注的問(wèn)題,對(duì)于這類(lèi)標(biāo)注的問(wèn)題,一方面我們可以通過(guò)其他不同的數(shù)據(jù)來(lái)源,相互驗(yàn)證來(lái)保證標(biāo)注的數(shù)據(jù)盡量準(zhǔn)確。一方面可以考慮一下無(wú)監(jiān)督的學(xué)習(xí)算法比如聚類(lèi)算法來(lái)解決這個(gè)問(wèn)題。但是目前來(lái)看,還不大清楚有沒(méi)有其他比較實(shí)用的方式來(lái)解決這類(lèi)問(wèn)題。
總結(jié)
從數(shù)據(jù)挖掘的不同方向來(lái)看的話,用戶(hù)畫(huà)像應(yīng)該是最好入門(mén)的一個(gè)方向之一。它對(duì)技術(shù)人員的要求是會(huì)sql和mapreduce 即可。其他機(jī)器學(xué)習(xí)的知識(shí)可以一邊學(xué)習(xí)一邊上手。作為一個(gè)程序員,其實(shí)我內(nèi)心一開(kāi)始是很不喜歡用戶(hù)畫(huà)像這個(gè)崗位的,畢竟每天重復(fù)性的工作很容易讓人疲倦。但他確實(shí)也非常的重要,是整個(gè)數(shù)據(jù)挖掘方向最靠近業(yè)務(wù)的一個(gè)方向了。很多時(shí)候,深度學(xué)習(xí)也好機(jī)器學(xué)習(xí)也罷都離業(yè)務(wù)太遠(yuǎn)了,有時(shí)候是無(wú)法落地給公司帶來(lái)直接的產(chǎn)出,非常容易就被邊緣化了。并且在互聯(lián)網(wǎng)行業(yè)數(shù)據(jù)挖掘從業(yè)者的平均薪資也還不錯(cuò)。那么就常常會(huì)有一個(gè)問(wèn)題,數(shù)據(jù)挖掘部門(mén)的整體人力成本很高,但是產(chǎn)出卻相當(dāng)?shù)牡停瑢?duì)于整個(gè)公司來(lái)看其實(shí)也是一個(gè)很大的負(fù)擔(dān)。
所以對(duì)于我個(gè)人來(lái)說(shuō)的話,技術(shù)是很重要的,但是技術(shù)本身是沒(méi)有產(chǎn)出的,所以我要盡量去想辦法讓我的技術(shù)有產(chǎn)出并且是可以度量的。這點(diǎn)落在選擇公司的時(shí)候,我更多的也會(huì)考慮這個(gè)部門(mén)有沒(méi)有很有前景的業(yè)務(wù),再看這個(gè)部門(mén)的方向是否是感興趣的。這樣能夠最大限度保證我的技術(shù)有落地,有產(chǎn)出,不至于被邊緣化,同時(shí)也能一直保持我對(duì)技術(shù)的熱情。