📜  使用 Pandas 构建推荐引擎(1)

📅  最后修改于: 2023-12-03 15:22:15.393000             🧑  作者: Mango

使用 Pandas 构建推荐引擎

介绍

推荐引擎是一种常见的应用场景,能够帮助用户发现他们可能感兴趣的内容。Pandas 是一个强大的 Python 库,可用于数据处理、分析和建模。在这篇文章中,我们将介绍如何使用 Pandas 构建一个简单的推荐引擎。

程序分析
数据集

在这里我们使用一个包含用户电影评分数据的数据集。这个数据集包含三个文件:

  • users.csv:包含用户信息,有 user_idage 两个字段
  • movies.csv:包含电影信息,有 movie_idtitle 两个字段
  • ratings.csv:包含用户对电影的评分信息,有 user_idmovie_idrating 三个字段
预处理数据

使用 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 构建一个简单的推荐引擎。我们首先对数据进行了预处理,然后计算了每对电影之间的相似度,并最终使用这个相似度矩阵为每个用户推荐电影。这个模型可以进一步优化,比如可以考虑时间权重,或者加入其他特征,比如电影类型。