파이썬(Python)으로 추천 시스템 구현하기 : 아이템 기반 협업 필터링

1. 서론: 아이템 기반 협업 필터링 – 추천 시스템의 핵심

  • 디지털 정보의 홍수 속에서 개인화된 추천은 사용자들에게 맞춤형 경험을 제공하는 핵심 요소가 되었습니다. 온라인 쇼핑부터 영화 스트리밍 서비스까지, 추천 시스템은 사용자의 취향과 행동을 분석하여 관련성 높은 콘텐츠나 제품을 제안합니다. 이러한 시스템은 사용자 만족도를 높이고, 서비스 참여를 촉진하며, 매출 증대에 기여하는 중요한 역할을 합니다.
  • 아이템 기반 협업 필터링은 추천 시스템에서 널리 사용되는 방법 중 하나입니다. 이 기술은 사용자의 과거 상호작용을 기반으로 아이템 간의 유사성을 분석하여 추천을 생성합니다. 이는 사용자 기반 협업 필터링(User-based Collaborative Filtering)과 대비됩니다. 사용자 기반 접근 방식은 유사한 취향을 가진 다른 사용자들의 선호도를 바탕으로 추천을 생성하는 반면, 아이템 기반 접근은 아이템 간의 유사성에 중점을 둡니다.
  • 예를 들어, 영화 추천 시스템에서 사용자 기반 협업 필터링은 “A 영화를 좋아한 사용자들이 B 영화도 좋아했다”는 관점에서 추천을 제안합니다. 반면, 아이템 기반 협업 필터링은 “A 영화와 유사한 특성을 가진 B 영화”를 추천합니다. 이러한 차이는 특히 대규모 데이터를 처리할 때 아이템 기반 방식의 강점을 부각시키며, 사용자의 명시적 및 암시적 선호를 모두 고려하는 데 유리합니다.
  • 이 블로그 글에서는 아이템 기반 협업 필터링의 기본 원리와 Python을 사용한 구현 방법을 자세히 설명하고자 합니다. 이를 통해 독자 여러분은 아이템 기반 협업 필터링이 다양한 추천 시스템에서 어떻게 활용될 수 있는지, 그리고 이 기술이 사용자 경험을 어떻게 개선하는지에 대해 깊이 이해할 수 있을 것입니다.

2. 아이템 기반 협업 필터링의 원리

  • 아이템 기반 협업 필터링은 사용자의 과거 행동과 아이템 간의 관계를 분석하여 개인화된 추천을 제공하는 방식입니다. 이 접근법의 핵심은 사용자가 과거에 어떤 아이템을 선호했는지에 근거하여, 그와 유사한 다른 아이템을 찾아내는 것입니다.

1. 유사도 측정

  • 아이템 기반 협업 필터링의 첫 단계는 각 아이템 간의 유사도를 측정하는 것입니다. 이 유사도는 보통 코사인 유사도(Cosine Similarity), 피어슨 상관 계수(Pearson Correlation Coefficient), 자카드 유사도(Jaccard Similarity)와 같은 통계적 방법을 사용하여 계산됩니다. 예를 들어, 두 영화가 유사한 사용자 평점 패턴을 보인다면, 이 두 영화는 서로 유사하다고 간주됩니다.

2. 추천 생성

  • 유사도가 계산되면, 시스템은 사용자가 과거에 평가했던 아이템을 기반으로 유사한 아이템을 찾아 추천 목록을 생성합니다. 예를 들어, 사용자가 특정 액션 영화에 높은 평점을 부여했다면, 유사한 액션 영화가 추천 목록에 포함될 가능성이 높습니다.

3. 행동 데이터의 활용

  • 아이템 기반 협업 필터링은 사용자의 명시적인 평가(예: 별점)뿐만 아니라, 구매 기록, 시청 기록과 같은 암시적인 행동 데이터도 사용합니다. 이를 통해 시스템은 사용자의 선호도를 더욱 정확하게 파악할 수 있습니다.

4. 대규모 데이터 처리

  • 아이템 기반 협업 필터링은 사용자 기반 협업 필터링에 비해 대규모 데이터를 처리하는 데 더 효율적입니다. 아이템의 수는 일반적으로 사용자의 수보다 적고, 아이템 간의 관계는 시간이 지나도 상대적으로 안정적입니다. 이는 계산 복잡도를 줄이고, 추천 시스템의 성능을 향상시킵니다.

3. 파이썬을 사용한 아이템 기반 협업 필터링 구현

1. 데이터 로딩

  • 아이템 기반 협업 필터링을 구현하기 위해, 첫 번째 단계는 적절한 데이터셋을 선택하고 로드하는 것입니다. 이 예제에서는 영화 평점 데이터셋을 사용할 것입니다. 이 데이터셋은 일반적으로 사용자 ID, 영화 ID, 그리고 해당 영화에 대한 사용자의 평점을 포함합니다. 이러한 데이터를 활용하여 사용자의 영화에 대한 선호도를 분석할 수 있습니다.
import pandas as pd

# 데이터가 있다면 직접 csv 데이터 로드
ratings = pd.read_csv('ratings.csv')  # 사용자의 영화 평점 데이터가 포함된 CSV 파일

# 데이터가 없다면, 리스트 형태의 데이터 샘플 생성
sample_data_list = [
    {"user_id": 1, "movie_id": 101, "rating": 5.0},
    {"user_id": 1, "movie_id": 102, "rating": 3.5},
    {"user_id": 2, "movie_id": 101, "rating": 4.0},
    {"user_id": 2, "movie_id": 103, "rating": 2.5},
    {"user_id": 3, "movie_id": 102, "rating": 4.5},
    {"user_id": 3, "movie_id": 104, "rating": 5.0}
]

# 리스트를 사용하여 DataFrame 생성
ratings = pd.DataFrame(sample_data_list)
ratings.head()

2. 데이터 전처리 및 탐색

  • 데이터를 로드한 후에는 데이터 전처리 과정이 필요합니다. 이 과정에는 누락된 값 처리, 데이터 형식 변환, 필요한 데이터 추출 등이 포함될 수 있습니다. 또한, 데이터의 기본 통계를 탐색하여 데이터셋의 구조와 특성을 이해하는 것이 중요합니다.
# 데이터 기본 통계 확인
print(ratings.describe())

# 누락된 값 확인 및 처리
ratings.dropna(inplace=True)  # 누락된 값을 제거

# 데이터 형식 확인 및 변환
ratings['user_id'] = ratings['user_id'].astype(int)
ratings['movie_id'] = ratings['movie_id'].astype(int)
ratings['rating'] = ratings['rating'].astype(float)

3. 유사도 계산

  • 아이템 기반 협업 필터링에서 핵심적인 단계 중 하나는 아이템 간의 유사도를 계산하는 것입니다. 유사도 측정은 아이템들이 얼마나 비슷한지를 수치적으로 나타내며, 이를 통해 사용자에게 추천할 아이템을 결정합니다. 대표적인 유사도 측정 방법으로는 코사인 유사도(Cosine Similarity)와 피어슨 상관 계수(Pearson Correlation Coefficient)가 있습니다. 코사인 유사도는 두 아이템 간의 각도를 기반으로 유사도를 계산하며, 피어슨 상관 계수는 두 아이템 간의 선형 관계를 측정합니다.

3.1) 코사인 유사도 계산

  • 이 예제에서는 코사인 유사도를 사용하여 아이템 간의 유사도를 계산할 것입니다. 코사인 유사도는 두 벡터 간의 코사인 각도를 계산하여 유사성을 측정합니다. 이는 두 아이템이 공통적으로 가진 특성을 기반으로 얼마나 유사한지를 나타냅니다.
from sklearn.metrics.pairwise import cosine_similarity

# 아이템 기반 유사도 행렬 계산
# 먼저, 사용자-아이템 행렬을 생성합니다.
user_item_matrix = ratings_df.pivot(index='user_id', columns='movie_id', values='rating').fillna(0)

# 코사인 유사도를 사용하여 유사도 행렬 계산
item_similarity = cosine_similarity(user_item_matrix.T)  # .T는 행렬을 전치합니다.

3.2) 유사도 행렬 생성

  • 위의 단계에서 계산된 코사인 유사도는 아이템 간의 유사도 행렬로 표현됩니다. 이 행렬은 각 아이템이 다른 모든 아이템과 얼마나 유사한지를 나타내며, 추후 추천 시스템에서 이 정보를 사용하여 사용자에게 추천할 아이템을 결정합니다.
import numpy as np

# 유사도 행렬을 DataFrame으로 변환
item_similarity_df = pd.DataFrame(item_similarity, index=user_item_matrix.columns, columns=user_item_matrix.columns)

# 유사도 행렬 출력 예시
print(item_similarity_df)

4. 추천 생성

1. 추천 알고리즘 설명

  • 아이템 기반 협업 필터링에서 ‘추천 생성’ 단계는 계산된 아이템 간 유사도를 사용하여 사용자별 맞춤형 추천을 제공합니다. 이 과정에서는 사용자가 과거에 평가한 아이템들과 유사한 아이템들을 찾아 추천 목록을 생성합니다. 이러한 방식은 사용자의 기존 선호도를 반영하여 새로운, 그러나 관련성 높은 아이템을 제안합니다.

2. 사용자별 추천 생성

  • 추천을 생성하기 위해 각 사용자가 평가하지 않은 아이템들에 대한 예상 평점을 계산합니다. 이 예상 평점은 사용자가 이미 평가한 아이템들의 평점과 해당 아이템들과의 유사도를 기반으로 계산됩니다.
def generate_recommendations(user_id, user_item_matrix, similarity_matrix, n_recommendations=5):
    # 사용자가 평가한 아이템 가져오기
    user_ratings = user_item_matrix.loc[user_id]
    user_unrated_items = user_ratings[user_ratings.isna()]

    # 예상 평점 계산
    predictions = {}
    for item in user_unrated_items.index:
        item_similarity = similarity_matrix[item]
        user_ratings_weighted = user_ratings.multiply(item_similarity, axis=0)
        prediction = user_ratings_weighted.sum() / item_similarity.sum()
        predictions[item] = prediction

    # 최고의 예상 평점을 가진 아이템 추천
    recommended_items = sorted(predictions.items(), key=lambda x: x[1], reverse=True)[:n_recommendations]
    return [item for item, _ in recommended_items]

# 예시 사용자에 대한 추천 생성
recommended_movies = generate_recommendations('user123', user_item_matrix, item_similarity_df)
  • 위의 코드는 주어진 사용자 ID에 대해 가장 높은 예상 평점을 가진 아이템들을 추천합니다. 이는 사용자의 기존 평점 데이터와 아이템 간의 유사도를 기반으로 한다는 점에서 매우 효과적입니다. 추천 시스템의 성능을 높이기 위해, 이 방법은 다양한 유사도 측정 방법(예: 코사인 유사도, 피어슨 상관 계수, 자카드 유사도 등)과 결합될 수 있습니다.

5. 성능 평가 및 최적화

1. 추천 시스템 평가 지표 소개

  • 추천 시스템의 성능을 평가하는 것은 매우 중요합니다. 이를 위해 다양한 평가 지표들이 사용됩니다. 주요 지표로는 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 점수(F1 Score) 등이 있습니다.
  • 정확도: 추천 시스템이 얼마나 정확한 추천을 제공하는지 측정합니다.
  • 정밀도: 추천된 아이템 중 실제로 사용자가 선호하는 아이템의 비율입니다.
  • 재현율: 사용자가 선호하는 모든 아이템 중 추천 시스템이 식별한 비율입니다.
  • F1 점수: 정밀도와 재현율의 조화 평균으로, 두 지표의 균형을 나타냅니다.

2. 모델 성능 평가

  • 성능 평가는 추천 시스템이 사용자의 선호도를 얼마나 잘 예측하고 충족시키는지를 검증합니다. 일반적으로, 테스트 데이터셋을 사용하여 평가를 진행합니다.
from sklearn.metrics import precision_score, recall_score, f1_score

# 테스트 데이터셋에서 실제 선호도와 예측된 선호도 비교
true_preferences = [...]  # 실제 사용자 선호도
predicted_preferences = [...]  # 시스템에 의해 예측된 선호도

precision = precision_score(true_preferences, predicted_preferences)
recall = recall_score(true_preferences, predicted_preferences)
f1 = f1_score(true_preferences, predicted_preferences)

print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")

3. 튜닝 및 최적화 방법

  • 성능 평가 후에는 추천 시스템을 최적화하는 과정이 필요합니다. 이를 위해 유사도 측정 방법을 변경하거나, 알고리즘의 하이퍼파라미터를 조정할 수 있습니다. 또한, 다양한 사용자 그룹과 아이템 유형에 대한 추천의 효과를 분석하여 개선점을 찾는 것도 중요합니다.

1 thought on “파이썬(Python)으로 추천 시스템 구현하기 : 아이템 기반 협업 필터링”

답글 남기기