빅데이터 분석 기말고사
- #1. 체인룰과 역전파기법
- #2. 음료추천
- (1) user-item matrix 생성하라.
- (2) 첫번째 유저를 평점을 조회하고 이 유저의 취향을 서술하라. 커피와 홍차중 어떤음료를 선호하는가? 따듯한 음료와 차가운 음료중 어떤 음료를 선호하는가?
- (3) fastai를 이용하여 추천모형을 학습하라. (nn을 사용하지 않아도 무방하다.)
- (4) (3)의 추천시스템을 이용하여 모든 음료(총40개)에 대하여 144번 유저의 fitted rating 을 구하라. 144번 유저는 어떤 취향인가?
- (5) 차가운커피1에 대한 모든유저(총200명)의 fitted rating을 구하라. 몇번부터 몇번까지의 유저가 차가운 커피를 선호하는가?
- #3. 영화추천
- #4. 다음을 읽고 물음에 답하라. (O/X로 답할것)
주어진 자료가 아래와 같다고 하자.
손실함수의 정의가 아래와 같다고 하자.
이때 이고 이다. 지점에서의 를 역전파 기법을 이용하여 구하고 파이토치의 backward()를 이용하여 검증하라. 즉 (1)-(6)을 계산하라.
ones= torch.ones(2)
x = torch.tensor([2.1,3.0])
X = torch.vstack([ones,x]).T
y = torch.tensor([3.0,5.0])
W = torch.tensor([0.5,0.6])
u = X@W
u
v= y-u
v
loss=v.T@v
loss
v
_v= torch.tensor([1.2400, 2.7000],requires_grad=True)
_loss = _v.T @ _v
_loss.backward()
_v.grad.data, 2*v
A = torch.zeros((2,2))
for i in range(2):
_u = torch.tensor([2.1,3.0],requires_grad=True)
_v = (y-_u)[i]
_v.backward()
A[:,i]= _u.grad.data
A
B = torch.zeros((2,2))
for i in range(2):
_W = torch.tensor([0.5,0.6],requires_grad=True)
_u = (X@_W)[i]
_u.backward()
B[:,i]= _W.grad.data
B
import torch
ones= torch.ones(2)
x = torch.tensor([2.1,3.0])
X = torch.vstack([ones,x]).T
y = torch.tensor([3.0,5.0])
W = torch.tensor([0.5,0.6],requires_grad=True)
loss = (y-X@W).T @ (y-X@W)
loss.backward()
W.grad.data
A @ B @ _v.grad.data
X.T@-torch.eye(2)@(2*v)
import torch
ones= torch.ones(2)
x = torch.tensor([2.1,3.0])
X = torch.vstack([ones,x]).T
y = torch.tensor([3.0,5.0])
W = torch.tensor([0.5,0.6],requires_grad=True)
loss = (y-X@W).T @ (y-X@W)
loss.backward()
W.grad.data
아래는 200명의 사용자가 차가운커피, 따뜻한커피, 차가운홍차, 따듯한홍차 각 10종씩을 먹고 평점을 넣은 자료이다.
import pandas as pd
import torch
from fastai.collab import *
from fastai.tabular.all import *
df = pd.read_csv("https://raw.githubusercontent.com/guebin/2021BDA/master/_notebooks/2021-12-04-recommend.csv")
df
생성예시는 아래와 같다.
df2 = pd.DataFrame([[None]*40]*200,columns=['차가운커피'+str(i) for i in range(1,11)]+['따뜻한커피'+str(i) for i in range(1,11)]+['차가운홍차'+str(i) for i in range(1,11)]+['따뜻한홍차'+str(i) for i in range(1,11)])
df2.index = pd.Index(['user'+str(i) for i in range(1,201)])
df2
for (i,j) in zip(df.user.to_list(), df.item.to_list()):
df2.iloc[i-1,j-1]=df.query('user == @i and item == @j')['rating'].to_list()[0]
df2
df2.iloc[0,:]
따뜻한 커피보다는 차가운 커피를 더 선호하는 것 같고, 따뜻한 음료보다는 차가운 음료를 선호하는 것 같다.
dls = CollabDataLoaders.from_df(df,bs=200)
dls.items
lrnr = collab_learner(dls,n_factors=4,y_range=(0,5))
lrnr.fit(30,0.01)
X,y = dls.one_batch()
x144 = torch.tensor([[144,j] for j in range(1,41) ])
lrnr.model(x144.to("cuda:0"))
따뜻한 것보다는 차가운 것을 선호하고, 커피보다는 홍차를 선호한다.
y200 = torch.tensor([[i,1] for i in range(1,201) ])
lrnr.model(y200.to("cuda:0"))
55번째 user까지 차가운 커피를 선호한다.
아래의 코드를 이용하여 자료를 받고 df
를 만든뒤 물음에 답하라.
path = untar_data(URLs.ML_100k)
ratings=pd.read_csv(path/'u.data', delimiter='\t', header=None, names=['user','movie','rating','timestamp'])
movies = pd.read_csv(path/'u.item', delimiter='|', encoding='latin-1', usecols=(0,1), names=('movie','title'), header=None)
df = ratings.merge(movies)
path = untar_data(URLs.ML_100k)
ratings=pd.read_csv(path/'u.data', delimiter='\t', header=None, names=['user','movie','rating','timestamp'])
movies = pd.read_csv(path/'u.item', delimiter='|', encoding='latin-1', usecols=(0,1), names=('movie','title'), header=None)
df = ratings.merge(movies)
df
dls = CollabDataLoaders.from_df(df,bs=64,item_name='title')
dls.show_batch()
lrnr = collab_learner(dls, use_nn=True, y_range=(0,5), layers=[20,10])
lrnr.fit(8)
lrnr.show_results()
1461 Terminator 2: Judgment Day (1991)
1462 Terminator, The (1984)
x,y = dls.one_batch()
lrnr.model(torch.tensor([[30,1461]]).to("cuda:0"))
lrnr.model(torch.tensor([[30,1462]]).to("cuda:0"))
X
O
O
O
X