Clustering, Colaboration Filttering
한 가지 확실히 해두고 이 글을 시작하겠다. 이 글은 순수하게 내가 지켜 보고 있는 한 스타트업이 잘 되기를 바라는 마음에서 쓰는 글이다. 이제는 누구나도 쉽게 접하는 개인화 추천 기술 및 구현 대하여 기술하고자 한다. 그 분이 이 글을 바탕으로 하여 조금이라도 도움이 되셨으면. 물론 나보다 더 잘 아시고 계실듯한 내용일 수도 있다는 생각이 들긴한다. 이 글은 관련 전문가의 조언, 구글링, 나의 지식을 더하여 나온 결과물임을 밝힌다.
개인화 추천에 대하여 데이터 사이언티스트의 시선이 아닌 아주 평범한 개념에서 접근해보자(데이터사이언티스트가 아닌 이를 위한 배려이다). 그대의 상식선에서 접근해보자. 쉽게 쓰겠다. 어렵게 쓸 지식도 없지만.
A라는 product를 구매한 사람이 평점으로 x점을 주었을 경우 B라는 product에 얼마나 만족할지를 찾아내어보자. 방법은? 그렇다. 그대가 예상하는 방법데로, A product에 x와 비슷한 평점을 준 다른 사람이 B에 얼마의 평점을 주었는지 뒤져서 찾는 것이다. 끝났다. 이것이 collaboration filltering이라고 부르는 개인화 추천 중 가장 대중적으로 널리 사용되는 방법이다. 물론 파고 들면 더욱 복잡하며, 내가 주저리 주저리 적는것보다 구글링이 더 정확하게 나온다. 찾아봐라 COLLABORATION FILLTERING.
이제 엔지니어의 관점에서 한 번 생각해보자. 빅데이터다. Big이다. 위의 알고리즘을 구현해야 한다고 하자. 데이터 양이 엄청나며, 찾는데 너무 많은 시간이 소비될 것이다. 아니 더욱 정확히는 불가능이다. 엔지니어라면 알 것이다. 클릭(or 터치) 이벤트 후에 인간의 인내심이라는 존재 하지 않는 다는 것을. 다음 페이지(결과)가 바로 나와야 한다. 하지만 수만은 데이터를 뒤지는데는 엄청난 시간이 소비된다. 그래서 Clustering(군집화)라는 것을 수행한다.
Clustering이란 뭐냐. 비슷한 데이터를 묶는 것이다. 물론 어떠한 기준으로 비슷하다고 판단할 것인지에 대한 기준이 있어야 한다. 여기서 위의 예를 이어서 가보자. 별점을 기준으로 비슷한 녀석들끼리 미리 묶어 두는 것이다. 이런 방법으로 미리 비슷한 녀석을 미리 묶어서 데이터 양을 뒤져서 사용자에게 보여주어도 불만 없을 수준으로 양을 줄여야 한다. 물론 양을 많이 줄이게 될 수록 정확도는 낮아지게 된다.
위의 이미지가 clustering algorithem중 하나인 k-means를 통하여 나온 결과값이다. 검은 점이 원본 데이터의 좌표이며, 파란점이 대표값이다. 이런식으로 미리 데이터를 줄여야 한다. 저런식으로 데이터를 줄여서 그 결과를 저장한 후에 그곳에서 데이터를 뒤져야 한다.
지금까지의 내용을 정리해보면,
1) 축적된 데이터를 미리 clustering 한다.
2) 사용자 정보가 들어오면 미리 clustering 된 데이터에서 비슷한 녀석을 찾는다.
3) 아주 빠르고 멋진듯이 추천해준다.
여기에 조금만 살을 붙여 보자. 이상한 녀석은 어디라도 있다. 모든 별점을 5점으로 때려 박는 애들이 있다는 것이다. 또는 0점. 이런 녀석들이 노이즈다. 2가지 방법이 있다. 여기에서 타협을 해야한다. "야, 장난쳐? 다 0점 때리고 뭘 바래?"라는 팝업을 보여줄 것인지. 뭐라도 추천해줄 것인지. 뭐라도 추천해 준다라면, 어떤 방식일지. 그냥 무조건 잘 나가는 녀석을 추천해줘? 그냥 모두 5점이면 모두 3점으로 하고 추천해버려? 등등. 이 부분은 넘어 가겠다. 이유인 즉, 사용되는 목적, 서비스의 특징이나 고객의 특징에 따라서 다르다. 한마디로 정의하기 힘들며, 이 부분은 넘어 가겠다. 하지만 서비스에서는 고려 되어야 한다. 반드시.
살 조금 더 붙여 보자. 어떤 사람에게 위의 방식데로 A라는 product에 4.6점을 예상하고 추천해주었더니, 그 사람은 실제로 0점을 주었다고 가정하자. "하 참 너 어처구니 없네. 니놈 이 서비스 쓰지마"라고 마음속에 외치며, 이유를 찾아야 한다. 왜 추천 서비스가 틀린 것인지. 알고 보니 이유는 이놈은 그냥 어떤 특징에 미쳐 있는 것이다. 특징이라 함은, 영화라면 배우, 책이라면 저자 등에 미쳐 있는 것이다. 이런 어떤 특징에 미쳐있는 사람은 대부분 그 특징을 만족하면 5점 아니면 0점을 주는 경우가 많다. 그러면 여기서 우리는 다른 한 가지를 추가할 수 있다. clustering된 녀석 중 비슷한 녀석을 찾기 전에 이 사용자가 어떤 특징을 광적으로 좋아 하는지에 대한 부분이다. 어떤 특징을 광적으로 좋아한다라면, 그 사람은 그 특징을 가진 product를 추천하면 그대의 서비스는 신이 만든 것이다라며 소문을 내고 다녀줄 것이다.
살을 더 붙이고 싶지만 살짝 쉬면서 읽어보니 내용이 지루해지는것 같아서 마무리 하겠다. 개인화 추천 알고리즘에 완벽이란 존재하지 않는다. 다만 완벽을 위해 나아갈 뿐이다. 계속해서 발전시켜야 하며, 그 발전은 단순하게 책상머리에 앉아서 알 수가 없다. 경험과 데이터를 통하여 발전하며, 그 데이터를 통하여 어떻게 발전 시켜 나갈 것인지 고민해야 한다. 부디 그분이 성공하기를 마음으로 기원하며 글을 마친다.