앎을 경계하기

추천시스템

사용자 정보가 없을때는? Best-Seller 방식!

양갱맨 2022. 12. 18. 18:14

참고도서 : python을 이용한 개인화 추천 시스템 - 임일

 

데이터 로드하기

사용하는 데이터셋은 영화 리뷰 데이터이다.

각 데이터를 읽어보자.

참고로 데이터는 "python을 이용한 개인화 추천 시스템" 도서에서 제공하고있는 데이터를 사용했다.

import pandas as pd
import numpy as np

# Load Users

u_cols = ['user_id','age','sex','occupation','zip_code']
users = pd.read_csv('./u.user',sep='|',encoding='latin-1',names=u_cols)
users.set_index('user_id',inplace=True)
users.head()

# Load Movies

i_cols = ['movie_id','title','release_date','video_release_date,','IMDB_URL','unknown','action','adventure','animation','children','comedy','crime','documentary','drama','fantasy','film-noir','horror','musical','mystery','romance','sci-fi','thriller','war','western']
movies = pd.read_csv('./u.item', sep='|', names=i_cols,encoding='latin-1')
movies.set_index('movie_id',inplace=True)
movies.head()

# Load Ratings
r_cols = ['user_id','movie_id','rating','timestamp']
ratings = pd.read_csv('./u.data', sep='\t', names=r_cols, encoding='latin-1')
ratings.set_index('user_id',inplace=True)
ratings.head()

유저 테이블에는 유저아이디, 나이, 성별, 직업, 우편번호

영화 테이블에는 영화아이디, 제목, 개봉일자 등 정보와 각 장르컬럼

평점 테이블에는 유저아이디, 영화아이디, 평점, 평가일시


사용자에 대한 정보가 없는 경우?

가장 인기 있는 제품을 추천하면 된다.

< best-seller 방식 >

리뷰가 있다면, 평균평점이 가장 높은 순으로 추천하면된다.

그렇다면 이 추천시스템이 성능이 좋은지는 어떻게 알까?

추천시스템의 정확도를 평가하는 방법

test set에 대한 예측값과 실제 정답의 차이를 정확도로 판단한다.

딥러닝에서도 같은 정확도를 사용함 (GT와 prediction의 차이)

가장 많이 사용하는 지표 RMSE(Root Mean Squared Error.

말 그대로 루트, 평균, 제곱, 차이를 사용한다.

정답과 예측값의 차이를 제곱하여 합한 뒤, 데이터의 개수로 나눠 평균을 구한다.

def best_seller(n_items):
    # 내림차순 정렬하여 n_items개 영화의 제목 반환
    movie_sort = movie_mean.sort_values(ascending=False)[:n_items]
    best_movies = movies.loc[movie_sort.index]
    return best_movies['title']

# 영화아이디 별 평균평점 계산
movie_mean = ratings.groupby(['movie_id'])['rating'].mean()
best_seller(10)

def RMSE(y_true, y_pred):
    return np.sqrt(np.mean((np.array(y_true)-np.array(y_pred))**2))

    rmse = []

# ratings index : user_id
for user in set(ratings.index):
    y_true = ratings.loc[user]['rating'] # 각 유저의 평점
    y_pred = movie_mean[ratings.loc[user]['movie_id']] # 유저가 평가한 영화의 평균평점
    acc = RMSE(y_true,y_pred) # 정확도 계산
    rmse.append(acc)
np.mean(rmse)

해당 10개 영화들의 평균평점을 확인해보면 5.0으로 가장 높은 평균평점을 갖는다.

RMSE 값을 구해보니 0.9960 정도가 나왔다.