m0_56062032 2024-03-14 14:19 采纳率: 65.4%
浏览 1
已结题

TensorFlow电影推荐评估准确率

怎样计算这个准确率,召回率和F1呢?


import pandas as pd
import numpy as np
import tensorflow as tf
ratings_df = pd.read_csv('D:/Datamovies/ml-latest-small/ratings.csv')
ratings_df.tail()
movies_df = pd.read_csv('D:/Datamovies/ml-latest-small/movies.csv')
movies_df['movieRow'] = movies_df.index #添加电影行数
ratings_df.tail()
movies_df.tail()
movies_df = movies_df[['movieRow','movieId','title']]
movies_df.to_csv('D:/Datamovies/ml-25min/moviesProcessed.csv',index = False,header = True,encoding = 'utf-8')
ratings_df = pd.merge(ratings_df,movies_df,on = 'movieId')
ratings_df = ratings_df[['userId','movieRow','rating']]
ratings_df.to_csv('D:/Datamovies/ml-25min/ratingsProcessed.csv',index = False,header = True,encoding = 'utf-8')
userNo = ratings_df['userId'].max()+1
movieNo = ratings_df['movieRow'].max()+1
rating = np.zeros((movieNo,userNo))
flag = 0 #记录处理进度
ratings_df_length = np.shape(ratings_df)[0]
for index,row in ratings_df.iterrows():#获取ratings_df的每一行
        rating[int(row['movieRow']),int(row['userId'])] = row['rating']
        flag += 1 #表示处理完一行
        print('processed %d,%d left'%(flag,ratings_df_length-flag))
#将构建record矩阵并将矩阵中的Boolean值改成相应的数值
record = rating>0 
record = np.array(record,dtype = int)
record
def normalizeRatings(rating,record):#缩放评分矩阵范围
    m,n = rating.shape#m为电影数量,n为用户数量
    rating_mean = np.zeros((m,1))#初始化电影评分平均值为0
    rating_norm = np.zeros((m,n))#保存处理后的数据
    for i in range(m):
        idx = record[i,:] != 0 #获取每部电影评分用户的下标,每部电影的评分
        rating_mean[i] = np.mean(rating[i,idx])#表示第i行已经评过分的用户的平均值
        rating_norm[i,idx] -= rating_mean[i]
    return rating_norm,rating_mean
tf.compat.v1.disable_eager_execution()

rating_norm,rating_mean = normalizeRatings(rating,record) #由于数据中的某些行有这里会出现警告
#处理nan
rating_norm = np.nan_to_num(rating_norm)
rating_mean = np.nan_to_num(rating_mean)
#假设一共有10类电影
num_features = 10
#初始化电影内容矩阵和用户喜好矩阵,产生的参数都是随机数并且是正态分布的
X_parameters = tf.Variable(tf.random.normal([movieNo,num_features],stddev = 0.35))
Theta_parameters = tf.Variable(tf.random.normal([userNo,num_features],stddev = 0.35))
# 构建损失函数
loss = 1/2 * tf.reduce_sum(((tf.matmul(X_parameters,Theta_parameters,transpose_b = True)- rating_norm)*record)**2)+ 1/2 *(tf.reduce_sum(X_parameters**2) + tf.reduce_sum(Theta_parameters**2))
#将X_parameters,Theta_parameters矩阵相乘相乘之前将Theta_parameters转置
#创建优化器和优化目标
optimizer = tf.compat.v1.train.AdamOptimizer(1e-4)
train = optimizer.minimize(loss)
#tf.summary.scalar('loss',loss)
loss_summary = tf.compat.v1.summary.scalar('loss', loss)
summaryMerged =tf.compat.v1.summary.merge_all()
with tf.compat.v1.Session() as sess:
    sess.run(tf.compat.v1.global_variables_initializer())
    filename = 'D:/Datamovies/ml-25min/movie_tensorboard'
    writer = tf.summary.create_file_writer(filename)
    for i in range(50):
        _,movie_summary = sess.run([train,loss_summary])
        #writer.add_summary(movie_summary, i)
        with writer.as_default():
            tf.summary.scalar('loss', movie_summary, step=i)
            writer.flush()
with tf.compat.v1.Session() as sess:
    sess.run(tf.compat.v1.global_variables_initializer())
    Current_X_parameters,Current_Theta_parameters = sess.run([X_parameters,Theta_parameters])
predicts = np.dot(Current_X_parameters,Current_Theta_parameters.T)+rating_mean
errors = np.sqrt(np.sum(predicts-rating)%2)
print(u'模型评估errors:', errors)
user_id = input('请输入要推荐的用户编号:')
user_id = int(user_id)
sortedResult = predicts[:,user_id].argsort()[::-1]#获取该用户的电影评分列表
print('为该用户提供的推荐列表:'.center(80,'='))
idx =0
for i in sortedResult:
    print('评分:%.2f,电影名:%s'%(predicts[i,int(user_id)],movies_df.iloc[i]['title']))
    idx +=1
    if idx == 20:
        break
  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-14 14:19
    关注

    m0_56062032 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    计算准确率(Accuracy),召回率(Recall)和F1值,可以按照以下步骤进行:

    1. 首先,根据实际评分和预测评分,将评分转换为二分类问题,即转换为用户是否喜欢该电影的预测问题。例如,将评分大于3的预测为1,表示用户喜欢该电影;将评分小于等于3的预测为0,表示用户不喜欢该电影。

    2. 根据上一步转换后的预测结果和实际结果,计算准确率(Accuracy),召回率(Recall)和F1值:

      • 准确率(Accuracy)为分类正确的样本数除以总样本数。可使用sklearn库中的accuracy_score函数计算。
      • 召回率(Recall)为正例被正确预测的样本数除以所有正例样本数。可使用sklearn库中的recall_score函数计算。
      • F1值(F1-score)为准确率和召回率的调和平均值,可以综合考虑准确率和召回率的性能。可使用sklearn库中的f1_score函数计算。

    修改后的代码:

    from sklearn.metrics import accuracy_score, recall_score, f1_score
    
    # 将预测评分转换为二分类问题
    predicted_ratings = np.where(predicts > 3, 1, 0)
    
    # 将实际评分转换为二分类问题
    actual_ratings = np.where(rating > 3, 1, 0)
    
    # 计算准确率
    accuracy = accuracy_score(actual_ratings.flatten(), predicted_ratings.flatten())
    
    # 计算召回率
    recall = recall_score(actual_ratings.flatten(), predicted_ratings.flatten())
    
    # 计算F1值
    f1 = f1_score(actual_ratings.flatten(), predicted_ratings.flatten())
    
    print("准确率:", accuracy)
    print("召回率:", recall)
    print("F1值:", f1)
    

    以上代码中的actual_ratings.flatten()predicted_ratings.flatten()用于将二维数组转换为一维数组,以便计算准确率、召回率和F1值。

    解决方案总结:

    1. 将电影评分转换为二分类问题,根据评分阈值将评分大于阈值的预测为1,评分小于等于阈值的预测为0。
    2. 使用sklearn库中的accuracy_score函数计算准确率,recall_score函数计算召回率,f1_score函数计算F1值。
    3. 打印准确率、召回率和F1值。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 基于OPENCV的人脸识别
  • ¥20 51单片机学习中的问题
  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!