추천 시스템은 사용자에게 맞춤형 아이템을 추천하기 위한 중요한 도구입니다. 오늘은 파이썬을 사용하여 간단한 추천 시스템을 만드는 미니 프로젝트를 진행해보겠습니다. 이 프로젝트를 통해 추천 시스템의 기본 원리와 이를 구현하는 데 필요한 기본적인 코드 구조를 살펴보겠습니다.
프로젝트 개요
우리는 영화 추천 시스템을 만들어볼 것입니다. 이 시스템은 사용자가 선호하는 영화를 바탕으로 비슷한 영화를 추천합니다. 추천 시스템은 주로 두 가지 방식으로 나눌 수 있습니다: 콘텐츠 기반 필터링과 협업 필터링. 이번 프로젝트에서는 협업 필터링 방식을 사용하여 추천 시스템을 구현할 것입니다.
데이터 준비
영화 추천 시스템을 위해 사용될 데이터셋으로는 MovieLens 데이터셋을 활용합니다. 이 데이터셋은 영화에 대한 평점과 태그 등의 정보를 포함하고 있습니다. 먼저, 필요한 라이브러리를 설치하고 데이터를 불러오는 코드를 작성해보겠습니다.
import pandas as pd
ratings = pd.read_csv('https://files.grouplens.org/datasets/movielens/ml-latest-small/ratings.csv')
movies = pd.read_csv('https://files.grouplens.org/datasets/movielens/ml-latest-small/movies.csv')
# 데이터셋 정보 확인
print(ratings.head())
print(movies.head())
데이터셋을 불러온 후, ratings 데이터셋은 사용자 ID, 영화 ID, 평점, 타임스탬프를 포함하며, movies 데이터셋은 영화 ID, 제목, 장르를 포함합니다.
데이터 전처리
추천 시스템을 구축하기 전에, 데이터를 전처리하여 사용할 수 있는 형태로 변환해야 합니다. 사용자와 영화 간의 상호작용을 기반으로 행렬을 생성하는 것이 필요합니다.
# 사용자-영화 피벗 테이블 생성
user_movie_matrix = ratings.pivot(index='userId', columns='movieId', values='rating').fillna(0)
print(user_movie_matrix.head())
여기서 fillna(0)을 사용하여 평점이 없는 경우 0으로 채워줍니다. 이렇게 생성된 피벗 테이블은 각 사용자가 어떤 영화를 몇 점으로 평가했는지를 나타냅니다.
추천 시스템 구현
이제 협업 필터링을 통해 추천 시스템을 구현해보겠습니다. 유사성을 계산하기 위해 코사인 유사도를 사용할 것입니다.
from sklearn.metrics.pairwise import cosine_similarity
# 코사인 유사도 계산
user_similarity = cosine_similarity(user_movie_matrix)
user_similarity_df = pd.DataFrame(user_similarity, index=user_movie_matrix.index, columns=user_movie_matrix.index)
# 특정 사용자와 유사한 사용자 찾기
def get_similar_users(user_id, n=5):
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:n+1]
return similar_users.index.tolist()
# 예시: 사용자 ID 1과 유사한 사용자 찾기
similar_users = get_similar_users(1)
print(similar_users)
위의 코드에서 get_similar_users 함수를 통해 특정 사용자와 유사한 사용자 목록을 반환합니다. 여기서 n은 반환할 유사한 사용자 수입니다.
추천 영화 제공
유사한 사용자를 기반으로 추천 영화를 제공하는 함수를 구현합니다. 이 함수는 유사한 사용자가 높게 평가한 영화를 추천합니다.
def recommend_movies(user_id, n=5):
similar_users = get_similar_users(user_id)
similar_users_ratings = user_movie_matrix.loc[similar_users]
# 유사한 사용자들이 관람한 영화의 평균 평점 계산
recommended_movies = similar_users_ratings.mean(axis=0)
# 사용자가 본 영화 제외
watched_movies = user_movie_matrix.loc[user_id]
recommended_movies = recommended_movies[watched_movies == 0]
# 추천 영화 정렬
recommended_movies = recommended_movies.sort_values(ascending=False).head(n)
return recommended_movies.index.tolist()
# 예시: 사용자 ID 1에게 추천할 영화
recommended_movies = recommend_movies(1)
print(recommended_movies)
위 코드에서는 사용자가 관람하지 않은 영화 중에서 유사한 사용자들이 높은 평점을 준 영화를 추천합니다.
마무리
이제 간단한 협업 필터링 기반의 추천 시스템을 구축해보았습니다. 이 프로젝트를 통해 추천 시스템이 어떻게 작동하는지 기본 원리를 이해하고, 파이썬을 통해 이를 구현하는 방법을 배울 수 있었습니다. 물론, 현실의 추천 시스템은 훨씬 더 복잡하고 다양한 요소를 고려하지만, 이 미니 프로젝트는 좋은 출발점이 될 것입니다. 앞으로 더 발전시키기 위해 다양한 데이터 처리 기법과 고급 알고리즘을 적용해 볼 수 있습니다.