본문 바로가기
Recommendation system

협업 필터링

by Nowkeeh Ahc

협업 필터링은 사용자들의 아이템에 대한 평가 정보를 바탕으로 사용자-아이템 행렬을 생성하고, 이를 기반으로 유사도를 측정하여 유저들에게 아이템을 추천하는 알고리즘이다.

  • 사용자 기반(User-Based) 협업 필터링: 유저간의 유사도를 계산하여, 비슷한 취향을 가진 유저들이 선호하는 아이템을 추천하는 방식
  • 아이템 기반(Item-Based) 협업 필터링: 아이템간의 유사도를 계산하여, 유저가 선호하는 아이템과 비슷한 아이템을 추천하는 방식

 

이번에는 협업 필터링 알고리즘 중 사용자 기반(User-Based) 협업 필터링의 예시 코드를 작성해보겠다.

import pandas as pd
from sklearn.metrics.pairwise import pairwise_distances

# ratings.csv 파일 불러오기
ratings = pd.read_csv('ratings.csv')

# 사용자-아이템 행렬 생성
user_item_matrix = ratings.pivot_table(index='userId', columns='movieId', values='rating')

우선, ml-latest-small 데이터셋을 불러와 사용자-아이템 행렬을 생성한다.

# 사용자간 코사인 유사도 계산
user_similarity = 1 - pairwise_distances(user_item_matrix.fillna(0), metric='cosine')

그리고 sklearn.metrics.pairwise_distances 함수를 이용하여 사용자간 코사인 유사도를 계산한다. 여기서는 결측치를 0으로 채운 행렬을 사용한다.

# 사용자 A와 유사도가 높은 K명의 유저 선택
k = 10
similar_users = user_similarity.argsort()[:,::-1][:,:k+1][:,1:]
valid_users = user_item_matrix.columns.isin(user_item_matrix.columns[similar_users.flatten()])
movies_not_seen_by_a = user_item_matrix.loc[1, valid_users].isnull()

사용자 A와 유사도가 높은 K명의 유저를 선택한다. 이를 위해 argsort 함수를 이용하여 유저간 유사도를 내림차순으로 정렬하고, 유사도가 높은 상위 K명의 유저를 선택한다. 그리고 valid_users 변수에 해당 유저들이 평가한 영화 목록을 저장한다. 마지막으로 movies_not_seen_by_a 변수에는 사용자 A가 아직 보지 않은 영화 목록을 저장한다.

# 추천 점수 계산
movie_scores = user_item_matrix.mean().where(movies_not_seen_by_a, other=0)

# movies.csv 파일과 조인하여 영화 제목 출력
movies = pd.read_csv('movies.csv')
recommended_movies = pd.merge(movies, pd.DataFrame(movie_scores), left_on='movieId', right_index=True)
recommended_movies = recommended_movies.sort_values(by=0, ascending=False).head(10)
recommended_movies = recommended_movies[['title', 0]].rename(columns={0: 'score'})

print("추천 영화 목록:")
print(recommended_movies)

추천 점수를 계산하고, 이를 기반으로 추천할 아이템을 선택한다. movie_scores 변수에는 유저들이 평가한 모든 영화의 평균 평점을 저장한다. 그리고 where 함수를 이용하여 movies_not_seen_by_a 변수에 저장된 영화 목록이 True인 경우에는 해당 영화의 평균 평점을 사용하고, False인 경우에는 0을 사용한다. 마지막으로 영화 제목도 같이 출력되게하기 위해 movies.csv와 조인을한 후 sort_values 함수를 이용하여 추천 점수가 높은 순으로 정렬하고, 상위 10개 아이템을 선택한다.

댓글