做者|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的缘由。
如今,咱们有了一个包含每一个索引/约会档案的相关性得分的相关矩阵,咱们能够开始根据它们的类似性对档案进行排序。
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/