Share           Pin It

이 글은 이전에 다뤘던 글들에 비해서 조금 더 관념적이면서 기술적인 글을 담고 있습니다. 그렇다고 해서 수식이나 프로그래밍 코드가 포함된 것은 아닙니다.

추천 시스템 (CF방식)에서 어떤 유사도 similarity measure를 사용하느냐에 따라서 추천 시스템의 성능에 큰 영향을 준다고 설명했습니다. 일반적으로 Euclidean distance, jacard index, correlation coefficient, cosine 등의 유사도를 많이 사용하고 있다고 말했습니다. 그리고, 추천 시스템에 따른 예측값과 실측값의 Error term이나 이들의 correlation의 정도로 추천 시스템의 정확도를 평가한다고 말씀 드렸습니다. (하단 링크 참조)

이 글에서는 유사도 또는 성능평가 측도에 대해서 좀더 깊게 생각해볼까 합니다.

유사도 또는 성능평가 측도는 간격 Gap 또는 경향성 Tendency 두가지 term으로 구성되어있습니다. 현재 대부분의 측도들은 한가지 term으로만 유사도를 측정하고 있습니다. Euclidean distance, cosine, 또는 Error 합 (MAE, RSME)은 두 샘플값 (e.g., 실측값과 예측값) 사이의 간격을 수치화한 것이고, correlation coefficient는 경향성의 동조 정도를 수치화했습니다. 결론적으로 말하면 간격과 경향성은 모두 나름의 (존재) 이유가 있지만, 결국 이 둘을 하나로 합친 measure가 필요하다는 것입니다.

많은 경우 실측값과 예측값의 유사정도를 측정하기 위해서 이들의 에러값 Error 또는 잔차 residual를 구하는 것은 합리적입니다. 많은 샘플에서 실측값과 예측값 사이의 간격이 평균적으로 좁다는 것은 이 두 값이 거의 같다는 얘기가 됩니다. 그러나 실제 이 두 값들을 산포도를 그려보면 생각보다 분산/산포도가 심하다는 것을 확인할 수 있습니다. 평균적으로는 시스템이 잘 예측하는데, 각각의 샘플을 보면 전혀 엉뚱한 값으로 예측했다는 의미가 됩니다. 아래 그림은 학교에서 논문을 적으면서 CF방식의 정확도를 측정한 것입니다. 붉은 선이 실측값이고 푸른점들이 예측값인데, 평균적으로 MAE가 괜찮게 나왔지만 그림만을 얼핏 보면 엉터리 시스템인 듯 보입니다. 그래서 분산도를 고려해서 시스템을 평가해야 된다는 논문을 적은 적이 있습니다. 참고로 아래 그림은 샘플들의 레이팅값이 고르게 퍼져있지 않기 때문에 정확한 예측 시스템을 만들고 평가하는데 문제가 있다는 점도 함께 보여주는 그래프입니다.


두번째로 경향성 즉 correlation을 측정하는 것도 매우 합리적입니다. 위의 간격을 측정한 것에서 보여줬던 평균은 비슷하지만 분산이 심한 경우는 나쁜 시스템이다라고 말할 수 있습니다. 그런데 순전히 경향성만을 판단하면 둘 사이의 간격을 고려하지 못합니다. 예를들어, A = { 1 2 3}, B = { 4 5 6 }, C = { 5 5 5}, D = { 4 4 6}으로 세개의 샘플을 측정했다고 가정해봅니다. 이 중에서 B가 실측값이라고 봤을 때, 경향성만 따지면 A가 B와 가장 가깝게 측정됩니다. 그런데 A와 B의 평균 간격이 3으로 매우 넓기 때문에 정확한 값을 예측하지 못했다고 볼 수 있습니다. D의 경우 A보다는 경향성은 약하지만, 간격을 생각해보면 D가 A보다 더 정확한 예측값입니다. (간격만을 고려한다면 위의 그림에서도 보여지듯이 C와 비슷한 예측값이 나올 가능성이 높습니다.)

결론적으로 정확한 유사도 또는 성능평가측도는 실측값과 예측값 사이의 간격과 경향성/동조성을 동시에 최적화하는 것이 필요합니다. 저의 논문에서는 Sim 또는 Err = '간격 * 분산'으로 구해야 한다고 적었습니다. 잠시 생각해보니, 간격보정 bias correction이 확실하게 이뤄진다면 간격보다는 경향성이 비슷한 것이 더 나을 수도 있다는 생각이 듭니다.

추천시스템 전체 목록

  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)
  15. 추천 시스템과 머신러닝 (PR시리즈.15)
  16. 추천 시스템과 다중인격 (PR시리즈.16)
  17. 추천 시스템의 유사도에 대한 심화 (PR시리즈.17)

==

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

댓글을 달아 주세요

Share           Pin It

이전 글에서 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

댓글을 달아 주세요