基于电影评分的推荐系统实战:Python 实现与深度剖析

一、实验目的与知识准备

  本次实验旨在掌握常用推荐算法,并运用 Python 构建推荐系统。核心算法为协同过滤算法,包括基于用户的协同过滤(UBCF)和基于物品的协同过滤(IBCF)。实验前,需学习这些算法的原理,可参考相关博客文章,如基于用户协同过滤算法的原理及代码实现,以及模型评估方法等。

 

二、实验准备:获取数据

  实验使用的数据集 ml-100k 可从明尼苏达州大学的社会化计算研究中心官网免费下载。该数据集包含用户对电影的评分信息,是构建推荐系统的基础。

三、实验步骤详解

  1.业务目标:构建基于用户的电影推荐系统,依据用户历史评分数据,找出相似用户,为目标用户推荐其可能感兴趣的未观看电影。

  2.获取电影数据:使用pandas库读取ratings.csvmovies.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

物联沃分享整理
物联沃-IOTWORD物联网 » 基于电影评分的推荐系统实战:Python 实现与深度剖析

发表回复