티스토리 뷰

발생일: 2017.01.14

키워드: Matchbox recommender

문제:

지금도 잘 모르지만, 지금보다 더 잘 몰랐을 때의 메모 ㅎㅎ.

MS 의 Mathbox recommender 모델을 사용해 추천을 적용하려고 했다가 실패했다.
점수를 내는 기준을 제대로 잡지 못했기 때문이다.

지금 보면 워낙 기초가 없던 때라 그런 거였는데, 나중에 같은 실수를 하지 않게 기록해둔다.


해결책:

매치박스 레코멘더 모듈은 각 아이템 간에 점수(rating)를 부여하고 이를 조합해 추천하는 방식이다.

우린 아파트 정보 서비스여서,
- 사용자에게 아파트를 추천
- 아파트와 비슷한 아파트 추천
하는 것을 목표로 했다.

점수는 조회수와 알림 구독 여부, 우리집 선택 여부로 아래와 같이 조합했다.

- rating이 0부터 시작해서,
- 조회수 4건 이상이면 +1
- 조회수 7건 이상이면 +2
- 구독하면 +2
- 우리집으로 선택하면 +2

rating의 최대값은 10으로 조정했다.
평가값이 0~최대값 사이이기 때문에, 이상치에 의해 최대값이 영향을 받을 것 같았기 때문이다.

여러 조건으로 실험해본 결과는 정확도는 0.75~0.8사이에 있었고, 평가값이 좋아지는 쪽으로 수치를 조절했다.

사용자에게 아파트를 추천하는 작업은 학습 시간이 오래 소요돼서, 아파트와 비슷한 아파트 추천 결과를 실제로 돌려봤다.
헐... 근데 결과가 정말 엉망이었다. 이렇게 안 맞을 수 있다니.... -0-

혹시나 해서 조회수만 기준으로 해서, rating 값이 0, 1, 2만 나오도록 실험했더니 0.87이 나오더라.
나아가, 구독 여부로 rating이 0, 1만 나오도록 했더니, 정확도가 0.96까지 올라갔다.

비슷한 아파트 추천 결과도 만족스러웠다.

왜 그랬던 걸까?
논문을 살펴봤다.
Matchbox: Large Scale Online Bayesian Recommendations 논문: http://www.herbrich.me/papers/www09.pdf


In addition it is desirable that a recommender system can
be applied flexibly in a wide variety of scenarios. Frequently,
data on user preferences is in the form of ratings on an ordinal
scale (for example Netflix [1]) where each user’s interpretation
of this scale may be different. In other cases we
may only have data showing which items were clicked on
by a user, where we assume that a user clicking on an item
provides implicit evidence that it is interesting to them

사용자는 흔히 넷플릭스의 영화 평점처럼 1~5점의 순서를 가진 값으로 선호도를 평가할 수 있다.
이렇게 평가할 경우, 같은 점수를 주더라도 사용자마다 평가하는 기준은 다를 수 있다.
(예: A가 준 4점과, B가 준 4점은, 점수를 주는 그의 성향에 따라 의미가 다를 수 있다)

반면, 좋다/싫다와 같이 평가할 수도 있다.
구글의 뉴스 추천 시스템은 단순히 기사 클릭 여부를 가지고 추천한다고 한다.


논문에서 제시하는 추천 시스템 아래 3가지 대안을 가지고 rating을 평가한다.

The model for user feedback is flexible. We present
three alternatives: direct observation of an absolute
rating each user gives to some items, observation of a
binary preference (like/ don’t like) and observation of
a set of ordinal ratings on a user-specific scale

- rating의 절대값
- rating의 바이너리값
- 사용자가 평가한 값의 범위 내에서의 순위


생각해보니, 우리가 잘못 적용한 점이 있었다.

먼저, rating의 후보 값은 같은 맥락에 있어야 한다는 것이다.
영화 평점이 1~5점이었던 것에 반해, 우리가 처음에 적용했던 척도와는 좀 달랐다.

- A가 평점을 3, 4, 5 범위 내에서만 했다면, A에게 4점은 보통일 것이다.
- B가 평점을 1, 3, 5 범위 내에서만 했다면, B에게 4점은 좋은 축에 속할 것이다.


같은 맥락이 아니라면 사용자 범위 내로 순위를 매길 때 의미가 없어질 것 같다.

완전히 조회수 기준이라면, 
- A의 아파트 선호도가 1, 10, 30이라면, A에게 10번 조회는 나쁜 축에 속할 것이다.
- B의 아파트 선호도가 1, 3, 10이라면, B에게 10번 조회는 좋은 축에 속할 것이다.

(이런 이유 때문에 n번 이상 평가한 사용자를 변수로 설정할 수 있게 한 모양이다)


우리가 처음에 했던 것처럼, 조회수(+1씩)와 구독 여부(+10)의 조건을 합해 점수를 냈다면,
- A의 아파트 선호도가 1, 10(a, 구독), 30(조회+)이라면, A는 구독한 아파트 a는 추천 대상이 아닐 것이다.
- 반면, B의 아파트 선호도가 1, 3, 10(b, 구독)이라면, B가 구독한 아파트 b는 추천 대상이다.


처음부터 rating의 변수를 설정했던 방법이 우리 의도를 벗어난 것이었다.
이런 경우라면, 바이너리 결과 값으로 rating을 평가하는 것이 더 나은 결정일 것 같다.



반응형
댓글
공지사항