使用Python抓取婚戀網用戶數據並用決策樹生成自己擇偶觀
最近在看《機器學習實戰》的時候萌生了一個想法,自己去網上爬一些數據按照書上的方法處理一下,不僅可以加深自己對書本的理解,順便還可以在github拉拉人氣。剛好在看決策樹這一章,書裡面的理論和例子讓我覺得這個理論和選擇對象簡直不能再貼切,看完長相看學歷,看完學歷看收入。如果可以從婚戀網站上爬取女性的數據信息,手動給她們打標籤,並根據這些數據構建決策樹,不就可以找出自己的擇偶模式了嗎!github項目:huatian-funny,下面就詳細的闡釋一下。
數據爬取
之前在世紀佳緣上爬取過類似的數據,總體的感覺是上面的用戶數據要麼基本不填要麼一看就很假,周圍的一些老司機建議可以在花田網上看下,數據質量確實高很多,唯一的缺點就是上面的數據不給爬,搜索用戶的API需要登錄,而且只顯示三十多個用戶的信息。剛好我需要的數據也很少,就把搜索條件劃分的很細,每次取到的數據很小,但最終彙集的數量還是相當可觀的,最終獲取了位置在上海年齡22-27共計2000個左右的用戶數據。填寫好spider.py中的用戶名和密碼,直接運行這個文件就可以爬取數據,因為數據量不大,很快就可以運行完畢,存儲在mongodb中的數據如下:
爬蟲用到的工具是requests,流程上也很簡單,先發送登陸請求獲取cookie,然後調用搜索API獲取數據,拿到的數據是json格式,不需要任何轉換直接存儲mongodb,非常的方便,唯一想吐槽的就是花田搜索API介面竟然用的是POST方式,太沒有專業水準了。稍微提一下如何用request獲取cookie,用Session構建一個session對象,用這個對象發送登陸請求後,之後的請求都會自動帶上登陸返回的cookie,使用起來非常的簡單。
1 from requests import Sessionn2 n3 session = Session()n4 session.post(login_url, data=post_data, headers=POST_HEADERS)n5 response = session.get(search_url, headers=GET_HEADERS)n
給用戶打標籤
由於決策樹屬於監督學習,需要一個給定的標籤,因此需要自己根據用戶的外貌、年齡、學歷等多個維度的判斷給出一個標籤,最後生成的決策樹在一定程度上就可以反映自己的擇偶標準。針對女性的標籤很簡單粗暴,只有滿意和不滿意兩種,有興趣的同學可以按照真實的情況設置更多的標籤,例如優秀、一般、備胎、不合格等等。因為外貌是選擇對象過程中一個必不可少的要素,把相貌量化至關重要,因為沒有相關的工具根據頭像進行評分,只能個人主觀進行量化,採用了當下非常流行的十分制。
為了增加打標籤的效率,專門寫了一個桌面窗口,運行mark.py即可,運行結果如下。(tkinter是一個坑,調代碼的時間夠我把整個數據集看好幾遍了,不過真的用起來的時候還是挺有意思的)
備註:因為剛開始看的很多用戶只有頭像、年齡、身高、工資、學歷這五個信息,所以整個過程中只參考了這五個維度進行評價,下面的決策樹也是根據這五個維度進行處理。
訓練數據
決策樹
機器學習中,決策樹是一個預測模型,它代表的是對象屬性與對象值之間的一種映射關係。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。從數據產生決策樹的機器學習技術叫做決策樹學習,n 通俗點說就是決策樹,說白了,這是一種依託於分類、訓練上的預測樹,根據已知預測、歸類未來。
理論方面我可以參考《機器學習實戰》第三章或者這篇博客,很淺顯易懂的解釋了具體的原理,我就不贅述了。
結果展示
代碼參考的是《機器學習實戰》,針對現實自己做了一些優化調整,和原來的代碼不是完全相同,運行train.py就可以顯示出結果,如下:
因為線很擠,調了很久只能拿到這個效果了。到這兒已經很清晰明了的闡明了主題,我就是一個外貌黨,顏值高的pass,顏值低的忽略,不高不低的考慮的相當糾結。有興趣的同學可以自己試一試。
PS1:其實不太想承認自己是一個外貌協會成員,人丑顏控註定孤獨一生。
PS2:因為打標籤的過程有些隨意,所以有一部分不準確。
PS3:沒有相親的打算,不約。
推薦閱讀:
※Hello Word —— 使用Python讀寫Office文檔之一
※pandas操作——重塑層次化索引
※幾個凡是,與Python 學習者共享
※Python為什麼直接運行和在命令行運行同樣語句但結果卻不同,他們的緩存機制不同嗎?
TAG:Python |