基于电影评分的推荐系统实战:Python 实现与深度剖析
一、实验目的与知识准备
本次实验旨在掌握常用推荐算法,并运用 Python 构建推荐系统。核心算法为协同过滤算法,包括基于用户的协同过滤(UBCF)和基于物品的协同过滤(IBCF)。实验前,需学习这些算法的原理,可参考相关博客文章,如基于用户协同过滤算法的原理及代码实现,以及模型评估方法等。
二、实验准备:获取数据
实验使用的数据集 ml-100k 可从明尼苏达州大学的社会化计算研究中心官网免费下载。该数据集包含用户对电影的评分信息,是构建推荐系统的基础。
三、实验步骤详解
1.业务目标:构建基于用户的电影推荐系统,依据用户历史评分数据,找出相似用户,为目标用户推荐其可能感兴趣的未观看电影。
2.获取电影数据:使用pandas
库读取ratings.csv
和movies.csv
文件,查看数据前五行以了解数据结构。代码如下:
import pandas as pd
def get_movie_data():
ratings = pd.read_csv('ratings.csv')
movies = pd.read_csv('movies.csv')
print("ratings数据前五行:")
print(ratings.head())
print("movies数据前五行:")
print(movies.head())
return ratings, movies
3.数据准备和清理:构建用户 – 电影评分矩阵,将缺失值填充为 0。这一步为后续计算用户相似度和推荐电影奠定基础:
def prepare_and_clean_data(ratings, movies):
user_item_matrix = ratings.pivot_table(index='userid', columns='movieid', values='rating', fill_value=0)
return user_item_matrix
4.处理数据:利用scikit - learn
库中的cosine_similarity
函数计算用户相似度,生成用户相似度矩阵:
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
def process_data(user_item_matrix):
user_similarity = cosine_similarity(user_item_matrix)
user_similarity_df = pd.DataFrame(user_similarity, index=user_item_matrix.index, columns=user_item_matrix.index)
return user_similarity_df
5.建立推荐模型:获取目标用户的评分数据,找到相似用户,预测目标用户对未评分电影的评分,筛选并排序推荐电影:
import pandas as pd
def build_recommendation_model(user_similarity_df, user_item_matrix, target_user_id, n_recommendations=5):
target_user_ratings = user_item_matrix.loc[target_user_id]
similar_users = user_similarity_df[target_user_id].sort_values(ascending=False).drop(target_user_id).head(10)
recommendation_scores = pd.Series(0.0, index=user_item_matrix.columns)
for sim_user_id in similar_users.index:
sim_user_ratings = user_item_matrix.loc[sim_user_id]
weight = similar_users[sim_user_id]
unrated_mask = target_user_ratings == 0
recommendation_scores[unrated_mask] += weight * sim_user_ratings[unrated_mask]
unrated_movies = target_user_ratings[target_user_ratings == 0].index
recommendation_scores = recommendation_scores[unrated_movies].sort_values(ascending=False)
return recommendation_scores
6.给用户推荐电影:根据推荐得分获取电影信息,并展示推荐结果:
import pandas as pd
def recommend_movies(movies, recommendation_scores, n_recommendations=5):
recommended_movies = movies[movies['movieid'].isin(recommendation_scores.index)].head(n_recommendations)
recommended_movies['predicted_score'] = recommendation_scores.values[:n_recommendations]
return recommended_movies[['title', 'genres', 'predicted_score']]
if __name__ == "__main__":
ratings, movies = get_movie_data()
user_item_matrix = prepare_and_clean_data(ratings, movies)
user_similarity_df = process_data(user_item_matrix)
user_id = 1
recommendation_scores = build_recommendation_model(user_similarity_df, user_item_matrix, user_id)
recommendations = recommend_movies(movies, recommendation_scores)
print(f"为用户{user_id}推荐的电影:")
print(recommendations)
四、运行结果
下面是对用户1和20的推荐电影,可以在代码中修改user_id来查看不同用户的推荐电影。
作者:#guiyin11