作者|Marco Santos
编译|Flin
来源|towardsdatascience
在无休止地浏览成百上千个交友档案,却没有一个与之匹配之后,人们可能会开始怀疑这些档案是如何在手机上出现的。所有这些配置文件都不是他们要找的类型。他们已经刷了好几个小时甚至几天,都没有发现任何成功。他们可能会问:
“为什么这些约会应用程序会向我展示那些我知道我不适合的人呢?”
在很多人看来,用来显示约会档案的约会算法可能已经失效,他们厌倦了在应该匹配的时候向左滑动。每个交友网站和应用程序都可能利用自己的秘密交友算法来优化用户之间的匹配。但有时它会让人觉得它只是在向其他人展示随机用户,而没有任何解释。我们如何才能更多地了解这个问题,并与之作斗争?可以用一种叫做机器学习的方法。
我们可以使用机器学习来加速约会应用程序中用户之间的配对过程。使用机器学习,配置文件可以潜在地与其他类似的配置文件聚集在一起。这将减少互不兼容的配置文件的数量。从这些集群中,用户可以找到更像他们的其他用户。
集群配置文件数据
使用上面文章中的数据,我们能够成功地获得convenient panda DataFrame中的集群约会配置文件。
在此DataFrame中,每一行都有一个配置文件,最后,在将Hierarchical Agglomerative Clustering(https://www.datanovia.com/en/...) 应用于数据集后,我们可以看到它们所属的集群组。每个配置文件都属于一个特定的集群编号或组。
不过,这些小组可以进行一些改进。
对集群配置文件进行排序
使用集群文件数据,我们可以根据每个文件之间的相似程度对结果进行排序,从而进一步细化结果。这个过程可能比你想象的更快更容易。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来简单地选择集群和用户。这样做是为了使我们的代码可以适用于数据集中的任何用户。一旦我们有了随机选择的集群,我们就可以缩小整个数据集的范围,使之只包含那些带有所选集群的行。
矢量化
在缩小选定集群组的范围后,下一步涉及对该组中的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名与自己最相似的用户。这将有望减少刷屏的时间,减少挫败感,并增加我们假设的约会应用程序用户之间的匹配度。假设的约会应用程序的算法将实现无监督机器学习聚类,以创建一组约会配置文件。在这些组中,算法将根据相关得分对配置文件进行排序。最后,它将能够向用户展示与自己最相似的约会档案。