Recommendation System

추천 시스템 평가(precision@k, recall@k)

Dan-k 2024. 6. 28. 10:00
반응형

 

Precision@K

- Precision@K는 추천시스템이 얼마나 정확하게 추천을 했는지를 평가

- 여기서 K는 추천된 아이템의 상위 몇 개를 고려할 것인지를 

- 예를 들어, precision@5는 상위 5개의 추천 아이템 중에서 사용자가 선호하는 아이템이 얼마나 있는지를 측정

 

Recall@K

- Recall@K는 추천시스템이 사용자가 선호하는 아이템을 얼마나 많이 찾아냈는지를 평가

- 여기서도 K는 추천된 아이템의 상위 몇 개를 고려

- 예를 들어, recall@5는 상위 5개의 추천 아이템 중에서 사용자가 실제로 좋아하는 모든 아이템 중 몇 개를 포함하고 있는지를 측정

 

계산 예시

클릭한적 있는 item: [2, 4, 6, 8]

모델 예측 결과 item: [3, 1, 2, 5, 6, 7, 8] -> 클릭할 확률이 높은 순으로 배열

precision@3

 [3, 1, 2, 5, 6, 7, 8]

[3, 1, 2] intersect [2, 4, 6, 8] / 3 = 0.33

 

recall@3

 [3, 1, 2, 5, 6, 7, 8]

[1, 2, 3] intersect [2, 4, 6, 8] / 4 = 0.25

 

코드

def precision_at_k(recommended_items, relevant_items, k):
    """
    Calculate precision@k.
    
    Parameters:
    recommended_items (list): List of recommended items
    relevant_items (list): List of relevant (liked) items
    k (int): Number of top recommendations to consider
    
    Returns:
    float: precision@k value
    """
    # Take the top k recommended items
    top_k_recommended = recommended_items[:k]
    
    # Count the number of relevant items in the top k recommended items
    relevant_in_top_k = len(set(top_k_recommended) & set(relevant_items))
    
    # Calculate precision@k
    precision_k = relevant_in_top_k / k
    
    return precision_k

def recall_at_k(recommended_items, relevant_items, k):
    """
    Calculate recall@k.
    
    Parameters:
    recommended_items (list): List of recommended items
    relevant_items (list): List of relevant (liked) items
    k (int): Number of top recommendations to consider
    
    Returns:
    float: recall@k value
    """
    # Take the top k recommended items
    top_k_recommended = recommended_items[:k]
    
    # Count the number of relevant items in the top k recommended items
    relevant_in_top_k = len(set(top_k_recommended) & set(relevant_items))
    
    # Calculate recall@k
    recall_k = relevant_in_top_k / len(relevant_items)
    
    return recall_k

# 예시 데이터
recommended_items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # 추천된 아이템 리스트
relevant_items = [3, 5, 7, 9, 11]  # 사용자가 선호하는 아이템 리스트
k = 5  # 상위 k개의 추천 아이템을 고려

# precision@k 계산
precision = precision_at_k(recommended_items, relevant_items, k)
print(f'Precision@{k}: {precision:.2f}')

# recall@k 계산
recall = recall_at_k(recommended_items, relevant_items, k)
print(f'Recall@{k}: {recall:.2f}')
728x90
반응형
LIST