使用機器學習和Python對約會資料進行排序

做者|Marco Santos
編譯|Flin
來源|towardsdatasciencepython

在無休止地瀏覽成百上千個交友檔案,卻沒有一個與之匹配以後,人們可能會開始懷疑這些檔案是如何在手機上出現的。全部這些配置文件都不是他們要找的類型。他們已經刷了好幾個小時甚至幾天,都沒有發現任何成功。他們可能會問:ios

「爲何這些約會應用程序會向我展現那些我知道我不適合的人呢?」算法

在不少人看來,用來顯示約會檔案的約會算法可能已經失效,他們厭倦了在應該匹配的時候向左滑動。每一個交友網站和應用程序均可能利用本身的祕密交友算法來優化用戶之間的匹配。但有時它會讓人以爲它只是在向其餘人展現隨機用戶,而沒有任何解釋。咱們如何才能更多地瞭解這個問題,並與之做鬥爭?能夠用一種叫作機器學習的方法。less

咱們可使用機器學習來加速約會應用程序中用戶之間的配對過程。使用機器學習,配置文件能夠潛在地與其餘相似的配置文件彙集在一塊兒。這將減小互不兼容的配置文件的數量。從這些集羣中,用戶能夠找到更像他們的其餘用戶。dom

集羣配置文件數據

使用上面文章中的數據,咱們可以成功地得到convenient panda DataFrame中的集羣約會配置文件。機器學習

在此DataFrame中,每一行都有一個配置文件,最後,在將Hierarchical Agglomerative Clustering(https://www.datanovia.com/en/lessons/agglomerative-hierarchical-clustering/) 應用於數據集後,咱們能夠看到它們所屬的集羣組。每一個配置文件都屬於一個特定的集羣編號或組。學習

不過,這些小組能夠進行一些改進。優化

對集羣配置文件進行排序

使用集羣文件數據,咱們能夠根據每一個文件之間的類似程度對結果進行排序,從而進一步細化結果。這個過程可能比你想象的更快更容易。網站

import random

# 隨機選擇一個集羣
rand_cluster = random.choice(df['Cluster #'].unique())

# 將集羣配置文件分配爲新的DF
group = df[df['Cluster #']==rand_cluster].drop('Cluster #', axis=1)


## 矢量化所選集羣中的BIOS

# 將Vectorizer適配到BIOS
cluster_x = vectorizer.fit_transform(group['Bios'])

# 建立一個包含矢量化單詞的新DF
cluster_v = pd.DataFrame(cluster_x.toarray(), index=group.index, columns=vectorizer.get_feature_names())

# 鏈接向量DF和原始DF
group = group.join(cluster_v)

# 刪除BIOS,由於再也不須要它來代替矢量化
group.drop('Bios', axis=1, inplace=True)


## 在用戶之間尋找關聯

# 定位DF,以便咱們與索引(用戶)關聯
corr_group = group.T.corr()


## 尋找排名前10位的相似用戶

# 隨機選擇一個用戶
random_user = random.choice(corr_group.index)

print("Top 10 most similar users to User #", random_user, '\n')

# 建立與所選用戶最類似的前10名用戶的DF
top_10_sim = corr_group[[random_user]].sort_values(by=[random_user],axis=0, ascending=False)[1:11]

# 打印結果
print(top_10_sim)

print("\nThe most similar user to User #", random_user, "is User #", top_10_sim.index[0])

代碼分解

讓咱們將代碼分解爲從random開始的簡單步驟,在整個代碼中使用random來簡單地選擇集羣和用戶。這樣作是爲了使咱們的代碼能夠適用於數據集中的任何用戶。一旦咱們有了隨機選擇的集羣,咱們就能夠縮小整個數據集的範圍,使之只包含那些帶有所選集羣的行。.net

矢量化

在縮小選定集羣組的範圍後,下一步涉及對該組中的bios進行矢量化。

用於此操做的矢量器與用於建立初始集羣數據幀的矢量器相同-CountVectorizer()。(向量器變量是在咱們對第一個數據集進行向量化時預先實例化的,這能夠在上面的文章中看到)。

# 使向量化器適合Bios 
cluster_x = vectorizer.fit_transform(group['Bios'])
# 建立一個新的DF,其中包含向量化的詞
cluster_v = pd.DataFrame(cluster_x.toarray(), 
                         index=group.index,   
                         columns=vectorizer.get_feature_names())

經過對Bios進行矢量化處理,咱們建立了一個二進制矩陣,其中包含每一個bio中的單詞。

而後,咱們會將這個向量化的DataFrame加入到選定的組/集羣DataFrame中。

# 將向量DF和原始DF鏈接起來
group = group.join(cluster_v)
# 刪除Bios,由於再也不須要它
group.drop('Bios', axis=1, inplace=True)

將兩個DataFrame結合在一塊兒以後,剩下的是矢量化的bios和分類列:

從這裏咱們能夠開始找到彼此最類似的用戶。

尋找約會文件之間的相關性

建立填充了二進制值和數字的DataFrame以後,咱們就能夠開始查找約會配置文件之間的相關性。每一個約會檔案都有一個惟一的索引號,咱們能夠將其用做參考。

一開始,咱們一共有6600個約會檔案。在聚類並縮小數據幀到所選聚類以後,約會配置文件的數量能夠從100到1000不等。在整個過程當中,約會配置文件的索引號保持不變。如今,咱們可使用每一個索引號來引用每一個約會配置文件。

每一個索引號表明一個惟一的約會我的資料,咱們能夠爲每一個我的資料找到類似或相關的用戶。這能夠經過運行一行代碼來建立相關矩陣來實現。

corr_group = group.T.corr()

咱們須要作的第一件事是轉置 DataFrame以便切換列和索引。這樣作是爲了使咱們使用的相關方法應用於索引而不是列。一旦咱們轉換了DF,咱們就能夠應用.corr()方法,它將在索引之間建立一個相關矩陣。

該相關矩陣包含使用Pearson相關方法計算的數值。接近1的值彼此正相關,這就是爲何您將看到與本身的索引相關的索引爲1.0000的緣由。

查找排名前10的類似約會資料

如今,咱們有了一個包含每一個索引/約會檔案的相關性得分的相關矩陣,咱們能夠開始根據它們的類似性對檔案進行排序。

random_user = random.choice(corr_group.index)
print("Top 10 most similar users to User #", random_user, '\n')
top_10_sim = corr_group[[random_user]].sort_values(by=
             [random_user],axis=0, ascending=False)[1:11]
print(top_10_sim)
print("\nThe most similar user to User #", random_user, "is User #", top_10_sim.index[0])

上面代碼塊中的第一行從相關矩陣中選擇隨機的約會配置文件或用戶。從那裏,咱們能夠選擇具備所選用戶的列,並對列中的用戶進行排序,以便它只返回前10個最相關的用戶(不包括所選索引自己)。

成功!—— 當咱們運行上面的代碼時,咱們會獲得一個用戶列表,按照他們各自的相關得分進行排序。咱們能夠看到與隨機選擇的用戶最類似的前10個用戶。這能夠與另外一個集羣組和另外一個配置文件或用戶一塊兒再次運行。

結束語

若是這是一個約會應用程序,用戶將可以看到前10名與本身最類似的用戶。這將有望減小刷屏的時間,減小挫敗感,並增長咱們假設的約會應用程序用戶之間的匹配度。假設的約會應用程序的算法將實現無監督機器學習聚類,以建立一組約會配置文件。在這些組中,算法將根據相關得分對配置文件進行排序。最後,它將可以向用戶展現與本身最類似的約會檔案。

原文連接:https://towardsdatascience.com/sorting-dating-profiles-with-machine-learning-and-python-51db7a074a25

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索