본문 바로가기

추천 시스템/Coursera

Evaluation and Metrics - Experimental Protocols

Experimental Protocols

강의 링크 : https://www.coursera.org/learn/recommender-metrics/home/welcome

 

Coursera | Online Courses & Credentials From Top Educators. Join for Free | Coursera

Learn online and earn valuable credentials from top universities like Yale, Michigan, Stanford, and leading companies like Google and IBM. Join Coursera for free and transform your career with degrees, certificates, Specializations, & MOOCs in data science

www.coursera.org

지금까지 추천 시스템을 평가하기 위한 다양한 metric들을 알아보았는데, 이번에는 추천 시스템을 평가하기 위해 어떻게 experimental protocol을 짜야하는지 보도록 하겠습니다.

 

모델을 평가하는 목적은 결국 추천 시스템이 얼마나 제 역할을 하는가이고, 따라서 실제 서비스에서 user의 평가를 바탕으로 하는 것이 가장 좋습니다. 하지만 online evaluation이 불가능한 환경에서는 주로 hidden data evaluation만 사용할 수 있겠죠.  이전 글에서 언급한 것처럼 offline evaluation만으로 이 모델이 실제 서비스에서 잘 작동하는가를 알 수는 없습니다.(Business와 직결되는 offline evaluation metric이 있다면 가능할 수도 있겠네요) 다만 이러한 offline evaluation을 통해 최소한 진짜 성능이 좋지 않은 model들은 걸러낼 수 있고 남은 모델들로 online evaluation을 돌려보면 적은 비용으로 어떤 모델을 사용하는 것이 좋은지 알 수 있을겁니다.

 

가장 간단한 experimental protocol은 일부 데이터를 숨기는 것입니다. 가지고 있는 data를 train, test set으로 split하고, train set으로 훈련을 진행한 다음 test set으로 모델을 평가하면 됩니다. 그러면 data를 어떻게 split하는 것이 좋을까요?

 

먼저 user를 train, test set으로 나누는 방법이 있습니다. Train set에 속하는 user들의 rating을 이용하여 학습을 시키고, test set에 속하는 user들을 이용해서 평가를 합니다. 하지만 이 때 test set에 속하는 user들의 rating을 모두 가려버리면 이 user들에게 백지 상태에서 추천을 해야하는 상황이 발생합니다. 페이스북에 처음 가입한 사람들에게 친구 추천을 해야하는데 이미 아는 친구가 있는지, 어디에 사는지, 어디에서 접속했는지조차 모르면 누구를 추천해야 할 지 난감하겠죠. 이러한 cold start problem이 발생합니다. 따라서 test set에 있는 user라도 어느 정도의 기본 정보는 가지고 있어야 하기 때문에 아래 그림처럼 test set에 있는 user의 rating 중 일부를 random하게 probe rating으로 떼어 train set의 data와 같이 학습시킵니다. 이 경우 학습은 train set 내 user의 rating + test set 내 user의 probe rating, 모델 평가는 test set 내 user의 test rating으로만 진행하게 됩니다(주황색).

나아가 이러한 rating은 시간이 지나면서 쌓이기 때문에, 시간에 따라 split을 할 수도 있습니다. 사람마다 특정 시점을 기준으로 이전 rating을 train set으로, 이후 rating을 test set으로 사용할 수 있습니다. 좀 더 나아가면, 시간에 따라 train, test set을 변화시킬 수도 있습니다.

 

초록색이 train data, 노란색이 test data라고 합시다. 첫 번째 모델을 학습시킬 때는 1주차 rating을 이용해서 학습시키고 2주차 rating을 이용해서 evaluation을 진행합니다. 그 다음에는 1, 2주차 rating으로 train, 3주차 rating으로 test를 합니다. 이런 식으로 기준 시간을 옮겨가면서 모델의 성능을 평가할수도 있습니다.

 

시간을 고려하지 않고 추천 시스템을 학습시켜도 accuracy, diversity 등을 평가할 수 있지만, 이렇게 time stamp를 이동하면서 train, test set을 만들면 시간에 따른 accuracy, diversity를 추가로 확인할 수 있습니다. 예를 들어, 그림에서 1st iteration에서 나온 추천 리스트($L_{1}$)와 2nd iteration에서 나온 추천 리스트($L_{2}$)를 비교해서 얼마나 추천되는 item이 다양해졌는지 확인할 수 있습니다. 이렇게 train set의 범위를 늘려가다가 특정 기간의 train set을 이용해서 학습시켰을 때 가장 accuracy나 diversity가 높게 나왔다면, 해당 기간을 hyperparameter로 잡고 학습을 시켜볼수도 있겠죠. 강의에서 소개하는 또 다른 예시로는, 시간에 따라 모델을 switch하면서 추천했을 때 diversity가 높게 나왔다는 결과를 얻기도 했답니다. 처음에는 kNN, 그 다음에는 SVD, 그 다음에는 다시 kNN... 이런 식으로요. 이렇게 고정된 시간을 기준으로, 또는 랜덤하게 split할 때보다 insight를 더 많이 얻어갈 수도 있다고 합니다.

 

 

이번에는 experiment protocol을 어떻게 설계하는지, data를 split하는 부분에 집중해서 확인했습니다. 이외에도 수많은 논문에서 다양한 실험 방법을 제시하고 있으니 논문에서 어떻게 실험을 설계했는지 찾아보셔도 좋을 것 같습니다. 제가 학부연구생 시절 한 연구에서는 MovieLens dataset-100k에서 모든 user에 대해 rating을 8:2로 split하고 top-N 추천을 했을 때, test set 내의 rating이 5점인 영화를 얼마나 잘 맞추었는가를(accuracy) precision, recall을 통해 확인했습니다. Diverse recommendation이 주제여서 diversity는 intra-list distance 및 aggregate diversity를 통해 측정했습니다. 지금 생각해보면 더 실험을 잘 설계할 수 있었을텐데 아쉬움이 많이 남네요. 이 강의라도 듣고 연구를 진행했으면 하는 아쉬움이 지금 듭니다.

 

본문에 혹시라도 틀린 부분이 있으면 지적 부탁드립니다.