用戶畫像建模:方法與工具
用戶畫像是啥?聽起來很高大上的,其實你最熟悉不過了。你的性別,年齡,喜好等等這些都是用戶畫像的維度。迅雷的產品總監blues認為,用戶畫像分析的維度,可以按照人口屬性和產品行為屬性進行綜合分析,
人口屬性:地域、年齡、性別、文化、職業、收入、生活習慣、消費習慣等;
產品行為:產品類別、活躍頻率、產品喜好、產品驅動、使用習慣、產品消費等;
那麼問題又來了,互聯網公司利用用戶畫像做啥呢?主要是個性化營銷和精準廣告。
假如一個電商網站知道你是一個妹子,那麼給你推薦女性的商品,你更可能購買。
假如你是一個年輕的小夥子,在視頻網站上觀看英超比賽,此時給你投放一個體育用品的廣告,儘管你不一定會點擊甚至產生消費行為,但是總比給你投放一個婦女用品的廣告的效果要好。
好了,吹牛逼到此為止。下面開始從技術層面談談如何實踐用戶畫像建模。
每個公司擁有的用戶信息不太一致,有些公司有用戶的真實信息(比如年齡),這種情況很可能不需要建模預測了,本文著重討論的是我們從用戶行為上建模預測各種用戶畫像維度。
說到預測,自然就會想到機器學習的分類和回歸演算法(貝葉斯,決策樹,邏輯回歸,支持向量機等)。對,我們就是採取這些有監督的學習方法,從標註好的訓練數據學習到一個預測模型,然後對未標註的數據進行預測。
從中文姓名預測性別說起
告訴我一個名字,讓我猜猜是男是女。哈哈,多多少少有點算命的味道。
首先,有監督的學習方法,就需要這樣一批標註數據:大量的人名,以及其性別。
下面是某網站的數據,
經過我的驗證,上面的是真實的身份證數據,所以數據絕對靠譜和真實。
於是,從上面爬了幾百萬條的數據作為我們的訓練集和測試集。
其中,400w當做訓練樣本,100w當做測試樣本。
分類演算法:貝葉斯
特徵提取流程:
1 根據姓氏辭典把姓氏去掉,留下不帶姓氏的名字;
2 特徵有三個維度,分別用X1,X2,X3(=X1X2)表示。
如果是單字名,則X1為空格,X2為單字名,X3就是前兩者拼接X1X2,
比如郭靖,X1=」 」,X2=」靖」,X3=」 靖」。
如果是雙字名,則X1為第一個字,X2為第二個字,X3由前兩者拼接,
比如黃藥師,則X1=」葯」,X2=」師」,X3=」藥師」
如果是三個字以上,則只保留最後兩個字,當做雙字名處理。
原始貝葉斯公式
工程實現中,上面公式的分母可以去掉。
所以對於名字X1X2,
P(男|X1X2)=P(男)*P(X1|男)*P(X2|男)*P(X1X2|男)
P(女|X1X2)=P(女)*P(X1|女)*P(X2|女)*P(X1X2|女)
特別注意的是,P(X1|男)表示的是訓練樣本中,男性用戶中,名字第一個字出現X1的概率,如果第二個字出現X1,不算在這裡。
舉個例子,如何判斷謝霆鋒是男是女?
P(男|霆鋒)=P(男)*P(霆|男)*P(鋒|男)*P(霆鋒|男)
P(女|霆鋒)=P(女)*P(霆|女)*P(鋒|女)*P(霆鋒|女)
P(霆|男)表示的是訓練樣本中,男性用戶第一個字出現霆的概率,
P(鋒|男) 表示的是訓練樣本中,男性用戶第二個字出現鋒的概率,
P(霆鋒|男) 表示的是訓練樣本中,男性用戶第一個字是霆且第二個字是鋒字的概率。
工程實現中,在預測階段,可能會遇到一些特徵在訓練樣本中沒有,則需要做一下平滑(比如分子加一個很小的值),不然男女概率都為0,無法預測。
關於這個模型,特徵提取和採取貝葉斯模型,是參考了《基於中文人名用字特徵的性別判定方法》這篇論文來做的。還有篇論文,是用條件隨機場來做的,有興趣的讀者可以看看《基於條件隨機場的中文人名性別識別研究》。
在實際應用中,這個模型適合於我們知道用戶姓名但是不知道性別的情況,比如某電商網站,一般情況用戶訂單中填的收貨人姓名都是真實的,註冊信息中可能帶有性別但是不靠譜可能是亂填的。
提到電商,不得不提淘寶,淘寶可是有用戶的身份證信息的,但是據說淘寶會保存用戶兩個性別,一個是身份證信息的性別,一個是預測性別。也許是他們實踐過,不同的業務場景,兩個性別的效果不一樣。
好了,再說說從用戶行為來建模預測。不同的產品的用戶行為信息不太一致,提取的特徵以及方法也不一致。對於視頻用戶,提取的特徵通常是這個視頻信息,比如你看了《小時代》,我們就會給你打上一個「楊冪「的標籤作為你其中一個特徵。對於微博用戶,提取的特徵來自於你發的微博內容和關注的好友,比如你關注了tfboys,或者經常轉發他們的相關的微博,我們就會給你打上」tfboys「和」小鮮肉「的特徵。對於新聞資訊用戶,提取的特徵就是該新聞的主題,關鍵詞等信息。提取的特徵來自於結構化信息和非結構化信息。對於結構化信息(資料庫表,xml,json等),容易抽取。但是對於非結構化信息,就需要自然語言處理和文本挖掘的方式來抽取,比如常見的tf-idf來提取關鍵詞,lda演算法來提取主題。
對於抽取的這些信息,就可以當做用戶的基本行為特徵,其實也可以當做一部分用戶畫像的維度了。
然後,我們如何利用這些基本行為特徵,來進行其他用戶畫像維度的預測呢?
還是採取分類的演算法。對於有監督學習,當然需要男女,年齡等標註數據了。可以跟第三方公司進行數據合作,也可以人工標註。通常,可以跟第三方廣告公司進行數據交換,通過cookie-mapping方式進行用戶關聯。
好了,特徵和標註數據都有了,那麼可以建模了。分類演算法一大堆,貝葉斯,邏輯回歸,svm,gbdt,random forest,神經網路等等。開源的演算法庫也有很多,後續會介紹liblinear,xgboost,sklearn。
然而,經過實踐的工程師都知道,演算法不是萬能的。一個好的模型,除了演算法本身,數據質量,數據預處理,特徵工程等等這些都很重要。且外,還需要根據業務情況,進行隨機應變。
下面分享一些工作中用到的奇技淫巧。
互聯網數據,並不像學術研究中的數據那麼完美,而是「雜亂臟「。拋開業務不說,僅從數據上看,標註數據有誤,特徵數據稀疏,類別不平衡等等。總之由於種種問題,可能導致我們模型不是那麼準確。一種有效的思路,就是我們不預測全體用戶,只預測我們有把握預測的,因為對於業務方來說,準確率相對於召回率,對他們更重要。朝著這種思路,也有不少嘗試方案。比如分群預測,分群的方法可以從業務上分,也可以從演算法上分。從業務上分,比如視頻用戶可以分為電影用戶和電視用戶等等。從演算法上分,可以通過聚類的方法來分。分群完畢後,再對不同的群體進行建模,通過測試集預測,過濾掉準確率較低的群體,保留準確率較高的群體即可。還有種嘗試方案,就是特徵選擇和用戶篩選結合起來,特徵選擇的演算法也有很多,比如信息增益,卡方測試等,保留下有分類能力的特徵,特徵選擇完畢後,對用戶進行過濾,是否保留這個用戶取決於這個用戶是否擁有足夠多的有分類能力的特徵。這個用戶過濾環節,訓練測試階段和預測階段都要進行。
好了,talk ischeap,show me your code。下面開始介紹幾個開源演算法工具庫。
下面三點是我挑選工具的標準:
1 支持類似libsvm格式的稀疏特徵輸入
2 支持百萬級別訓練數據
3 輕量級,快
libsvm和liblinear
在特徵維度是幾萬以上級別的前提下,
libsvm只能訓練幾萬條樣本。
而liblinear對於百萬級別的樣本數量,速度很快,
千萬級別有點吃力。
liblinear對於libsvm的缺點就是,不能使用核函數,libsvm也正是這點所以耗性能。
數據文件格式:標準的libsvm格式,每一行都是
label index1:value1 index2:value2
的稀疏向量的格式。
liblinear最簡單的訓練和測試方式:
train train.txt model.txt
predict test.txt model.txt predict.txt
使用liblinear之前,
建議進行L2範式歸一化,實現簡單,可以加快訓練速度,可能會提高準確率。
Xgboost
提到該工具,不得不秀一下這個工具的作者陳天奇大神。
xgboost是gbdt演算法的實現,可以做回歸,分類,和排序。支持各種語言調用,支持單機和分散式,支持libsvm的稀疏矩陣的數據格式,非常適合於大規模數據集。
項目主頁
dmlc/xgboost · GitHub
單機版的python調用例子:
《xgboost快速入門》
xgboost快速入門
sklearn
涵蓋數據預處理,降維,分類,回歸,聚類,模型選擇。
sklearn也支持libsvm的數據格式,
但是某些演算法不一定支持,
比如1.5版本的隨機森林不支持稀疏矩陣,1.6就支持了。
1.6版本的gbdt也不支持稀疏矩陣。
kmeans的調用例子
《sklearn特徵選擇和分類模型》
sklearn特徵選擇和分類模型
好了,經歷了用戶畫像建模的這段經歷,的確體驗到演算法並不是萬能的。所以,我們出了把精力學習那些神奇的演算法原理,還需要在數據分析,數據處理,特徵工程甚至業務知識方面花功夫。特別是特徵工程,在互聯網中是永恆的主題。百度鳳巢在很久之前,一直沿用人肉特徵工程+線性模型的方法,也是近幾年才引用深度學習來做特徵。最近有篇Facebook的論文,是用gbdt提特徵輸入給lr預測,有時間我也會學習一下。
好了,晚安。
2015年11月25號夜
本文作者:linger
本文鏈接:用戶畫像建模:方法與工具
轉載須註明出處
歡迎關注公眾號:數據挖掘菜鳥【公眾號ID:data_bird】
關注大數據,數據挖掘,機器學習,深度學習
推薦閱讀:
※機器學習和數據挖掘在網路安全領域會有哪些應用?
※關於數據降維的諸多演算法,測試數據必須要和訓練數據一起運算么?
※混淆矩陣是什麼意思?
※學習數據挖掘,機器學習的正確姿勢?
※數據治理的主戰場,商業智能還是數據挖掘?