(13주차) 12월2일
추천시스템 (IMDB)
-
(1/4) 추천시스템 데이터소개
-
(2/4) dls 만들기, 학습
-
(3/4) bias
-
(4/4) 해석
import torch
from fastai.collab import *
from fastai.tabular.all import *
path = untar_data(URLs.ML_100k)
-
첫번째 데이터프레임
ratings=pd.read_csv(path/'u.data', delimiter='\t', header=None, names=['user','movie','rating','timestamp'])
ratings
- 마지막열은 무의믜
-
두번째 데이터프레임
movies = pd.read_csv(path/'u.item', delimiter='|', encoding='latin-1', usecols=(0,1), names=('movie','title'), header=None)
movies
-
두 데이터프레임을 합친다.
df = ratings.merge(movies)
df
dls = CollabDataLoaders.from_df(df,bs=64,item_name='title')
dls.show_batch()
lrnr = collab_learner(dls, n_factors=10, y_range=(0,5))
lrnr.fit(13)
- 교재의 loss도 0.82 근처
-
결과를 살펴보자.
lrnr.show_results()
- 솔직히 다 맞추는 느낌이 있진 않음
lrnr2 = collab_learner(dls, use_nn=True, y_range=(0,5), layers=[20,10])
lrnr2.fit(8)
lrnr2.show_results()
- 적당한 수준에서 합리적임
lrnr.model
lrnr.model.i_bias.weight.detach().to('cpu').squeeze()
- 의미? 아이테의 바이어스: 평균적으로 높은 평점을 받거나 낮은 평점을 받는 영화들이있는데, 그 정도를 숫자로 표현`
lst1=lrnr.model.i_bias.weight.detach().to('cpu').squeeze().argsort()[:20].tolist()
lst2=lrnr.model.i_bias.weight.detach().to('cpu').squeeze().argsort(descending=True)[:20].tolist()
list(dls.classes['title'][lst1])
- 비인기
list(dls.classes['title'][lst2])
- 인기
-
모형이 잘 학습된것 같다.
-
타이타닉(1501)과 로보캅3(1251)에 관심을 가지자.
x,y = dls.one_batch()
x[:5]
-
1~30번까지의 유저가 타이타닉(1501)을 어떻게 생각할지? 재미있게 생각한다.
xx = torch.tensor([[i,1501] for i in range(1,31)])
lrnr.model(xx.to("cuda:0"))
lrnr2.model(xx.to("cuda:0")).reshape(-1)
-
1~30번까지의 유저가 로보캅3(1251)을 어떻게 생각할지? 재미없게 생각한다.
xx = torch.tensor([[i,1251] for i in range(1,31)])
lrnr.model(xx.to("cuda:0"))
lrnr2.model(xx.to("cuda:0")).reshape(-1)