-
잠재요인 협업필터링 추천시스템 구축Archive/통계&코딩이것저것 2021. 8. 23. 15:22
목적: 사용자가 등록한 채널에 따른 맞춤 SNS 추천
Input:
data = pd.read_sql_query(query, con=conn) data['gudok']=1#등록 여부 df_user_channel=data.pivot_table('gudok',index='user_id',columns='channel_name').fillna(0) #pivot table을 만든다(중요)
잠재 요인 협업 필터링
사용자 - 아이템 평점 행렬 데이터만을 이용해 말 그대로 '잠재요인'을 끄집어 내는 것.
'잠재요인'을 기반으로 사용자-아이템 행렬 데이터를 사용자 - 잠재요인 행렬과 아이템-잠재요인 행렬의 전치로 분해할 수 있으며, 이렇게 분해된 두 행렬의 내적을 통해 새로운 예측 사용자-아이템 평점 행렬 을 만들어서, 사용자가 아직 평점을 부여하지 않는 아이템에 대한 예측 평점을 생성하는 것
1. 잠재요인의 개수인 K를 정하자. 2. 주어진 K에 따라 임의의 수로 채워진 P,Q 행렬을 만들자 3. P,Q 행렬을 사용해서 Rhat(=P X Q.T)를 구한다 4. R에 있는 실제 평점에 대해서 예측 평점 Rhat의 예측과 비교해서 오차를 구하고, 이 오차를 줄이기 위해 P,Q 값을 수정한다. 5. 전체오차가 기준값이하가 되거나, 미리 정해진 반복 횟수에 도달할 때까지 3~5를 반복하자.
ex. 잠재요인이 하나라고 가정해보자.(무엇인진 알 수 없다. 채널을 나누는 속성을 잠재요인이라고 하는데, 예를 들어 기업/비기업, 혹은 요리채널/비요리채널 등등...우리가 할 수 있는건 잠재요인을 얼마나 세분화 할지 정해줄 수 있음)
- R (원래의 행렬을 축약) 사용자 1,6 이 등록한 채널 이라고 가정(2사용자, 23채널)
- R을 SGD( 예측행렬과 실제행렬을 최소화하는 방향으로 움직이는 알고리즘) 을 이용해 P와 Q로 분해
(과정: 임의의 P,Q를 아무렇게나 정한 후에, R(nonzero)-PQ.T(nonzero)를 최소화하는 방향으로 P,Q를 업데이트)
- 그렇게 해서 나온 P와 Q
P(사용자별 채널 선호도 행렬): (예)잠재요인이 기업/비기업이라면, 사용자 1은 비기업 채널을 선호, 사용자 6은 기업 채널을 선호한다고 할 수 있음
Q(채널별 잠재요소 행렬(의 전치)) : 어떠한 잠재요인의 특성값을 반영한 행렬 기업/ 비기업이라면(아닌거같지만) 신한은행은 0.04만큼 그 요소를 가지고 있다는 말
- PQ.T로 원래의 R을 예측해보자.(K가 1이라서 예측은 부정확함)
주황색은 이미 등록한 채널, 노란색은 등록한 채널을 제외하고 등록할 가능성이 가장 높은 채널
실제로 추천 시스템을 돌렸을 때, 6번 사용자의 경우 top3가 이렇게 나옴
Output
'Archive > 통계&코딩이것저것' 카테고리의 다른 글
Ordinal Regression (0) 2021.10.13 Neural Collaborative Filtering 논문 리뷰 (0) 2021.09.14 기업명 표준화(클리닝) (0) 2021.09.06 n-gram을 이용해서 철자를 교정해보자 (0) 2021.09.02 cnn, rnn 차이 설명 (0) 2021.08.23 - R (원래의 행렬을 축약) 사용자 1,6 이 등록한 채널 이라고 가정(2사용자, 23채널)