m0_56062032 2024-03-14 12:56 采纳率: 68%
浏览 1
已结题

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

在做评估模型召回率,准确率,F1时出现错误,说是括号问题,查了很多不知道哪里的问题


def evaluate_recommendations(test_set, userma_to_num, data_handling, predict, k=10):
    TP = 0  # True Positives
    FP = 0  # False Positives
    FN = 0  # False Negatives
    for user_id in test_set.index:
# Generate recommendations
        recommendations = recommend_movies(user_id, userma_to_num, data_handling, predict, k)
# Get actual liked movies from test set
        actual_liked_movies = test_set.loc[user_id][test_set.loc[user_id] > 0].index.tolist()
        for movie_id in recommendations:
            if movie_id in actual_liked_movies:
                TP += 1
            else:
                FP += 1
        for movie_id in actual_liked_movies:
            if movie_id not in recommendations:
                FN += 1
        precision = TP / (TP + FP)
        recall = TP / (TP + FN)
        f1_score = 2 * (precision * recall) / (precision + recall)
    return precision, recall, f1_score
def recommend_movies(user_id, userma_to_num, data_handling, predict, k=10):
    a = predict[:, user_id]
    max_indexs = heapq.nlargest(k, range(len(a)), a.take)
    return max_indexs

def main():
# Your existing code here...
# Splitting data into training and testing sets (80% train, 20% test)
    train_set = df1.sample(frac=0.8, random_state=42)
    test_set = df1.drop(train_set.index)
# Preprocessing...
# Training the model...
# Generate recommendations and evaluate
    
    precision, recall, f1_score = evaluate_recommendations(test_set, userma_to_num, data_handling, predict)

    print("Precision:", precision)
    print("Recall:", recall)
    print("F1 Score:", f1_score)
if __name__ == "__main__":
    main()
  • 写回答

3条回答 默认 最新

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

    m0_56062032 中午好🌞🌞🌞
    本答案参考ChatGPT-3.5

    你遇到的错误是括号问题,可能是因为计算公式的括号使用不正确导致。根据你提供的代码和问题描述,括号问题可能出现在计算precision、recall和f1_score的公式中

    为了解决这个问题,你可以通过调整括号的位置来确保计算顺序正确。下面是一些解决方案:

    1. 检查公式计算的括号位置:检查precision、recall和f1_score的公式中括号的位置是否正确。确保括号位于正确的位置以确保计算的正确性。

    2. 计算之前先重置计数器:在每次循环开始之前,重置TP、FP和FN的计数器为0。这样可以确保每次循环的计数结果是正确的,而不会受到上一次循环的影响。

    3. 检查recommend_movies函数的输出格式:确保recommend_movies函数返回的结果是一个包含影片编号的列表。如果格式不正确,可能会导致recommendations列表中的影片不能正确地和actual_liked_movies列表中的影片进行匹配。

    4. 检查数据处理和预测函数的正确性:确保data_handling和predict函数返回正确的结果。这些函数可能会影响到recommend_movies函数的结果,进而影响到计算推荐评估指标的正确性。

    修改后的代码如下所示:

    def evaluate_recommendations(test_set, userma_to_num, data_handling, predict, k=10):
        TP = 0  # True Positives
        FP = 0  # False Positives
        FN = 0  # False Negatives
        for user_id in test_set.index:
            # Generate recommendations
            recommendations = recommend_movies(user_id, userma_to_num, data_handling, predict, k)
            # Get actual liked movies from test set
            actual_liked_movies = test_set.loc[user_id][test_set.loc[user_id] > 0].index.tolist()
            for movie_id in recommendations:
                if movie_id in actual_liked_movies:
                    TP += 1
                else:
                    FP += 1
            for movie_id in actual_liked_movies:
                if movie_id not in recommendations:
                    FN += 1
            precision = TP / (TP + FP)
            recall = TP / (TP + FN)
            f1_score = 2 * (precision * recall) / (precision + recall)
            
        return precision, recall, f1_score
    
    def recommend_movies(user_id, userma_to_num, data_handling, predict, k=10):
        a = predict[:, user_id]
        max_indexs = heapq.nlargest(k, range(len(a)), a.take)
        return max_indexs
    
    def main():
        # Your existing code here...
        # Splitting data into training and testing sets (80% train, 20% test)
        train_set = df1.sample(frac=0.8, random_state=42)
        test_set = df1.drop(train_set.index)
        # Preprocessing...
        # Training the model...
        # Generate recommendations and evaluate
        precision, recall, f1_score = evaluate_recommendations(test_set, userma_to_num, data_handling, predict)
    
        print("Precision:", precision)
        print("Recall:", recall)
        print("F1 Score:", f1_score)
    
    if __name__ == "__main__":
        main()
    

    请确保在运行代码之前,对test_set、userma_to_num、data_handling和predict变量进行正确的赋值和初始化。

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥66 比特币地址如何生成taproot地址
  • ¥20 数学建模数学建模需要
  • ¥15 关于#lua#的问题,请各位专家解答!
  • ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
  • ¥15 不知道是该怎么引用多个函数片段
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决