📅  最后修改于: 2023-12-03 15:22:15.393000             🧑  作者: Mango
推荐引擎是一种常见的应用场景,能够帮助用户发现他们可能感兴趣的内容。Pandas 是一个强大的 Python 库,可用于数据处理、分析和建模。在这篇文章中,我们将介绍如何使用 Pandas 构建一个简单的推荐引擎。
在这里我们使用一个包含用户电影评分数据的数据集。这个数据集包含三个文件:
users.csv
:包含用户信息,有 user_id
和 age
两个字段movies.csv
:包含电影信息,有 movie_id
和 title
两个字段ratings.csv
:包含用户对电影的评分信息,有 user_id
、movie_id
和 rating
三个字段使用 Pandas 读取这些数据,我们可以首先将三个文件读取为三个 DataFrames。然后,我们可以使用 merge
函数将它们合并成一个 DataFrame。
import pandas as pd
# 读取数据
users = pd.read_csv('users.csv')
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')
# 合并为一个 DataFrame
data = pd.merge(pd.merge(ratings, users), movies)
接下来,我们可以对数据进行一些预处理,比如使用 pivot_table
函数将用户对电影的评分数据转换为一个用户-电影评分矩阵。这个矩阵的行是用户,列是电影,值是用户对电影的评分。我们还可以计算出每个电影的平均评分以及每个用户评分的数量。
# 构建用户-电影评分矩阵
ratings_matrix = data.pivot_table(values='rating', index='user_id', columns='title')
# 计算每个电影的平均评分
movie_ratings_mean = data.groupby('title')['rating'].mean()
# 计算每个用户评分的数量
user_ratings_count = data.groupby('user_id')['rating'].count()
接下来,我们可以使用 Pearson 相关系数来计算每对电影之间的相似度。在这里,我们计算的是电影之间的相似度,因此矩阵的行和列都是电影。这个矩阵的值是每对电影之间的相似度。
from scipy.stats import pearsonr
# 计算相似度
movie_similarity = pd.DataFrame(index=ratings_matrix.columns, columns=ratings_matrix.columns)
for i in ratings_matrix.columns:
for j in ratings_matrix.columns:
if i == j:
continue
similarity = pearsonr(ratings_matrix[i].fillna(0), ratings_matrix[j].fillna(0))[0]
if similarity > 0:
movie_similarity.loc[i,j] = similarity
最后,我们可以使用这个电影相似度矩阵来为每个用户推荐电影。对于每个用户,我们可以找到他已评分的电影,并根据这些电影的相似度来推荐其他电影。具体来说,我们可以计算每个电影的加权平均分,其中权重是用户已评分电影与这个电影之间的相似度。然后,我们可以将这些电影按照评分排序,推荐给用户。
# 推荐电影
def recommend_movies(user_id, top_n=10):
# 找出用户已评分的电影
user_ratings = ratings_matrix.loc[user_id].dropna()
# 计算每个电影的加权平均分
movie_scores = pd.Series(index=ratings_matrix.columns)
for movie in ratings_matrix.columns:
movie_scores[movie] = 0
for rated_movie in user_ratings.index:
similarity = movie_similarity.loc[movie, rated_movie]
if not pd.isna(similarity):
movie_scores[movie] += similarity * user_ratings[rated_movie]
movie_scores[movie] /= user_ratings_count[user_id] + 1
# 按照评分排序,推荐电影
recommendations = movie_scores.sort_values(ascending=False)[:top_n]
return recommendations
在本文中,我们介绍了如何使用 Pandas 构建一个简单的推荐引擎。我们首先对数据进行了预处理,然后计算了每对电影之间的相似度,并最终使用这个相似度矩阵为每个用户推荐电影。这个模型可以进一步优化,比如可以考虑时间权重,或者加入其他特征,比如电影类型。