m0_56062032 2024-03-14 14:29 采纳率: 68%
浏览 5
已结题

knn电影推荐算法评估准确率,召回率

knn电影推荐算法评估其准确率,召回率和F1


import pandas as pd
# usecols 允许选择自己选择的特征,并通过dtype设定对应类型
movies_df=pd.read_csv('D:/Datamovies/ml-latest-small/movies.csv', 
                      usecols=['movieId','title'], 
                      dtype={'movieId':'int32','title':'str'})
movies_df.head()
ratings_df=pd.read_csv('D:/Datamovies/ml-latest-small/ratings.csv',
                       usecols=['userId', 'movieId', 'rating','timestamp'],
                       dtype={'userId': 'int32', 'movieId': 'int32', 'rating': 'float32'})
ratings_df.head()
# 检查缺失值
movies_df.isnull().sum()
ratings_df.isnull().sum()  #条目数
print("Movies:",movies_df.shape)#获取数组或矩阵维度
print("Ratings:",ratings_df.shape)
#合并列上的数据帧‘movieID’
# movies_df.info()
# ratings_df.info()
movies_merged_df=movies_df.merge(ratings_df, on='movieId')
movies_merged_df.head()
#添加衍生特征
#通过按电影标题对用户评分进行分组来创建'Average Rating' & 'Rating Count'列。
movies_average_rating=movies_merged_df.groupby('title')['rating']\
           .mean().sort_values(ascending=False)\
            .reset_index().rename(columns={'rating':'Average Rating'})
movies_average_rating.head()
movies_rating_count=movies_merged_df.groupby('title')['rating']\
              .count().sort_values(ascending=True)\
               .reset_index().rename(columns={'rating':'Rating Count'}) #ascending=False
movies_rating_count_avg=movies_rating_count.merge(movies_average_rating, on='title')
movies_rating_count_avg.head()
pd.set_option('display.float_format', lambda x: '%.3f' % x)#设置显示选项,让所有浮点数以三位小数显示
rating_with_RatingCount=movies_merged_df.merge(movies_rating_count_avg,on='title')#将movies_merged_df和movies_rating_count_avg按title列合并
print(rating_with_RatingCount['Rating Count'].describe())
popularity_threshold = 50
popular_movies= rating_with_RatingCount[
          rating_with_RatingCount['Rating Count']>=popularity_threshold]#根据popularity_threshold中的值从rating_with_RatingCount中筛选出大于等于50的电影
popular_movies.head()
# popular_movies.shape
print(popular_movies['Rating Count'].describe())
import os
movie_features_df=popular_movies.pivot_table(
      index='title',columns='userId',values='rating').fillna(0)
movie_features_df.to_excel('D:/Datamovies/ml-latest-small/output.xlsx')
movie_features_df.head()
from scipy.sparse import csr_matrix
movie_features_df_matrix = csr_matrix(movie_features_df.values)
from sklearn.neighbors import NearestNeighbors#寻找一个点的 K 个最近邻居。它返回每个点的邻居的索引和到邻居的距离
model_knn = NearestNeighbors(metric = 'cosine',
                             algorithm = 'brute')
model_knn.fit(movie_features_df_matrix)
import numpy as np
query_index = np.random.choice(movie_features_df.shape[0])
distances, indices = model_knn.kneighbors(movie_features_df.iloc[query_index,:].values.reshape(1, -1),
                                          n_neighbors = 6)
for i in range(0, len(distances.flatten())):
    if i == 0:
        print('Recommendations for {0}:\n'
              .format(movie_features_df.index[query_index]))
    else:
        print('{0}: {1}, with distance of {2}:'
              .format(i, movie_features_df.index[indices.flatten()[i]],
                      distances.flatten()[i]))
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-14 14:29
    关注

    引自免费微信小程序:皆我百晓生

    为了评估基于k-最近邻(KNN)的电影推荐算法,我们需要从上述代码中提取推荐结果,并将其与实际用户对电影的评分进行比较。在信息检索和推荐系统领域中,常用的评估指标是准确率、召回率和F1分数。

    首先,确保你已经有了一个测试集,其中包含用户对某些电影的实际评分,以及根据KNN模型生成的预测或推荐列表。在这个例子中,我们已经训练了KNN模型并为一个随机选取的电影返回了其最近邻的推荐结果。

    然而,要计算准确率、召回率和F1分数,我们需要定义正样本(用户真正喜欢的电影),并且知道推荐系统给用户推荐了哪些电影。这通常涉及到将数据分为训练集和测试集,并且针对每个用户,在测试集中计算以下指标:

    准确率(Precision):推荐的电影中有多少是用户真正喜欢的(即高分电影)。

    def calculate_precision(recommended_items, actual_positive_items):
        # 计算推荐的电影中出现在用户实际喜欢列表中的比例
        common_items = set(recommended_items).intersection(set(actual_positive_items))
        precision = len(common_items) / len(recommended_items)
        return precision
    
    # 假设函数 get_test_recommendations 返回每个用户在测试集上的推荐列表
    test_user_recommendations = get_test_recommendations()
    test_user_actual_ratings = get_test_user_actual_ratings()
    
    for user_id in test_users:
        precision = calculate_precision(test_user_recommendations[user_id], 
                                       test_user_actual_ratings[user_id])
        print(f"User {user_id} 的准确率为: {precision}")
    

    召回率(Recall):用户实际喜欢的电影中有多少被推荐系统成功找到。

    def calculate_recall(recommended_items, actual_positive_items):
        # 计算用户实际喜欢的电影中有多少被推荐系统成功找到的比例
        common_items = set(recommended_items).intersection(set(actual_positive_items))
        recall = len(common_items) / len(actual_positive_items)
        return recall
    
    for user_id in test_users:
        recall = calculate_recall(test_user_recommendations[user_id], 
                                 test_user_actual_ratings[user_id])
        print(f"User {user_id} 的召回率为: {recall}")
    

    F1分数(F1 Score):它是准确率和召回率的调和平均数,用于综合考虑两者的表现。

    from sklearn.metrics import f1_score
    
    def calculate_f1(recommended_items, actual_positive_items):
        # 使用sklearn库直接计算F1分数
        f1 = f1_score(y_true=actual_positive_items, y_pred=recommended_items)
        return f1
    
    for user_id in test_users:
        f1 = calculate_f1(test_user_recommendations[user_id], 
                          test_user_actual_ratings[user_id])
        print(f"User {user_id} 的F1分数为: {f1}")
    

    请注意,在上面的示例中,get_test_recommendations()get_test_user_actual_ratings() 是假设存在的函数,用于获取每个测试用户的推荐电影列表和他们实际给出高分的电影列表。你需要根据你的数据集结构和实验设计来实现这两个函数。

    对于整个系统的评估,你可以计算所有用户的各项指标的平均值作为整体性能的度量。同时,为了得到更全面的评价,可能还需要对不同的k值进行交叉验证,并观察不同k值下推荐效果的变化情况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 创建了问题 3月14日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改