Julie의 Tech 블로그

추천시스템 - (1) 개요 본문

Tech/RecSys

추천시스템 - (1) 개요

Julie's tech 2021. 9. 13. 22:41
728x90

본 시리즈는 추천 시스템에 대해, 특히 Collaborative Filteirng 방식에 대해 좀 더 깊이 있게 다뤄볼 것이다.

이번 글은 첫 편인 만큼 추천 시스템과 그와 관련된 기본적인 개념/툴들에 대해 개괄적으로 훑어볼 것이다.


데이터 마이닝 (요즈음은 데이터 사이언스라고 더 불리는 듯 함) 은 데이터를 모아 분석한 이후 정보를 추출하는 기술이다.

정보란 좀 더 유의미(useful)하고 일반적이지 않은(non-trivial) 데이터를 의미한다.

데이터 마이닝 기술에는 여러 가지 토픽들이 있다.

- 분류(Classification)

- 군집화(Clustering)

- 이상탐지(Outlier Detection)

- 연관분석(Association Rules)

이러한 데이터 마이닝 기술은 추천 시스템을 개발할 때 사용되곤 한다.

추천 시스템이란 선택지가 다양할 때 어떤 선택이 최적의 선택인지를 파악할 때 사용하는 기술이다.

Target User에게 User가 좋아할 것 같은 아이템을 골라 추천해주게 되는 것이다.

이 사람의 선호를 알기 위해서 과거에 어떤 상품을 구매했는지/평가했는지/찾아보았는지/찜해두었는지 등을 수집한다.

추천 시스템 접근 방식

추천 시스템의 접근 방식으로는 아래와 같이 나뉜다.

- Content-based approach : 유저 프로파일과 아이템 프로파일의 유사도가 높은 사람들을 클러스터링

- Collaborative Filtering approach : 유사한 선호를 가진 사람들이 선호했던 아이템을 추천

- Trust-based approach : 유저들 사이에서 신뢰가 형성되어있는 관계 내의 추천

- Hybrid-approach : 위 접근방식들의 결합본

우리는 Collaborative-Filtering Approach 접근 방식에 좀 더 집중할 예정이다.

CF는 앞서 말했듯 유사한 선호를 지닌 다른 사용자들이 높은 rating을 준 아이템을 유저에게도 추천을 진행하는 것인데,

유사한 선호를 계산하는 방식이 어떠느냐에 따라 여러 가지 알고리즘들로 나뉜다.

CF계열 모델 알고리즘들

가장 간단한 방법은 Heuristic-based Method이다.

연산도를 집계하는 방식이 있는데, 아이템별 사용자별 rating 점수를 사용한다.

연산도 알고리즘은 Pearson Correlation coefficient(PCC), 혹은 Cosine 유사도를 사용하기도 한다.

혹은 유사관계를 ML기반으로 추출해볼 수도 있다. 그 예로 Matrix Factorization, Social Network, DL방식을 이용하기도 한다.

Matrix Factorization는 사용자와 아이템을 두 dimension 으로 두고, 사용자의 아이템 rating을 그 값으로 두게 된다.

m명의 사용자와 n개의 아이템이라고 한다면, m x n 행렬을 구성한다. 이를 기반으로 사용자 벡터와 아이템 벡터 두 벡터를 추정해야한다.

사용자 벡터와 아이템 벡터를 추정하는 방식은, 실제 사용자의 아이템 rating값을 예측값과의 차이를 줄이는 방식으로 학습할 것이다.

출처 :  https://medium.com/@connectwithghosh/simple-matrix-factorization-example-on-the-movielens-dataset-using-pyspark-9b7e3f567536

다른 방식으로는 Random Walk with Restart인데, Social Network 방식을 이용하는 알고리즘이다.

사용자와 아이템을 network graph 형태로 표현하고, Random walk와 Restart 두 방식을 섞는 것이다.

Random walk는 연결된 링크를 따라 랜덤하게 선택해서 따라가고, 임의의 확률만큼 랜덤하게 점프를 하여 임의성을 추가하는 것이다.

추천시스템 평가 지표

추천 시스템의 성능을 평가하는 방식도 여러 가지로 나뉘는데, 그 중 대표적으로 두 가지만 먼저 살펴보자면.

- 5-fold CV (Cross Validation) : 데이터 셋을 랜덤하게 5개 fold로 나눈 후, 각 fold가 최소 한 번 이상 테스트셋으로 사용되어 평가됨

- LOOCV (Leave-one-out CV) : 임의의 유저-아이템 데이터 쌍 하나를 테스트 셋으로 두고, 나머지를 학습 데이터로 사용한 뒤 모든 유저-아이템 쌍이 한 번 이상의 테스트셋이 되었을 때 평가를 종료

이 두 가지 방식 모두 랜덤하게 데이터를 사용하여 최대한 실제 모델 성능에 가까운 평가를 할 수 있도록 해주는 방식이다.

평가지표는 머신러닝 모델 평가지표와 유사하게 Precision, Recall, F1 스코어 등이 사용될 수 있다.

NDCG(Normalized discounted cumulative gain) 지표도 사용될 수 있는데, 아이템의 추천 순위를 평가 방식에 반영하는 로직이다.

즉 전체 6개 상품을 추천했다고 했을 때, TOP 1~3에서 추천된 상품을 맞춘 것이 TOP 4~6위 추천 상품의 정확도보다 더 높은 점수를 주는 것이다.

출처 :  https://joyae.github.io/2020-09-02-nDCG/

MRR (Mean Reciprocal rank) 지표도 있는데, 마찬가지로 순위를 고려한 지표로서,

TOP N 개 아이템들 중에서 정답으로 인정된 추천 결과의 아이템 순위를 역산하여 (예를 들어 3위 아이템이 정답 > 1/3) 평균하는 지표이다.

출처 :  https://lamttic.github.io/2020/03/20/01.html

Challenge : Data Sparsity Problem

CF계열 알고리즘은 유저의 아이템별 평가 점수가 어떠한지에 대해 굉장히 집중되어있다. 이로 인해 주로 아이템이 굉장히 많거나 유저가 rating을 하는 것에 대한 진입장벽(깐깐하게 평가 / 평가가 필수적이지 않아서)이 있기 때문에 data sparsity 문제가 발생한다.

대부분 실제 데이터의 density가 0.04%보다 낮은 편이라 개발한 모델의 정확도가 낮거나 coverage가 낮다는 문제가 생긴다.

이와 관련해서 아래 논문을 바탕으로 어떻게 해결할 수 있는지 간략하게 정리하였다 :

Told you I didn't like it : Exploiting Unintersting Items for Effective Collaborative Filtering

IEEE ICDE, 2016

논문의 취지는 sparsity가 높은 데이터에 대해서, 사용하지 못한 아이템(평가가 없는 아이템)의 데이터를 활용해보자는 것이다.

논문에서는 Unrated Item의 이유가 두 가지가 있을 거라고 얘기한다 : 아이템의 존재유무조차 몰랐거나, 관심이 없어서(싫어서/필요없어서)이다

Uninteresting(관심없는) Item은 유저가 부정적인 선호를 가지고 있다고도 볼 수 있다.

이 두 가지 경우가 섞여서 데이터에 녹아있기 때문에, 선호를 좀 더 구분해보면 데이터를 다르게 활용해볼 수 있다는 것이다.

논문의 메인 개념이라고 할 수 있는 유저의 선호는 두 가지로 나누어져있다 :

- 사용 전(Pre-use) 선호 : 유저가 아이템을 사용하거나 구매하기 전에 느꼈던 평가

- 사용 후(Post-use) 선호 : 유저가 아이템을 사용하거나 구매한 이후 느꼈던 평가

사용 전 선호가 있는 아이템은 사실상 관심이 있는 아이템이라고도 볼 수 있다.

결국 우리가 관찰 가능한 데이터는 "관심있는 데이터 & 평가한 데이터" 인 것이다.

따라서 Unrated 아이템 중에서도 관심없는 아이템에 대해서도 우리가 파악이 가능하다면, 데이터를 좀 더 활용해볼 수 있다는 게 논문의 취지이다.

이에 대한 해결책으로 Rated 아이템과 유사한 Unrated 아이템을 추출하여 Rating 점수를 추정해보자고 제안한다.

즉, 두 가지 전략으로 추천을 진행하는 것이다.

- Unintersting 아이템을 최종 추천 결과에서 제외한다.

- Uninteresting 아이템과 rated 아이템 데이터 모두를 활용한다.

논문의 메인 방법론은 Zero-Injection 이라는 로직인데, 아래와 같은 step으로 구성된다.

1. Pre-use Preference Matrix을 구성한다.

이 때 Rated 아이템에 대해서는 사용전 선호는 max 라고 생각한다(0~1 스케일이면 1으로 매김, 직접 구매/지불하고 사용하였기 때문)

Unrated 아이템에 대해서 pre-use preference를 예측한다.

2. Pre-use Preference matrix에서 사용자별 하위 p% rank 를 기록한 아이템은 Unintersting 아이템이라고 정의한다.

3. Post-use Preference Matrix에서 Uninteresting Item에 대해 0점을 채워넣는다. Rated 아이템의 rating은 그대로 사용한다.

4. Post-use Preference Matrix로 CF계열 알고리즘을 수행한다. (Heuristic-based 알고리즘, Model-based 알고리즘 등을 사용)

논문에서 제안하는 p%의 수준은 90%로 보인다. 10%의 Uninteresting Item 점수만을 사용하는 것이다 (0초과인 아이템들)

출처 :  https://ieeexplore.ieee.org/document/7498253?reload=true

 

Pytorch : 분석 프레임워크

일반적으로 딥러닝 관련한 프레임워크를 pytorch를 사용하는 경우도 있는데, 간단하게 pytorch와 tensorflow의 차이를 보자.

Pytorch 역시 Tensorflow와 마찬가지로 tensor 구조를 지원하고 GPU 연산을 지원한다.

Tensorflow와 Pytorch 의 가장 큰 차이점은 run 하는 방식의 차이인데,

Tensorflow는 "Define and Run", 즉 연산 그래프를 미리 구성해두고 Run할 때 값을 전달하여 결과를 얻게 되고

Pytorch는 "Define by Run", 연산 그래프를 미리 만들지 않고 Run할 때 그래프를 구성하고 값을 전달하게 된다.

Pytorch는 동적 방식이기 때문에 Tensorflow보다 빠른 것으로 알려져있다.


이번 글은 이만 여기서 정리하고, 다음 글에서는 단일 클래스 분류 문제 (One-class Classification) 에 대해 좀 더 살펴보도록 하겠다.

MF 알고리즘에 관련하여 이전에 작성했던 블로그도 함께 보면 좋을 것 같다.

https://blog.naver.com/ilovelatale/222355119175

 

 

반응형