본문 바로가기
추천시스템

Context aware 추천, Sparse Matrix 처리

by 장찐 2022. 1. 24.

Context-aware 추천 

 

 추천 시스템의 정확도와 만족도는 다양항 상황에 영향을 받는다. 같은 아이템이라도 같이 있는 사람, 날씨, 시간, 검색 도메인에 따라서 선호도가 바뀔 수 있다. 따라서 추천 과정에서 상황을 반영하는 것은 중요하다. 

 

✅ 상황변수를 반영하는 방법 

 

✔ 상황변수를 직접 반영하는 방법 

• 상황변수를 개별 추천엔진의 입력변수로 사용 → 모든 사용자들에게 동일한 영향을 주기 때문에 큰 효과가 없다. 

ex) 목요일을 변수로 사용하면, 목요일에 추천을 실시할 경우 모든 사용자들에게 같은 값을 더하거나 빼면 의미가 없어진다. 

 

✔ 상황변수를 개별 추천엔진을 결합하는데에 사용 

 여러 알고리즘을 결합할 때 상황변수를 가중치로 사용할 수 있다. 예를 들어, 월요일에는 추천엔진 1의 비중이 크게, 토요일은 추천엔진 2의 비중이 크게 할 수 있다. 이 과정을 마찬가지로 딥러닝 학습을 통해서 구한다. 

 


Sparse Matrix 처리  

 

대부분의 데이터는 아이템에 대해서 사용자가 rating을 한 값이 0.1% 미만이다. 따라서 이 데이터를 그대로 사용할 경우 연산량과 시간이 증가한다. 이러한 문제를 해결하기 위해서 해당 인덱스와 값을 따로 저장해서 처리한다. 이 방식은 데이터를 압축해서 처리하기 때문에 메모리 소비가 적다. 또한 일반적인 행렬 연산(사칙연산, 내적, 역행렬) 등도 numpy와 동일하게 사용할 수 있다. 데이터를 인덱스-값 형태로 처리하는데에 추가적인 비용이 들어가지만 element수가 적기 때문에 효율성이 높다. 

python 에서는 SciPy 라이브러리를 사용할 수 있다. 

 

✔ Sparse Matrix의 종류 

 

 

 

✅ Sparse 매트릭스 예제 

 

import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix

#예제 데이터 생성
ratings = {'user_id': [1,2,4], 
     'movie_id': [2,3,7], 
     'rating': [4,3,1]}
ratings = pd.DataFrame(ratings)

필요한 라이브러리를 불러오고 예제 데이터를 생성한다. sparse matrix 생성에는 scipy 라이브러리의 csr_matrix 클래스를 사용한다. 

 

# 판다스를 사용해서 full matrix로 변환
rating_matrix = ratings.pivot(index = 'user_id', columns ='movie_id', values = 'rating').fillna(0)
np.array(rating_matrix)

판다스를 이용해서 매트릭스 형태로 변경할 수도 있지만, 원래 데이터이 인덱스가 사라지는

# Sparse matrix를 이용해서 full matrix로 변환하는 경우
data = np.array(ratings['rating'])
row_indices = np.array(ratings['user_id'])
col_indices = np.array(ratings['movie_id'])

rating_matrix = csr_matrix((data, (row_indices, col_indices)), dtype=int)
print(rating_matrix)

 index-value 형태로 저장된 것을 확인할 수 있다. 이 형태에서도 원래 numpy array와 같이 인덱싱이나 연산 기능을 수행할 수 있다. 예를 들어, 사용자 1의 2번 아이템에 대한 rating 을 인덱싱 하기 위해서는 rating_matrix[1,2]

 

 넘파이와 동일하게 사용할 수 있기 때문에 기존 알고리즘들을 그대로 적용할 수 있다. 

 

 


Reference

 

 

댓글