주말 프로젝트로 만든 추천 시스템의 성공과 실패 경험기

데이터 과학과 머신러닝 분야에서는 추천 시스템이 매우 중요한 역할을 하고 있습니다. 여러 서비스에서 개인의 취향에 맞춘 콘텐츠를 제공하기 위해 추천 시스템을 활용하고 있기 때문에, 이를 직접 만들어보는 경험은 매우 유익합니다. 이번 포스트에서는 제가 주말 프로젝트로 만든 간단한 추천 시스템의 경험을 공유하고자 합니다.

프로젝트 개요

이 프로젝트는 영화 추천 시스템을 만드는 것이었습니다. 사용자가 선호할 만한 영화를 추천하기 위해 영화 데이터셋을 활용했습니다. 데이터셋에는 영화 제목, 장르, 평점 등의 정보가 포함되어 있었습니다. 저는 Python을 사용하여 추천 시스템을 구현하였으며, 간단한 협업 필터링 방식을 적용했습니다.

데이터 준비

먼저, 필요한 데이터셋을 준비했습니다. Kaggle에서 제공하는 'MovieLens' 데이터셋을 다운로드하여 사용했습니다. 이 데이터셋은 사용자, 영화 및 평점 정보를 포함하고 있어 추천 시스템을 만들기에 적합합니다.

import pandas as pd

movies = pd.read_csv('movies.csv')  # 영화 정보
ratings = pd.read_csv('ratings.csv')  # 사용자 평점 정보

# 데이터 확인
print(movies.head())
print(ratings.head())

추천 시스템 구현

추천 시스템의 핵심은 사용자와 영화 간의 유사성을 측정하는 것입니다. 저는 사용자 기반 협업 필터링(User-based Collaborative Filtering) 방법을 사용하여 추천을 구현했습니다. 사용자가 영화에 대한 평점을 매긴 데이터를 활용하여 비슷한 취향을 가진 사용자들을 찾아내는 방식입니다.

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split

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

# 사용자 간 유사도 계산
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_movie_recommendations(user_id, num_recommendations=5):
    similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:]  # 자신 제외
    similar_users_index = similar_users.index.tolist()

    top_movies = []
    for similar_user in similar_users_index:
        movies_watched = user_movie_matrix.loc[similar_user][user_movie_matrix.loc[similar_user] > 0].index.tolist()
        top_movies.extend(movies_watched)
        
    top_movies = pd.Series(top_movies).value_counts().head(num_recommendations)
    recommended_movies = movies[movies['movieId'].isin(top_movies.index)]
    
    return recommended_movies[['title', 'genres']]

# 추천 결과 출력
recommendations = get_movie_recommendations(user_id=1)
print(recommendations)

위 코드는 특정 사용자의 영화 추천을 위한 간단한 함수입니다. 사용자와 유사한 다른 사용자가 좋아하는 영화를 기반으로 추천해 줍니다.

성공과 실패 경험

이 프로젝트에서 느낀 가장 큰 성공은 데이터 전처리와 추천 알고리즘의 이해입니다. 처음에는 데이터를 어떻게 처리해야 할지 막막했지만, Pandas와 Numpy를 활용하여 데이터를 정리하고 분석하는 과정에서 많은 것을 배울 수 있었습니다.

하지만 기대와는 달리 추천의 정확도가 낮은 문제가 발생했습니다. 초기 설정한 유사도 측정 방식이 사용자 간의 관계를 충분히 반영하지 못했고, 사용자들이 평점을 매기지 않은 아이템이 많아 추천의 다양성이 떨어지는 문제도 있었습니다. 이를 개선하기 위해서는 더 정교한 모델(예: 행렬 분해 기법이나 딥러닝 기반의 추천 시스템)을 도입해야 했습니다.

마무리

이번 주말 프로젝트를 통해 추천 시스템의 기초적인 동작 원리를 이해하고 간단한 구현을 해볼 수 있었습니다. 성공적인 부분도 있었지만, 알고리즘의 한계와 데이터를 다루는 데 있어 새로운 도전과제를 발견하는 기회가 되었습니다. 앞으로 더 나은 추천 시스템을 만들기 위해 다양한 기법을 학습하고 적용해보는 것이 목표입니다. 여러분도 작은 프로젝트에서부터 시작하여 데이터와 머신러닝의 세계에 발을 들여보시길 추천드립니다.