본문 바로가기

Tech Story

추천 시스템을 위한 유사도 측정 방법 (PR시리즈.5)

이전 글에서 CF를 중심으로 추천 알고리즘을 설명했습니다. CF 방식은 나와 유사한 사용자의 아이템을 추천하거나 내가 관심있어하는 아이템의 관련 아이템을 추천해주는 방식입니다. 관련 아이템이라는 것도 결국 그 아이템에 관심있어하는 다른 사용자들이 공통적으로 본 아이템들로 정의가 됩니다. 유사 사용자 또는 관련 아이템에서 공통적으로 '유사성 = 관련성'이라는 개념이 등장합니다. CF가 매우 간단한 알고리즘이기 때문에, 초기의 많은 추천 시스템에서는 어떻게 유사도를 잘 구할 것인가가 주요 연구주제였습니다. 오늘은 이 유사성 또는 유사도를 어떻게 구하느냐에 대한 설명을 하겠습니다.

일반적으로 유사도 similarity measure는 두 오브젝트 사이의 거리 distance 또는 차이 difference의 역개념이기 때문에 거리/차이를 수치화하면 바로 유사성으로 변환이 가능합니다. 수학이나 머신런닝 등에서 많이 사용하는 다양한 distance들, 예를들어 euclidean distance, 각종 norm들이 모두 필요에 따라서 유사도로 사용이 가능하다는 것은 미리 말씀드리겠습니다.

가장 간편하면서 실용적으로 사용할 수 있는 유사도는 co-occurrence입니다. 유사도의 정의상 0과 1사이의 값을 가지지만, cooccurrence는 0이상의 정수를 가집니다. 복잡하게 A와 B는 얼마의 비율로 닮았다라고 추치화하는 것이 아니라, A와 B는 몇 회 함께 등장했다라는 단순 카운트로 유사도를 측정합니다. 만약 A와 B는 5회 함께 출현했고, A와 C는 10회 함께 출현했다면 A와 C의 유사도가 당연히 A와 B의 유사도보다 크다는 뜻합니다. 그런데, 예를들어, B는 총 10회 출현했고 C는 총 100회를 출현했는데, 그 중에서 A와 함께 출현한 회수가 5회, 10회인 경우 C가 B보다 A와 더 유사하다고 쉽게 말할 수 없습니다.

그래서 일반적으로 많이 사용하는 것이 Jaccard index 또는 tanimoto metric과 같이 집합론 Set Theory의 개념을 차용한 비율입니다 (참고, Jaccard 위키페이지). Jaccard index는 쉽게 말해서 A와 B의 출현에서 '교집합 / 합집합'의 비율을 뜻합니다. 즉, A 또는 B가 출현한 모든 사건들 중에서, A와 B가 동시에 출현한 사건들의 비율을 뜻합니다. Co-occurence나 Jaccard index의 경우 암묵점수에서 주로 사용이 됩니다. 명시점수에서도 사용이 가능하지만 조금 변형이 필요합니다. A와 B가 아이템 {a, b, c}에 대해서 각각 {2, 4, 5}와 {4, 4, 4} 레이팅을 했다면, 단순 유사도에서 b만 공통점수를 갖게 됩니다. 그런데 a와 c를 똑같이 다른 것으로 볼 것인가?에 대한 의문이 남습니다. 그렇기에 명시점수에서 똑같은 레이팅을 받았다면 1로 설정할 수 있지만, 다른 점수를 받은 경우 무조건 0으로 설정해서 계산하기가 곤란합니다. 점수차가 최대 (5점 스케일에서 4점)일 때는 0으로 계산하지만, 그렇지 않은 경우 0과 1 사이의 적당한 값으로 변환해서 유사도/거리를 구하는 방법을 고려해볼 수 있습니다.

그래서 명시점수에서는 일반적으로 둘 사이의 correlation의 정도를 측정하거나 레이팅값을 벡터로 가정하고 두 벡터 사이의 cosine값을 구하는 방식으로 유사도를 측정합니다. 앞서 설명했듯이 euclidean distance를 구해서 역변환시키는 방법도 가능합니다. (변환. sim = 1 / distance 또는 (max.d - distance) / max.d 등) Correlation과 Cosine에 대한 수식은 별도로 적지 않겠습니다. 대신 위키페이지에서 Pearson correlation coefficientCosine similarity의 링크를 걸어둡니다. 일반적으로 cosine 유사도가 correlation보다 더 정확해서 더 많이 사용됩니다.

빅데이터 Hadoop을 위한 머신러닝 라이브러리인 Mahout에서 아이템 기반의 CF가 제공되고 있는데, 관련 위키페이지를 참조해보시면, 앞서 설명한 다양한 유사도 measure들을 사용하고 있는 것을 볼 수 있습니다. 일반적으로 특정 유사도가 다른 것보다 나은 성능을 보여준다는 설명은 존재하지만, 모든 문제/경우에서 베스트 퍼포먼스를 내는 것은 아닙니다. 상황/문제에 맞게 유사도를 선택, 변형해야 합니다. 그렇기에 데이터 또는 비즈니스에 대한 이해도가 필요합니다. 이전 글에서도 잠시 언급했지만, mahout에서 어떤 유사도를 사용하느냐에 따라서 java heap space 문제를 일으키기도 했고, 속도 차가 많이 차이가 나기도 합니다.

아주 정교할 필요가 없고 큰 데이터를 다룬다면 가장 심플하게 co-occurrence를 사용하는 것도 괜찮은 방법입니다. 만약 co-occurrence가 적당한 성능을 보여주지 못한다면 그 이후에 다른 measure들을 적용해보는 것도 늦지 않습니다. If you still have problems in your recommender engines, then hire me.

다음 글에서는 추천 시스템/알고리즘의 성능을 평가하는 방법/측도에 대해서 다루겠습니다.

추천시스템 전체 목록

  1. 추천 시스템과의 조우 (PR시리즈.1)
  2. 추천 시스템을 위한 데이터 준비 (PR시리즈.2)
  3. 추천대상에 따른 추천 시스템의 분류 (PR시리즈.3)
  4. 알고리즘에 따른 추천 시스템의 분류 (PR시리즈.4)
  5. 추천 시스템을 위한 유사도 측정 방법 (PR시리즈.5)
  6. 추천 시스템의 성능 평가방법 및 고려사항 (PR시리즈.6)
  7. 추천 시스템에서의 랭킹과 필터링 문제 (PR시리즈.7)
  8. 추천 시스템의 쇼핑하우 적용예 (PR시리즈.8)
  9. 개인화 추천 시스템에 대하여 (PR시리즈.9)
  10. 추천 시스템의 부작용 - 필터버블 (PR시리즈.10)
  11. 추천 시스템의 레퍼런스 (PR시리즈.11)
  12. 추천 시스템에 대한 잡다한 생각들 (PR시리즈.12)
  13. 추천 시스템을 위한 하둡 마훗 사용하기 (PR시리즈.13)
  14. 추천 시스템에 대해서 여전히 남은 이야기들 (PR시리즈.14)

==

페이스북 페이지: https://www.facebook.com/unexperienced

반응형