데이터 준비
● ml-latest-small: 소규모 데이터셋
○ 100,000 ratings, 9000 movies, 600 users
● wget: url로부터 파일을 다운로드 받는 쉘 명령어
● unzip: zip 압축 파일을 해제하는 쉘 명령어
!wget https://files.grouplens.org/datasets/movielens/ml-latest-small.zip
!unzip ml-latest-small.zip
● ratings.csv 에서 각 열을 각각 users, items, ratings에 numpy array 형태로 저장
import numpy as np
users = []
items = []
ratings = []
with open("ml-latest-small/ratings.csv", "r") as f:
print(f.readline()) # skip column names
for line in f:
uid, iid, rating, timestamp = line.split(",")
users.append(int(uid))
items.append(int(iid))
ratings.append(float(rating))
users = np.array(users)
items = np.array(items)
ratings = np.array(ratings)
Latent Factor Model
global baseline(alpha) + user bias + item bias + user와 item의 케미 를 보여주는 함수.
alpha = ratings.mean()
user_bias = np.zeros(users.max() + 1)
item_bias = np.zeros(items.max() + 1)
user_reps = np.random.randn(users.max() + 1, rank)
item_reps = np.random.randn(items.max() + 1, rank)
user_bias 와 item_bias는 벡터 형태, user_reps와 item_reps는 매트릭스 형태를 띠고 있다.
Stochastic Gradient Descent
● 각 rating 기록마다 따로따로 기울기 계산 & 값 갱신
stochastic : 확률적인 이라는 뜻
Gradient Descent : 전체 데이터를 다 보고 기울기 업데이트하는 방식.
Stochastic Gradient Descent : 전체 데이터 중 일부의 데이터를 발췌하여 기울기 업데이트하는 방식.
이번에는 극단적으로 기울기를 업데이트해보려 한다. 하나의 rating마다 실제 rating과 기존에 가지고 있던 정보로 예측 rating 차이를 계산해서 업데이트 할 것 이다.
lmd = 0.01
lr = 0.1
for epoch in range(10):
h = alpha + user_bias[users] + item_bias[items] + (user_reps[users] * item_reps[items]).sum(axis=1)
rmse = ((h - ratings) ** 2).mean() ** 0.5
print(rmse)
for user, item, rating in zip(users, items, ratings):
bu = user_bias[user]
bi = item_bias[item]
pu = user_reps[user]
qi = item_reps[item]
est = alpha + bu + bi + np.dot(pu, qi)
diff = est - rating
user_bias[user] -= lr * (diff + lmd * bu)
item_bias[item] -= lr * (diff + lmd * bi)
user_reps[user] -= lr * (diff * qi + lmd * pu)
item_reps[item] -= lr * (diff * pu + lmd * qi)
Surprise
● 파이썬 추천시스템 라이브러리
● 공식홈페이지: https://surpriselib.com/
● 다양한 추천 알고리즘 포함
○ SVD, SVD++, NMF, Slope One, k-NN, Co-clustering, Baseline, Random
!pip install surprise
SVD in Surprise
● bias를 고려한 Matrix Factorization 알고리즘
○ 강의에서 다룬 바로 그 알고리즘
● 데이터 불러오기
● train/test 데이터 분리
from surprise import SVD, Reader, Dataset
from surprise.model_selection import train_test_split
reader = Reader(line_format="user item rating timestamp", sep=",", skip_lines=1)
data = Dataset.load_from_file("ml-latest-small/ratings.csv", reader=reader)
trainset, testset = train_test_split(data, test_size=0.1)
test_size를 비율로 지정해줄 수도 있음.
● SVD 모델 생성, 학습, 예측
model = SVD(n_factors=10)
model.fit(trainset)
# user '18'이 item '673'에 줄 별점 예측
model.predict('18','673')
n_factors는 rank와 같은 개념이다.
fit()는 학습시키는 함수이다.
predict()로 예상 별점을 출력할 수 있다. ex) '18'유저가 '673'영화에 몇 점을 줄 것인가?
● Train RMSE, Test RMSE 계산
from surprise import accuracy
train_to_test = trainset.build_testset()
pred_train = model.test(train_to_test)
train_rmse = accuracy.rmse(pred_train, verbose=False)
pred_test = model.test(testset)
test_rmse = accuracy.rmse(pred_test, verbose=False)
print(f"train_rmse: {train_rmse}, test_rmse: {test_rmse}")
test()사용하면 rmse계산하기 좀 더 쉬운 형태로 반환해준다.
'AI > 추천 시스템 설계' 카테고리의 다른 글
L05.1 User-free Models Practice (0) | 2024.04.30 |
---|---|
L04.1 Implicit Feedback Practice (0) | 2024.04.12 |
L03.1 Rating Prediction Practice (1) | 2024.04.10 |
L02.1 Finding Similar Items Practice (0) | 2024.04.10 |