个性化阅读
专注于IT技术分析

用Python构建一个简单的推荐系统

本文概述

你是否考虑过Google如何创建与你的喜好相近的推荐电影?它如何为你”弄清楚”呢?好了, 阅读这篇文章后, 你将能够知道专有技术。更好的是, 你将能够自己构建推荐系统。

作为网络创建者, 每个python开发人员都必须了解一些事情, 例如pandas和numpy库。本文中使用的初学者程序甚至无法与行业标准相提并论。因此, 它仅用作系统介绍。我们假设读者具有Python的先前经验。

什么是推荐系统?

推荐系统是一种基本计算, 旨在通过检测数据集中的相关性为客户提供最相关的信息。该算法评估元素, 并向用户显示接近其偏好的高度项目。

Netflix和亚马逊是此类推荐系统的最佳示例。每当你在Amazon上选择商品时, 它就会自动开始向你显示你可能想要的其他商品。 Netflix及其为你推荐电影的选项也是如此。

推荐系统Python

有三种构建推荐系统的方法:

  • 基于受欢迎程度的推荐人系统
  • 推荐人基于内容的系统
  • 基于相似度的推荐人系统

用python构建一个简单的推荐系统

在此基本推荐器系统中, 我们使用的是电影镜头。这是一个基于相似度的推荐系统。如果愿意, 可以使用PyCharm或Skit-Learn, 并了解为什么pycharm对于每个python程序员都变得越来越重要。因此, 进入第一步, 导入numPy和pandas是我们的首要任务。

import pandas as pd 
import numpy as np
import warnings
warnings.filterwarnings('ignore')

随后, 我们在数据集中使用pandas read_csv()实用程序。数据集与选项卡分开, 因此sep参数在\ t中传递。然后, 我们转到名称参数。

df = pd.read_csv('u.data', sep='\t', names=['user_id', 'item_id', 'rating', 'titmestamp'])

让我们搜索数据头以查看我们所关注的数据。

df.head()

如果我们能看到电影的标题而不是仅仅处理ID, 那将很容易。加载电影标题并合并数据集;

movie_titles = pd.read_csv('Movie_Titles')
movie_titles.head()

由于item_id的列都是相同的, 因此可以将这些数据集合并到此部分中。

df = pd.merge(df, movie_titles, on='item_id')
df.head()

让我们看一下每一列的表示形式:

  • user_id-为电影评分的用户的ID。

  • item_id-电影的ID。

  • 评分-用户对电影的评分, 介于1到5之间。

  • 时间戳-电影的评级时间。

  • title-电影的标题。

我们可以使用description或info命令获得对数据集的简短描述。

df.describe()

我们可以说平均分数是3.52, 最高分数是5。

让我们用每部电影的平均评分和评分编号构建一个数据框。稍后我们将使用这些评级来衡量电影之间的相关性。具有高相关系数的电影是彼此之间最具有可比性的电影。在我们的案例中, 我们将使用皮尔森相关系数。该数字的范围是从-1到1。1显示正线性相关, 而负相关由-1表示。 0没有线性相关性, 并且显示这些薄膜无论如何都不相似。

ratings = pd.DataFrame(df.groupby('title')['rating'].mean())
ratings.head()

现在, 我们要查看每部电影的收视率数量。这是通过创建诸如number_of_ratings之类的列来完成的。看电影的平均评级与该电影获得的评级数量之间的关系很重要。只有一个人可能对这部五星级电影进行了评分。因此, 将影片归类为5星影片在统计上是错误的。

因此, 在构建推荐系统时, 我们需要为最低评分数量设置一个阈值。我们使用按公用程序分组的熊猫来创建此新列。我们对标题进行分组, 然后使用计数功能确定每部电影的评级数量。让我们使用head()函数查看新的数据框。

ratings['number_of_ratings'] = df.groupby('title')['rating'].count()
ratings.head()

现在让我们用熊猫绘制直方图来表示收视率分布

import matplotlib.pyplot as plt
%matplotlib inline
ratings['rating'].hist(bins=50)

我们看到几乎所有电影的范围都在2.5到4之间。接下来, 让我们对”评级数”列进行类似的查看。

ratings['number_of_ratings'].hist(bins=60)

从上面的直方图可以明显看出, 几部电影的收视率非常低。收视率最高的电影是最著名的电影。

现在让我们测试电影的评级与评级数量之间的相关性。我们通过使用seaborn来绘制散点图来做到这一点。 Seaborn允许它具有jointplot()函数。

import seaborn as sns
sns.jointplot(x='rating', y='number_of_ratings', data=ratings)

从图中我们可以看到, 电影的收视率和平均收视率之间存在正相关关系。该图表明, 电影获得的评级越高, 获得的电影也就越高。

现在让我们快速前进, 并基于相似性构建一个简单的推荐系统。如果我们希望将电影标题作为列, 将user_id作为列表, 将等级作为值, 那么我们需要将数据集转换为矩阵。

这样, 我们将获得一个数据帧, 其中包含诸如电影标题之类的列以及诸如用户ID之类的行。每列反映了电影的所有用户评分。该等级指示用户尚未对特定电影进行评级的NAN。要构建电影矩阵, 我们使用pandasivot_table实用程序。

movie_matrix = df.pivot_table(index='user_id', columns='title', values='rating')
movie_matrix.head()

首先, 让我们看看收视率最高的电影, 并从中挑选2部, 以这个简单的推荐系统开始。要组织最有价值的电影, 我们使用pandas sort values实用程序并将其设置为false。然后我们将函数head()用于前10名。

ratings.sort_values('number_of_ratings', ascending=False).head(10)

假设用户观看了空军一号(1997)和联系人(1997)。根据此观看记录, 我们希望向该用户推荐电影。我们的目标是搜索类似于Contact(1997)和Air Force One(1997)的电影, 我们将向他们推荐这些电影。这可以通过计算这两个电影的评级与数据集中其余电影的评级之间的相似性来实现。第一步是开发一个具有来自电影矩阵的此类电影的两个评级的数据帧。

AFO_user_rating = movie_matrix['Air Force One (1997)']
contact_user_rating = movie_matrix['Contact (1997)']
AFO_user_rating.head()
contact_user_rating.head()

我们使用pandas corwith功能来计算两个数据帧之间的相关性。 Corrwith计算两个数据框对象的行或列的对相关性。让我们使用此功能获得结果;

similar_to_air_force_one=movie_matrix.corrwith(AFO_user_rating)

我们可以看到空军一号电影与《蒂尔是你》的相关性为0.867。这表明这两部电影具有非常强的相似性。

similar_to_air_force_one.head()

继续, 让我们使用相同的过程来计算”接触”等级与其余电影的相关性。

similar_to_contact = movie_matrix.corrwith(contact_user_rating)

我们看到Contact(1997)和Til There Was You(1997)之间有很强的相关性。

similar_to_contact.head()

如前所述, 我们的矩阵有很多缺失值, 因为并非所有电影都得到所有订户的评分。因此, 我们将这些空值转储并将相关结果转换为数据帧, 以使信息显得更具吸引力。

corr_contact = pd.DataFrame(similar_to_contact, columns=['Correlation'])
corr_contact.dropna(inplace=True)
corr_contact.head()
corr_AFO = pd.DataFrame(similar_to_air_force_one, columns=['correlation'])
corr_AFO.dropna(inplace=True)
corr_AFO.head()

上面的数据框告诉我们与接触式和空军一号电影最相似的电影。但是, 我们有一个问题, 有些电影的评论相当多, 可能仅仅因为一两个人就获得了5星评级而最终被推荐。

我们可以通过设置几个评级阈值来解决此问题。我们已经看到分数的数量从之前的直方图急剧下降到100。因此, 我们将其设置为限制, 但这是一个数字, 你可以使用它直到你有适当的选择为止。

为此, 两个数据框必须与数据框额定值中的”额定值”列数结合在一起。

corr_AFO = corr_AFO.join(ratings['number_of_ratings'])
corr_contact = corr_contact.join(ratings['number_of_ratings'])
corr_AFO .head()
corr_contact.head()

现在, 我们将把与空军一号最相似的电影限制为至少具有100条反馈的电影。然后, 我们根据相关性列来形成它们, 并查看前十个。

corr_AFO[corr_AFO['number_of_ratings']>100].sort_values(by='correlation', ascending=False).head(10)

我们注意到空军一号与自身之间的完美关联。空军一号的下一部最相似的电影是《猎杀红色十月》, 相关系数为0.554。通过更改评论数量的阈值, 我们可以从以前的方法中获得不同的结果。限制收视率的数量可以给我们带来更好的效果, 我们可以推荐上述电影给有把握和信誉的空军一号(1997)观看者。

总结

当然, 这是构建推荐程序的一种非常简单的方法, 而且还远远没有达到行业标准。但是, 你仍然可以自行找到类似的真实电影推荐。多么酷啊!

可以将其用作基础学习教程, 并且现在可以使用python构建简单的神经网络。如果你发现难以使用Python, 则可以随时学习Java编程。

永远记住, 编码的秘诀是继续前进!

赞(0)
未经允许不得转载:srcmini » 用Python构建一个简单的推荐系统

评论 抢沙发

评论前必须登录!