1. 程式人生 > >使用樸素貝葉斯演算法,通過使用者安裝的APP列表來推測使用者的性別

使用樸素貝葉斯演算法,通過使用者安裝的APP列表來推測使用者的性別

從本質上來說,這是一個分類問題,類似於通過郵件內容來推測垃圾郵件,通過使用者的相關資訊來推測使用者是否會拖欠貸款,而通過使用者的APP安裝列表來推測使用者的性別也是一個類似的問題。

對於貝葉斯演算法來說,我們首先需要一個訓練集資料,這個訓練集是一個已經打好標籤的資料。而要對一堆的資料打標籤,人工來做是不太合適的,在這裡需要結合人類與計算機各自的優勢,來半自動化的識別出比較明顯的有性別傾向的APP的列表,再通過這些(有性別標識的)APP在使用者的安裝列表中所佔的比例來判定出性別特徵比較明顯的使用者,併為這些使用者打上性別的標籤,而這些使用者以及其安裝的APP列表就成為我們最終使用的貝葉斯演算法的訓練資料。

1. 首先要篩選出男女各自的代表性APP列表集合

首先,受益於某些APP的命名以及其功能明顯的性別傾向性,或者說得益於男女之間的差異,我們能夠分別為男女各自定義一組APP名的關鍵詞用來區別男女的使用者。比如,對於女性來說,類似於“美麗說”,“美顏相機”,“蘑菇街”,“可愛”之類的關鍵詞就比較能代表其女性的性別傾向性;而類似於“美女”,“體育”,“足球籃球”,“汽車”,“賽車”等關鍵字又是男性比較有代表性APP關鍵字。所以最終,我們形成了類似於下面的一組資料,這組資料由人工來完成:

  1. 性感美女    男性應用  
  2. Sexy    男性應用  
  3. 汽車  男性應用  
  4. 體育足球籃球  男性應用  
  5. 足球  男性應用  
  6. 籃球  男性應用  
  7. 男人必玩    男性應用  
  8. 戰鬥  男性應用  
  9. 賽車  男性應用  
  10. 快播  男性應用  
  11. 配件  男性應用  
  12. 暴力  男性應用  
  13. 坦克  男性應用  
  14. 美圖秀秀    女性應用  
  15. 大姨媽經期   女性應用  
  16. 化妝美容    女性應用  
  17. 美顏  女性應用  
  18. 寶寶  女性應用  
  19. 兒童  女性應用  
  20. 美麗說 女性應用  
  21. 美柚  女性應用  
  22. 蘑菇街 女性應用  
  23. 可愛  女性應用  

通過,這組人工整理的資料,我們要將其與APP名稱的庫中的所有的APP名進行模糊匹配,繼而找出所有的能夠打上性別標籤的APP。為此,我們可以採用ES+IK中文分詞外掛的方式,將我們的關鍵詞以及其類型錄入其中,其中的關鍵詞會被IK外掛分詞,而型別資訊將不會被處理,為此我們需要為ES的索引做以下的設定:
  1. curl -XPUT localhost:9200/appgender -d '{  
  2.     "settings" : {  
  3.         "analysis" : {  
  4.             "analyzer" : {  
  5.                 "ik" : {  
  6.                     "tokenizer" : "ik"  
  7.                 }  
  8.             }  
  9.         }  
  10.     },  
  11.     "mappings" : {  
  12.         "appgender" : {  
  13.             "dynamic" : true,  
  14.             "properties" : {  
  15.                 "appname" : {  
  16.                     "type" : "string",  
  17.                     "analyzer" : "ik"  
  18.                 },  
  19.                 "genre": {  
  20.                     "type": "string",  
  21.                     "index": "not_analyzed"  
  22.                 }  
  23.             }  
  24.         }  
  25.     }  
  26. }'  

但是,通過以上的工作之後,還需要根據需要來為IK外掛的字典新增自己定義的詞,這樣用來優化最終的匹配效果,比如“美圖秀秀”這個關鍵詞,如果IK字典中沒有“美圖”這樣的詞彙,那麼其就可能被分詞成“美”和“圖”兩個字,這樣在匹配的時候就會擴大匹配的範圍,導致匹配結果失真;但是同時也要注意相反的方向,使用ES的目的就是模糊匹配,也就是要擴大匹配範圍,但是正如我們前面說的,要掌握好度,既要保證有足夠數量的APP被打上性別標籤,也要注意避免太多的APP被打上標籤(以致正確率下降)。我們可以通過Python ES API來將這些人工組織的資料寫入ES的appgender索引,程式碼非常簡單:
  1. #coding=utf-8
  2. from elasticsearch import Elasticsearch  
  3. if __name__ == '__main__':  
  4.     es = Elasticsearch()  
  5.     with open('data/gender_app_feature.tsv') as appgenre:  
  6.         for line in appgenre:  
  7.             appname, genre = line.strip().split('\t')  
  8.             es.index(index="appgender", doc_type="appgender", body={"appname": appname, "genre": genre})  

2.  就是通過以上的ES中的appgender索引中的資料,來匹配APP庫中的APP名,並將其結果儲存下來,APP庫的形式類似於:

  1. GO鎖屏    1975242  
  2. 360省電王    2142434  
  3. 錄音機    2169688  
  4. 天天愛消除    2450275  
  5. 系統更新    2517301  
  6. Messaging    2533345  
  7. 今日頭條    2625085  
  8. 墨跡天氣    2762610  
  9. 同花順    3076707  
  10. QQ空間    3131907  
  11. 漏洞修復    3255717  
  12. 撥號盤    3609291  
  13. 開心消消樂    3638686  

第一列是APP名,第二列是APP的使用者數,或者出現次數。而匹配工作也非常簡單:

  1. #coding=utf-8
  2. import sys  
  3. reload(sys)  
  4. sys.setdefaultencoding('utf-8')  
  5. from elasticsearch import Elasticsearch  
  6. if __name__ == '__main__':  
  7.     es = Elasticsearch()  
  8.     with open('data/applist.log') as f:  
  9.         for line in f:  
  10.             line = line.replace('?''')  
  11.             if line.strip():  
  12.                 t = line.strip().split('    ')  
  13.                 if len(t) == 2:  
  14.                     appname, num = t  
  15.                 try:  
  16.                     num = int(num)  
  17.                     if num < 5continue
  18.                     # print 'Processing: [%s], and its type is [%s]' % (appname, type(appname))
  19.                     r = es.search(index='appgender', doc_type='appgender', body={'query': {'match': {'appname': appname}}})  
  20.                     hits = r['hits']['hits']  
  21.                     if hits:  
  22.                         hit = hits[0]  
  23.                         matched_app = hit['_source']['appname']  
  24.                         matched_genre = hit['_source']['genre']  
  25.                         hit_score = hit['_score']  
  26.                         record = u'%s\t%s\t%s\t%d\t%s' % (appname, matched_app, matched_genre, num, hit_score)  
  27.                         print record.encode('utf-8')  
  28.                 except Exception, e:  
  29.                     sys.stderr.write(str(e) +  '\n')  


通過以上的簡單程式,我們就得到類似以下的結果:
  1. 玩庫賺流量      男人必玩        男性應用        14423   0.17464119  
  2. 兒童拖拖樂遊戲  兒童    女性應用        14699   0.34928238  
  3. 4D極速沙灘賽車  賽車    男性應用        15583   0.34928238  
  4. 寶寶樹時光      寶寶    女性應用        16620   0.5457385  
  5. PPTV第1體育     體育足球籃球    男性應用        25234   0.17464119  
  6. 汽車報價-汽車之家出品   汽車    男性應用        51951   0.34928238  
  7. 汽車線上        汽車    男性應用        68215   1.03399  
  8. 魔秀桌面        美圖秀秀        女性應用        88965   0.34108657  
  9. 球探體育比分    體育足球籃球    男性應用        90670   0.17464119  
  10. 新浪體育        體育足球籃球    男性應用        102179  0.516995  
  11. 美麗說  美麗說  女性應用        108899  2.873763  
  12. ......  

一共有5列,第一列是APP庫中的某個APP,第二列是匹配到的ES中的關鍵詞,第三列是匹配到的ES關鍵詞所對應的分類(這裡就兩類,男性應用和女性應用),第四列是APP庫中所標記的APP的使用者數,可以用這個數來調整結果,第五列是匹配度得分,當然也可以通過這個得分來調整結果。

3. 通過以上的資料,我們可以看到某個使用者的APP列表與上面結果的一個交集,有了個這個交集,我們就可以看出這個使用者的“男女比重”,你可以通過這個指標定一個閥值(比如說,男性應用的比重在50%以上的定性為男性,否則為女性)來將其標定為男性或女性使用者;如果交集為空,那麼我們就不能確定這個使用者的性別,那我們就不處理它。通過本步的處理,我們能夠確定一部分的使用者的性別特徵,再將這些使用者的APP列表展開,我們就能夠得到如下的形式的資料:

  1. 0052c56f854f363e72a66b4c174e4050        女性應用        搜尋  
  2. 0052c56f854f363e72a66b4c174e4050        女性應用        美圖秀秀  
  3. 0056c01c656c00093a39be1ea783d060        女性應用        騰訊新聞  
  4. 0056c01c656c00093a39be1ea783d060        女性應用        微信  
  5. 0056c01c656c00093a39be1ea783d060        女性應用        快樂炸金花  
  6. 0056c01c656c00093a39be1ea783d060        女性應用        歡樂鬥地主  
  7. 0056c01c656c00093a39be1ea783d060        女性應用        歡樂鬥牛  
  8. 0056c01c656c00093a39be1ea783d060        女性應用        百度  
  9. 0056c01c656c00093a39be1ea783d060        女性應用        蘑菇街  
  10. 0056c01c656c00093a39be1ea783d060        女性應用        金山電池醫生  
  11. 005cdf6d9f672ba5cbec4574586a942d        男性應用        快播  
  12. 0088d4af42a65f864fc356405c73d39c        男性應用        牛仔美女  
  13. 0088d4af42a65f864fc356405c73d39c        男性應用        美女刮刮樂  
  14. 008a882683313fc6f64429a6396fed9c        女性應用        愛遊戲  
  15. 008a882683313fc6f64429a6396fed9c        女性應用        蘑菇街  
  16. 00981a6f972fca3d1eccc942015054d2        女性應用        美圖秀秀  
  17. 00a17e719a86d8f11d534de346e0fcce        女性應用        微信  
  18. 00a17e719a86d8f11d534de346e0fcce        女性應用        美圖秀秀  
  19. 00a953e662ef896ecde30a9a76e57e96        男性應用        天天基金網  

第一列是使用者的標識,第二列是根據“男女應用比重”所確定出的本使用者的性別,而第三列就是這個使用者展開後的全部應用。

4. 最後,就是通過第三步的資料,進行一些簡單的統計,以滿足貝葉斯模型的需求:

  1. #coding=utf-8
  2. from collections import defaultdict  
  3. TRAIN_DATA_FILE = 'data/genderapplist.log'
  4. if __name__ == '__main__':  
  5.     gender_dist = defaultdict(set)  
  6.     app_dist = defaultdict(lambda: defaultdict(int))  
  7.     app_cond_male_prob = defaultdict(float)  
  8.     app_cond_female_prob = defaultdict(float)  
  9.     with open(TRAIN_DATA_FILE) as train_data:  
  10.         for line in train_data:  
  11.             line = line.strip()  
  12.             cells = line.split('\t')  
  13.             if len(cells) == 3:  
  14.                 imei, gender, appname = cells  
  15.                 gender = 'female'if gender == '女性應用'else'male'
  16.                 gender_dist[gender].add(imei)  
  17.                 app_dist[gender][appname] += 1
  18.     # calculate P(male)
  19.     pmale = float(len(gender_dist['male'])) / (len(gender_dist['male']) + len(gender_dist['female']))  
  20.     for appname 

    相關推薦

    使用樸素演算法通過使用者安裝APP列表推測使用者的性別

    從本質上來說,這是一個分類問題,類似於通過郵件內容來推測垃圾郵件,通過使用者的相關資訊來推測使用者是否會拖欠貸款,而通過使用者的APP安裝列表來推測使用者的性別也是一個類似的問題。 對於貝葉斯演算法來說,我們首先需要一個訓練集資料,這個訓練集是一個已經打好標籤的資料。

    簡單示例理解樸素演算法通俗易懂

    一個簡單的例子 讓我們看一下這個例子在實踐中如何運作。假設我們正在建立一個分類器,說明文字是否涉及體育運動。我們的訓練集有5句話: Text Category A great game(一個偉大的比賽)

    機器學習--樸素分類以及拉普拉斯校準

    機器學習算法 我們 earch lov 單詞 標註 樸素貝葉斯分類 images 劃分 原文鏈接:http://chant00.com/2017/09/18/%E8%B4%9D%E5%8F%B6%E6%96%AF/

    小白python學習——機器學習篇——樸素演算法

    一.大概思路: 1.找出資料集合,所有一個單詞的集合,不重複,各個文件。 2.把每個文件換成0,1模型,出現的是1,就可以得到矩陣長度一樣的各個文件。 3.計算出3個概率,一是侮辱性的文件概率,二是侮辱性文件中各個詞出現的概率,三是非侮辱性文件中各個詞出現的概率。 4.二、三計算方法

    樸素演算法原理

    (作者:陳玓玏) 1. 損失函式 假設我們使用0-1損失函式,函式表示式如下: Y Y Y為真實

    樸素演算法應用——垃圾簡訊分類

    理解貝葉斯公式其實就只要掌握:1、條件概率的定義;2、乘法原理 P (

    機器學習——樸素演算法

    概率定義為一件事情發生的可能性 概率分為聯合概率和條件概率  聯合概率:包含多個條件,且所有條件同時成立的概率 記作:P(A,B)  P(A,B)=P(A)P(B) 條件概率:就是事件A在另外一個事件B已經發生的條件概率 記作:P(A|B)  

    機器學習實踐(九)—sklearn之樸素演算法

    一、樸素貝葉斯演算法 什麼是樸素貝葉斯分類方法 屬於哪個類別概率大,就判斷屬於哪個類別 概率基礎 概率定義為一件事情發生的可能性 P(X) : 取值在[0, 1] 聯合概率、條件概率與相互獨立

    樸素演算法優化與 sklearn 實現

    1. 引言 上一篇日誌中,我們主要介紹了貝葉斯演算法,並提供了 python 實踐: 樸素貝葉斯演算法的推導與實踐 但執行上一篇日誌中的示例,我們發現出現了下面的結果: ['love', 'my', 'dalmation'] 屬於非侮辱類 ['stu

    樸素演算法的推導與實踐

    1. 概述 在此前的文章中,我們介紹了用於分類的演算法: k 近鄰演算法 決策樹的構建演算法 – ID3 與 C4.5 演算法 但是,有時我們無法非常明確地得到分類,例如當資料量非常大時,計算每個樣本與預測樣本之間的距

    機器學習——樸素演算法Python實現

    簡介 這裡參考《統計學習方法》李航編進行學習總結。詳細演算法介紹參見書籍,這裡只說明關鍵內容。 即 條件獨立下:p{X=x|Y=y}=p{X1=x1|Y=y} * p{X2=x2|Y=y} *...* p{Xn=xn|Y=y} (4.4)等價於p{Y=ck|X=x

    第3章 樸素演算法 (二 演算法實戰)

    3.6樸素貝葉斯實踐 3.6.1樸素貝葉斯之微博評論篩選 以微博評論為例。為了不影響微博的發展,我們要遮蔽低俗的言論,所以要構建一個快速過濾器,如果某條評論使用了負面或者侮辱性等低俗的語言,那麼就將該留言標誌為內容不當。過濾這類內容是一個很常見的需求。對此問題建

    機器學習樸素演算法

    樸素貝葉斯屬於監督學習的生成模型,實現簡單,沒有迭代,學習效率高,在大樣本量下會有較好表現。但因為假設太強——特徵條件獨立,在輸入向量的特徵條件有關聯的場景下,並不適用。 樸素貝葉斯演算法:主要思路是通過聯合概率建模,運用貝葉斯定理求解後驗概率;將後驗概率最大者對應的類別作

    【ML學習筆記】樸素演算法的demo(機器學習實戰例子)

    礙於這學期課程的緊迫,現在需要儘快從課本上掌握一些ML演算法,我本不想經過danger zone,現在看來卻只能儘快進入danger zone,數學理論上的缺陷只能後面找時間彌補了。 如果你在讀這篇文章,希望你不要走像我一樣的道路,此舉實在是出於無奈,儘量不要去做一個心

    樸素演算法的python實現

    import numpy as np import re #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please']

    2.樸素演算法

    樸素貝葉斯程式碼(原理很簡單) 直接上程式碼 import numpy as np from collections import Counter,defaultdict class Nbayes: def __init__(self): self

    樸素演算法-My way of ML7

    預備知識 聯合概率:包含多個條件,所有條件同時成立概率P(A,B)=P(A)P(B) 條件概率:事件A發生在事件B發生的條件之下的概率。所有的特徵值無關的時候才能適用條件概率 樸素貝葉斯的前提是: 特徵條件獨立,哈哈,這也是她被叫做樸素的原因,因為特徵之間很難獨

    資料探勘領域十大經典演算法之—樸素演算法(超詳細附程式碼)

    簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)

    機器學習之樸素演算法與程式碼實現

                                        樸素貝葉斯演算法與程式碼實現 演算法原理 樸素貝葉斯是經典的機器學習演算法之一,也是為數不多的基於概率論的分類演算法。樸素貝葉斯原理簡單,也很容易實現,多用於文字分類,比如垃圾郵件過濾。 該演算法的優點在於簡單易懂、學習效率高、在某些領

    機器學習實戰讀書筆記(四):樸素演算法

    樸素貝葉斯 優點: 在資料較少的情況下仍然有效 可以處理多類別問題 缺點:對輸入的資料的準備方式較為敏感 適用資料型別:標稱型資料 p1(x,y)>p2(x,y) 那麼類別是1 p2(x,y)>p1(x,y) 那麼類別是2 貝葉斯決策的核心是選擇具有最高概率的決策