빅데이터 분석 (13주차) 12월2일
추천시스템 (IMDB)
import torch
from fastai.collab import *
from fastai.tabular.all import *
path = untar_data(URLs.ML_100k)
-
첫번째 데이터프레임
path.ls()
ratings=pd.read_csv(path/'u.data', delimiter='\t', header=None, names=['user','movie','rating','timestamp'])
ratings
- 마지막열은 무의믜
최소한 movie 번호가 어떤 것을 의미하는지 알아야 모형을 세우지 않을까?
-
두번째 데이터프레임
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
bs = batch size
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)
책에서는 5를 포함하지 않는다~해서 5.5하긴했음.
- 교재의 loss도 0.82 근처
-
결과를 살펴보자.
lrnr.show_results()
- 솔직히 다 맞추는 느낌이 있진 않음
리얼데이터이다보니 더 복잡한 취향이 있다는 것이 느껴짐
비선형 mapping을 추가하면 모형이 더 좋아지지 않을까?
lrnr2 = collab_learner(dls, use_nn=True, y_range=(0,5), layers=[20,10])
lrnr2.fit(8)
떨어자다가 올라가는 확률, overfitting의 의심
lrnr2.show_results()
- 적당한 수준에서 합리적임
lrnr.model
user / item / 각각의 bias
미분 제거 위해 detach
lrnr.model.i_bias.weight.detach().to('cpu').squeeze()
- 의미? item의 bias: 평균적으로 높은 평점을 받거나 낮은 평점을 받는 영화들이있는데, 그 정도를 숫자로 표현
인덱스가 나오게 됨
lrnr.model.i_bias.weight.detach().to('cpu').squeeze().argsort()
lrnr.model.i_bias.weight.detach().to('cpu').squeeze().argsort(descending=True)
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])
- 인기
-
모형이 잘 학습된것 같다.
lst2[12]
lst1[10]
내 모형에는 로보캅이 없으,ㅁ..
-
타이타닉(1501)과 로보캅3(1251)에 관심을 가지자.
x,y = dls.one_batch()
user, item
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)