얼마전 야후 리서치 랩에서 논문 몇 편을 발표 했는데, 그 중에서 재미있는 논문에 대한 이야기를 하고자 한다.

"From 'dango' to 'japanese cakes': Query Reformulation Models and Patterns"

쿼리를 마이닝 한다. 이 이야기는 대부분의 경우 클릭 기반의 정보를 이용함을 의미한다. 하지만 위와 같은 주제의 논문은 사용자 세션을 기준으로 사용자의 쿼리 의도를 파악하는 마이닝 작업이다.

위 논문에서는 Query reformulation의 타입을 네 가지로 정의하고 이들을 구분하기 위한 분류기를 제작하는 방법을 이야기 하고 있다. 그럼 이들 네 가지는 어떤것일까?

사용자 삽입 이미지

위 그림은 논문 발표 ppt에 있던 내용을 캡쳐한 내용이다.

일반화(Generalization), 특수화(Specialization), 철자교정(Error Correction), 수평이동(Parallel Move)의 항목을 정의 하고 있다.

여기서 일반화는 우리가 "나이키 신발" 검색어를 "나이키"로 변경하는 것과 같은 리포뮬레이션을 의미한다. 그리고 특수화는 일반화 과정의 반대라 할 수 있다.
상식적으로 생각하더라도 일반적인 쿼리에서 특화된 쿼리로 사용자는 검색을 하게 될 것이라는 예상을 할 수 있는데, 물론 이 논문에서 검색 패턴을 조사한 결과 그렇게 나왔다.(60% 이상)

철자교정이야..뭐 다들 아실테고... 수평이동은 "나이키 신발"을 찾다가 어느 순간 "나이키 모자"를 찾는 경우를 예도 들 수 있겠다.

위와 같이 4가지 사용자 쿼리 패턴을 구분하고 이를 기반으로 통계를 내는 조사가 필요한 이유는... 이를 바로 사용자 쿼리 추천에 사용할 수 있기 때문이다.

국내에서는 다분히 쿼리 오타 수정만 해주는 아주 기초적인 것만 하고 있으나, 현재 야후 US페이지에서는 역시나 이런 논문이 나올 수 있었던 것처럼 Query suggestion을 잘 해주고 있음을 알 수 있다.


사용자 삽입 이미지


위 기능이 위 논문과 무관하지 않다는 것은 입력된 쿼리와 추천된 쿼리의 특징 그리고 비율을 보면 잘 알 수 있을거라 생각한다.

사용자 삽입 이미지

위에서 딱 보더라도 네가지 타입이 어떤 속성에 의해서 판가름 나게 되는지 한눈에 알 수 있다. 예를 들면 위에서 C타입에서 중요하게 쓰인 속성은 세션위치가 초반에 위치하며, 레벤스타인 거리(속칭 edit distance)가 3이하일때 스펠교정 타입이라고 분류한다는 것을 알 수 있다.

나름대로 작년 한해 일하면서 하던 일과 매우 관련이 많은 논문이라서 보는 내내 즐거웠다. 이제 다른 논문도 좀 찾아봐야 겠다.

ps. 위 캡쳐된 화면들은 이곳에서 찾아볼 수 있다.



From Dango to Japanese Cakes: Query Reformulation Models and Patterns


TAG
기계학습이나 머신러닝을 가미한 프로젝트 그러니까 지능형 에플리케이션을 구축할 때 간과하기 쉬운 몇 가지 사실을 이야기 하고자 한다.

물론 아래 사실은 학술적인 머신러닝책에 나오지 않은 경험적인 내용이다.

1. 데이터는 믿을만 하다?
아마 이 부분이 가장 많은 사람들이 간과하기 쉬운 부분일 듯 하다. 지능형 에플리케이션은 데이터에서부터 시작해서 데이터로 끝난다. 그리하여 믿을만한 데이터셋을 구축하는게 무엇보다 중요한 부분이 된다.
애초 에플리케이션의 아이디어 원천이 되는 부분이 데이터인데, 그 초반 데이터가 당신이 의도하는 에플리케이션의 모습을 반영하지 못할 가능성이 있다는 문제가 있다. 만일 처음부터 완전 무결하고 목적에 맞는 데이터가 무엇인지 알고 그걸 얻었다면 문제가 해결되지만 처음부터 그러기는 쉽지 않다. 그리고 데이터에 누락정보가 있을 경우가 있고 그보다 더 찾기 어려운 부분은 오류 데이터가 있을 경우이다. 요런 것들을 찾아내기 위해서는 몇몇 알고리즘이 있으나 결국 더블체킹이 유일한 방법으로 남게 된다. ^^;
그리고 데이터가 계속 변화하는 경우도 문제가 될 수 있는데, 만일 클릭 로그를 기반으로 뭔가를 구현한다면 로그의 변화에 기민하게 변화되는 프레임웍을 설계 하는 자세가 필요하다.
이 밖에 데이터 유닛의 통일, 알고리즘에 맞는 데이터셋 구축 등등이 필요하다.
이들 모두 데이터에 관련이 되는 것들이고 아무리 중요하다고 강조해도 모자람이 없을 부분이다.

2. 결과가 바로 나올까?
모든 학습 기반의 지능형 에플리케이션의 결과값 리턴 시간은 그리 길지 않다. 왜냐면 가장 많은 시간이 걸리는 모델 빌드가 미리 이루어 지기 때문이다. 그렇지만 만일 실시간 데이터가 중요하게 쓰이는 어떤 금융관련 결과를 뽑기를 원한다면 그 리턴 타임에 대한 고민을 해야 한다. 반드시 원하는 리턴 타임을 도출하기 쉽지 않을 것이다.

3. . 데이터 양은 별 상관이 없을 것이다?
100명의 데이터를 기반으로 모델 빌드한 결과가 100000명의 데이터를 기반으로 빌드한 결과와 결코 같지 않을 것이다.  상황에 따라서는 이 문제는 모델의 차원이 달라지는 문제이기 때문에 퍼포먼스가 많이 달라질 상황이 올 수도 있을 것이다. 따라서 이 문제에 대해서 더 많은 고민이 필요하다.

4. 대용량 이슈에 자유롭다?
단순한 추천엔진을 만드는 것도 대용량 이슈에 자유롭지 못하다. 학문적 레벨로 알고리즘을 적용하다가는 대용량 이슈에 무릎을 꿇게 될 수 도 있다. 따라서 실무에서는 이런 부분에 대해서 여러 최적화 트릭을 이용하기도 한다.(물론 몇몇 알고리즘들은 분산처리 알고리즘 디자인이 이미 되어 있는 경우도 있다)

5. 만능 알고리즘이 있다?
없다.
"망치를 들고 있으면 모듯 것이 못으로 보인다."는 속담처럼 특정 알고리즘만을 매달려 사용하는 과오를 저지르지 않아야 한다. 모든 알고리즘은 장점과 한계 모두 가지고 있다. 따라서 각 알고리즘의 특징에 대해서 잘 이해하는게 필요한 것이다.

6. 복잡한 모델이 좋은 것이다?
이 부분에 대해서는 오캄의 칼날이 좋은 설명이 될 것이다.
대부분의 경우 간단한 모델에서 시작해 결과 모델을 보완해 나갈 모델로 진화를 하는 방향으로 잡는다.

7. 바이어스 없는 모델이 있다?
한정된 데이터를 기반으로 학습 모델을 만들기 때문에 바이어스 없는 모델은 존재하지 않는다. 요 바이어스는 일반화라는 단어와 반대의 의미로 쓰이는데 일반화가 우리에게 다른 정보를 주는 반면에 바이어스는 이미 우리가 알게 모르게 인지하고 있는 부분이다.
대부분의 경우 바이어스가 없는 일반화된 모델을 원하지만, 그러기 쉽지 않은게 사실이다.

 
그냥 생각나는 것들만 정리해 봤다.
학교에서 배운것과 이를 기반으로 서비스에 적용하는것은 많은 차이가 있다는 것을 알았다. 그래서 경험이 중요한가 보다.
그래서 더 재미 있는 분야일 수도 있고 말이다.






 




일단 단일 알고리즘의 경우 SVM을 가장 선호한다. 물론 모델 빌드 후 바로 cross-validation 결과를 보면 정확도가 그리 좋지 않을 수도 있지만 SVM이 일반화 능력이 가장 좋다는 것은 이미 많은 논문에서 증명된 사실이다.

하지만 나는 대부분의 경우 하나의 분류기만을 사용하지 않는다.

아는 사람들만 아시겠지만 앙상블 학습(Ensemble Learning)이 성능이 좋다는 것은 공공연한 사실이다. Boosting 정도만 써줘도 대부분의 경우 성능이 좋게 나온다.
여러가지 학습기를 결합해 하나의 학습룰을 정의하는 것은 흡사 집단지성의 원리를 알고리즘에 적용한 것과 같다고 생각한다.
신기한 사실은 제임스 서로위키가 "대중의 지혜"에서 언급한 집단지성 발현의 3가지 조건과 같이 이 Boosting 알고리즘이 정확하게 분류기의 다양성, 독립성, 분산화와 통합 이렇게 세가지 조건을 추구한다는 것이다.
하긴.... 데이터도 다양한 인간 군상들의 결과물이니 그것을 판단하는 전문가 시스템이 위의 조건을 가지고 있어야 탁월한 판단을 내릴 수 있을 것이다.

사용자 삽입 이미지
referenced from scholarpedia


살다보면 사회과학, 공학, 자연과학 등등이 어느 한 지점에서 만나는 경우를 많이 보게 된다. 이런게 앎의 즐거움인가?

참... 그렇다면 SVM으로 Boosting 기법을 적용하면 어떨까?

이 부분은 직접 돌려보시라.... ㅎㅎ







ydnkr에 기고한 블로그 글이 오늘 올라 왔다.
작성한지는 꽤 되었으나 스케줄상 오늘 올라오게 되었다.

검색어 오타에 대한 흥미롭고 재미있는 사실들

역시 이것도 과연 그럴것인가? 하는 의문 때문에 하게 된 작업이였다. 물론 사용자 데이터 분석을 통해 사실을 알게 되었으며 이를 알고리즘화 하여 플랫폼에 넣었고 아시아 및 미국 개발자 분들이 삼삼한 개념이라는 말씀까지 들었던 내용의 일부분이다.

ydn에 맞는 성격의 블로그 글이라 ydn에만 올렸다. ㅋ




지난달에 올라온 Weka연재 중 1회를 올린다.

1, 2, 3, 4, 5, 6 페이지

ps. 그런데 제목에 엄청난 오타가 있었군,..쩝 ... ㅜㅜ;





TAG
얼마전에 슈퍼 크런처(super cruncher) 책에 대한 서평을 블로그에 올린적이 있었다. 그 때에는 읽기 전이였고,,, 지금은 다른 관련 책들을 서둘러 찾아 읽고 있는 중이여서 좀더 정리해 서평을 다시 올려본다.

읽는중...

$2
안진환 역/이언 에어즈 저

예스24 | 애드온2


사실 위 책 한권이 근래 8권의 책을 선정해서 읽는데 엄청난 영향을 끼쳤다. 대부분 사람의 의사결정에 대한 책들이다.



계량 경제학은 특히 데이터 마이닝과 상당히 관련이 많은 경제학 분야이며, 이 분야의 최근 책은 "괴짜경제학"이라는 이름으로 번역되어 출간되었다.
이 괴짜 경제학 저자들이 2005년에 야후와 구글에 초빙되어 강연을 했던 적이 있었는데 그때 "구글의 데이터가 있다면 당신은 어떤 실험을 해보고 싶나요?" 하는 아주 재미난 질문을 많은 구글러들에게 받았다고 한다. 물론 이 질문에 어떻게 답했는지는 아직 확인해보지 못했다(책에 나온다고 언급한 부분이 있었는데, 책에는 그 답변 내용이 나오지 않았다). 구글과 야후가 왜 2005년에 이 사람을 초빙해서 강연을 들었는지는 책을 보면 잘 알수 있다. 이 책의 저자가 가지고 있는 창의력과 통찰력 그리고 데이터를 기반으로 결정을 내리는 괴짜 같은 글들이 야후나 구글 개발자들에게 어떤 어필을 했을 것인가는 우리 나라 데이터 기반 개발자들에게 시시하는 바가 클 거라 생각한다.

그리고 행동 경제학 관련해서는 "상식 밖의 경제학"이라는 책이 있다.
특정 상황에서 인간들의 의사결정은 충분히 예측 가능하다라고 이 책에서는 수많은 실험 데이터를 기반으로 이야기 하고 있다. 이 책을 보면서 계속 롱 테일 그래프가 생각 나는 까닭은 무엇일까? ㅎㅎ

여튼 슈퍼 크런처 책은 나로 하여금 데이터 마이닝을 왜 하는지 그리고 그 목적은 무엇이고 어디까지 활용이 가능할지 많은 시사점을 남겨준 책이였다. 그리고 한 분야에서 전문성을 가지기 위해서는 어떤 능력이 필요할지까지 많은 것들을 알려주었다.

사실 지금까지 나의 기술 선호 경향을 되 짚어 보면...
검색엔진이라는 데이터 처리 및 검색을 하는 시스템에 큰 관심과 개발을 해오면서 데이터 저장구조 및 효과적인 search 알고리즘에 대해서 많은 고민을 해왔었다. 그러다, 대량의 데이터를 처리하는데 관심을 가지게 되었고, 그러다 보니 하둡과 그리드 컴퓨팅을 파봤었다.
그러다가 그렇다면 이런 그리드 컴퓨팅을 이용해서 어떻게 해야 정확한 정보를 뽑을 수 있을지에 대해 관심을 가지게 된게 지금까지의 나의 기술 선호 경향들이였다. 

그러니까..

검색 -> 대용량 처리 -> 데이터 마이닝 or 머신러닝 -> 다시 검색....

이러다 보니 현재 데이터 마이닝을 하는데 그리드 시스템을 매번 사용하고 있으며, 그 결과물을 검색 퀄리티 증진에 그대로 사용하고 있다.

사실 데이터 마이닝이 검색 알고리즘의 효율성을 높이는데 사용될 수 있다는 개념을 아는 사람은 그리 많지 않다.
일단 사용자가 사용한다는 것은 어떤 패턴이 있을 가능성이 있다는 것을 의미하기도 한다. 그 패턴을 자세히 파악해 보면 이들을 알고리즘 효율성을 높이는데 아주 유용하게 사용 가능하다.
재밋는 사실은 많은 사람들이 그들 개개인의 행동 패턴이나 생각이 다른 이들과 다른 특별한 점들이 있다고 착각하고 있으나 대부분 80% 이상의 사람들은 놀랄만한 비슷한 패턴으로 행동하곤 한다.
이런 패턴을 읽기 위해 데이터 마이닝이 필요하고... 이를 검색에 적용시켜 검색의 정확도를 높이는 과정을 거치는 것이다.

많은 개발자가 프로그래밍이 재밋다고 한다. 물론 나도 느끼는 바이다. 거의 중독이라고 봐야 겠지..
하지만 데이터 마이닝의 재미는 이와 비교할 수 없는 다른 재미가 있다. 프로그래밍보다 중독성이 훨씬 강한 마약이라고나 할까?

이런 내용을 위 책에서는 수식 하나 사용하지 않으면서(뒷 부분에 확률 이야기가 쬐금 나오긴 하지만) 다양한 예제로 설명하고 있다.





저번에 구현한 EM 알고리즘에 오류가 있어서 수정해봤다.

각 클러스터 중심을 구할 때 k-means 와 비슷하게 아예 확률값이 큰 클러스터에 포인트를 할당해 해당 클러스터 파라메터 계산시에만 확률값을 사용했는데 이런식으로 하면 안되고 한 포인트가 가지는 각 클러스터의 확률값을 가지고 이를 기반으로 각 클러스터 파라메터 재계산을 해야한다.

사실 코딩할 때 애매모호 해서 예전에 들었던 k-means와 거의 비슷하다는 강의록을 기억해 이런식으로 코딩했었다. 하지만 다시 확인해보고 여러 책을 뒤져보니 잘못 코딩한게 명백해졌다.

그래서 코드 수정을 했다.
게다가 k-means와 거의 100% 비슷하다는 언급을 취소하고 약 90%정도 비슷하다 정도로 이야기 하고 싶다.




위 알고리즘을 돌려보면 두 클러스터는 이전 클러스터의 중간값으로 근접해 가고, 나머지 한개의 클러스터는 멀리 떨어진 평균 20을 가지는 점으로 수렴하는걸 볼 수 있다.

세 가지 다른 정규분포에 의해서 나온 점들을 제너레이션 했으나 결국 2개의 클러스터로 클러스터링 되었다는 재밋는 사실을 알 수 있었다.
넘버 제너러이션 시점에서 표준편차를 적은값으로 주면 정확하게 3개의 클러스터로 만들어질 거란  생각을 해본다.







TAG
전문가의 시대, 대용량 데이터의 시대

약 1년 전에 썼던 포스팅의 제목이다.

왜 이 이야기를 하느냐 하면, 이 글과 관련된 책이 지난 3월에 슈퍼크런처라는 제목으로 번역되어 국내에 출간 되었기 때문이다. 사실 이 정보도 오늘 데이터 마이닝 관련 검색을 하다가 알게 되어 바로 퇴근하면서 사와 현재 열독중에 있다.

사실 이 책은 메사추세츠 대학에서 정보검색 관련 공부를 하시는 어떤 블로그 방문자께서 추천해 주셨던 책인데, 그동안 잊고 있다가 오늘에서야 책을 잡고 읽고 있다. 1년전에 이 책을 봤다면 어땠을까 하는 재미있는 상상도 해보지만 지금 읽고 있는 나조차도 정말 흥미 진진하게 읽을 정도다.
이 희열을 비교하자면 처음 링크라는 책을 볼 때와 같다. 그 때 웹과 검색이라는 주제로 공부하고 열심히 일을 시작하던 시점에 매우 흥미롭게 봤던 책이고 지금도 가끔 펼쳐서 봐도 그 책의 가치는 퇴색하지 않았더라..

전에 잠깐 서평을 보고 생각했던 것과는 다르게 책의 내용은 데이터에서 나온 정보가 전문가를 대체한다는 아주 극단적인 의미를 내포하지는 않은거 같다. 그 전문가를 좀더 전문가 답게 만들 수 있는 수단이 바로 데이터 분석이고 데이터 마이닝이라는 것이다.

처음 책에 나오는 내용은 기후변수를 이용해 포도주의 가격을 예측하는 공식이 나온다. 자세한 구현 방식은 나오지 않았지만 수 세기동안의 데이터를 가지고 포도주의 품질과 관련될 만한 속성들을 찾아서 데이터 베이스화 하고 이들중에서 포도주의 품질에 가장 영향을 많이 끼치는 속성을 선별해 이들로 회귀분석을 한게 거의 분명하다.
이 공식이 상당히 정확했다는 이야기도 나오고 그 반면에 포도주 감별사(?)라는 전문가 집단과의 대립 이야기도 나오게 된다.

전에도 블로그에서 이야기 했지만 엔지니어라면 데이터 통계 분석 정도는 봐서 이해할줄 알아야 하고 더 나아가서 통계적 기법으로 뭔가를 증명할줄도 알아야 할듯 하다. 객관적인 통계 분석 결과는 천마디 말보다 더 강력한 의사 소통 수단이 되기도 한다. 영어로 의사소통하는 것도 중요하지만 데이터를 다룬다면 세계 만국의 공통 언어인 통계로 이야기 할 줄 알아야 겠다.

엄청난 데이터가 흘러나오는 때 많은 개발자들이 데이터를 가지고 일을 한다. 그리고 마이닝 방법론으로 나온 결과들을 실제 프로덕트의 알고리즘으로 차용하기도 한다. 그렇다면 엔지니어도 마이닝 프로세스에 대한 이해가 필요하다는 이야기 인데... 이 책에서 이야기 하는 내용도 이와 틀리지 않더라.
전문가들의 식견과 더불어 데이터를 기반으로 그 좀더 문제를 객관적으로 다른 관점으로 볼 수 있는 자세가 필요함을 역설하고 있다.

이 책의 제목 선정 방법도 꽤 넘버 크런칭한 방법인데, 저자가 구글 에드로 "데이터 마이닝"과 "넘버크런칭" 키워드에 결과로 나오는 광고로 "직관의 종말"과 "슈퍼 크런칭" 두 제목으로 노출이 되게 만들었는데, 슈퍼 크런칭 제목 클릭율이 64% 더 높았다고 한다.
책 제목 선정 방법도 참 재미나다. ㅋ

outlier 이후에 아주 재밋는 책을 선택한거 같다.
요즘 책 선정 감이 꽤 좋네.. ㅋ






월간 마이크로소프트웨어의 7,8,9월 연재로 Weka에 대해서 하기로 계획을 올해 초 잡았던 적이 있었는데, 실제 그렇게 집필을 하게 될 듯 하다.

사실 요 집필 계획은 번역하고 있는 collective intelligence in action의 add-on 성격으로 집필 계획을 잡았으나 아직 이책이 현재 퇴고 과정인 관계로, 연재가 더 빠르게 세상이 나오게 될 듯 하다.

3회 연재는 처음인데, 이런 집필 계획을 잡아봤다.

1회 : Weka의 배경. api 및 명령행 명령어 소개,
2회 : Weka GUI 환경 설명, GUI환경을 통한 클러스터링 및 분류 그리고 속성선택 알고리즘 구동. 그리고 그와 관련된 Java 예제 구현(Weka에 포함된 데이터나 외부 데이터를 사용한)
3회 : Weka를 이용한 Machine Learning 실무 프로그램 개발 - 예제는 오류 쿼리 분류기 또는  여타 다른 재미난 예제들...


마지막 회에서 예제를 어떤걸 고를까 굉장히 고민이 된다. 되도록 신기해 보이고, 재미난 실무 예제가 되었으면 좋겠는데.. 아직은 오류 쿼리 분류기가 막 생각난다. 쉽기도 하고 재밋기도 한...
3회에서 욕심은 이 오류 쿼리 분류기를 Lucene 쿼리 프로세스 로직에 붙이는 것으로 마무리 되면 좋겠지만 지면이 날지 모르겠다. 그리고 따로 Lucene을 설명해야 하는 부담감도 있고...쩝..




TAG

Lucene in Action 2nd

루씬 인 액션 2판 출간을 기다리는 중이다.

이 책의 저자중에 한명인 오티스가 자신의 블로그에 40% 할인 코드를 내걸었다. 그것도 이달 말까지 40% 할인이 적용되니 이 책에 관심이 있고 원서를 구매할 의향이 있으신 분들은 이 코드를 통해 구매할는 것도 나쁘지 않을거 같다.

code : lucene40

새롭게 버전업된 루씬에서 지원하는 다양한 검색 기능에 대해서 어떻게 구현이 되었는지 왜 구현이 되었는지 이에 대해서 살펴보는 것만으로도 이 책은 큰 도움이 될 것이다.




Discounted Cumulative Gain

DCG라는 metric은 기존의 precision, recall 기반의 검색엔진 평가 방법으로는 순위에 따른 차별점을 부과하기 힘들다는 판단에 따라 나온 방법이다.
이전에도 언급했지만 50% 이상의 검색 사용자가 검색 결과의 1,2 페이지 정도만 참고한다는 것은 precision, recall 만으로는 정확한 사용자 패턴에 기반한 성능평가를 하기 힘들다는 것을 알 수 있다.

Cumulative Gain

이는 그냥 n개의 검색 결과의 등급을 모두 합한 값이다. 관련성에 따라 3~0 사이의 값을 가진다고 하면 ideal CG와 현재 CG를 기반으로 절대적인 점수를 도출할 수도 있다.

 
사용자 삽입 이미지

예를 들어 첫번째 결과에서 여섯번째 결과까지의 rel 등급이 3,3,2,0,1,2 라고 한다면 CG는 11의 값을 가지게 된다.
이 방법은 실제 검색 결과 위치에 따른 영향을 전혀 받지 않는 방법이다.
ideal CG는 어떻게 될까? 이는 18이 될 것이다.

Discounted Cumulative Gain

이는 실제 검색 결과 순서에 따른 패널티를 적용한 점수값을 도출한다.

사용자 삽입 이미지

에디터가 산정한 rel점수에는 비례하지만 낮은 랭킹의 결과에 대해서 점진적인 패널티를 주기 위해  log 함수를 사용했다.
개인적인 생각으로 log 함수는 80:20 법칙에 가장 잘 맞는 함수라고 생각한다. 예를 들면 검색 결과 1,2위 사이의 간격은 정말 큰 차이지만 999위와 1000위 사이는 log의 값 차이이건 사용자가 느끼는 차이이건 그 차이가 거의 없다.

Normalizing DCG

위 DCG 점수는 현재 검색엔진의 결과의 상태를 보여준다. 그렇다면 가장 이상적인 검색엔진의 점수로 위 점수를 나누어 주면 정규화된  DCG가 나올 것이다.


사용자 삽입 이미지

현재 검색엔진의 순위대로 rel 등급이 3,3,2,0,1,2로 나왔다고 하면 DCG는 아래와 같이 계산될 수 있다.
그리고 이상적인 결과 순위는 3,3,2,2,1 이 될 것이다.

DCG = 3 + (3/log2 + 2/log3 + 0/log4 + 1/log5 + 2/log6) = 5.46

IDCG = 3 + (3/log2 + 2/log3 + 2/log4 + 1/log5) = 5.69

NDCG = 5.46 / 5.68 = 0.95

개인적으로 랭킹관련 평가를 할때 이 log함수를 많이 쓰고 있는데, log n값의 결과가 0이 되는 시기만 조심하면 랭킹관련 문제에서 아주 요긴하게 쓰일 수 있다.



참고문헌 : Search Engines: Information Retrieval in Practice



TAG

웹검색

웹 검색에서는 세가지 종류의 쿼리가 있다고 분류한다.

Informational queries - 말 그대로 특정 정보를 다루는 다양한 토픽을 요구하는 쿼리를 의미한다. "이효리" 쿼리의 경우 상당히 많은 양의 다양한 정보 문서가 나올 것이다. 게다가 경우에 따라서 결과에서 최신성을 중요시 하기도 할 것이다.

Navigational queries - "삼성전자"라는 쿼리에 삼성전자 홈페이지가 연결이 되는게 대부분 맞을 것이다. 대부분 정답이 거의 분명한 쿼리가 이들에 해당된다.

Transactional queries - 사용자 요구가 명확한 쿼리를 의미한다. "파이어폭스 다운로드" 같은 쿼리는 명확히 다운로드 링크를 의미할 것이다.

이들 말고 쿼리를 주제로 분류하기도 한다. 이 쿼리 분류의 문제는 전형적으로 웹 검색 업체의 화두이다. 왜냐면 평균 2.4텀으로 알려진 짧은 쿼리의 의미를 파악하지 못하고서는 제대로된 검색결과를 보기 힘들고 대체 어떠한 쿼리들에서 검색 결과가 잘 나오지 않는지 정의조차 하기 힘들기 때문이다.

웹 검색 쿼리는 아래와 같은 특징이 있다고 알려져 있다.

1. 쿼리의 평균 길이는 2.4 텀이다.
2. 대략 절반의 사용자들인 싱글텀 쿼리를 사용하고 1/3정도의 사용자들이 3개의 텀이나 그 이상의 텀으로 구성된 쿼리를 사용한다.
3. 거의 50%의 사용자가 검색결과의 첫번째 페이지나 두번째 페이지만을 확인한다.
4. 검색 옵션을 사용하는 사용자는 5%도 안된다.
5. 가장 많이 사용되는 top 3 쿼리는 and, of, sex이다.
2005년 발표한 야후의 로그 데이터에서는 33%의 쿼리가 같은 사용자(사용자가 중복해서 쓴)에서 나온 쿼리들이고 이들의 85%의 클릭은 동일한 검색 결과를 클릭하는 것으로 끝났다고 한다. 이 결과는 많은 사용자가 같은 쿼리를 반복해서 사용해서 정보를 다시 찾는다는 것을 의미한다.

쿼리의 분포는 파레토 법칙(Pareto principle)을 따른다. 이는 전체 트레픽의 80%를 빈도수 상위 20%의 쿼리에서 커버하고 있다는 말로 풀어쓸 수 있다. 물론 이 법칙은 다른 경우에서도 적용될 수 있다고 한다.
쿼리가 이 법칙을 따르고 있는 관계로 웹검색 데이터베이스의 티어링을 비슷한 근거로 수행하고 있고 검색 캐싱도 이를 기반으로 구현되기도 한다.




가끔 이 기본중에 기본을 잊는 바람에 한번정도 정리해 보고 싶었던 글이였다. 물론 위키피이어와 iir같은 책에 다 나와 있는 내용이긴 하지만 말이다.





TAG
원래 미드를 잘 안보는데 Numbers라는 미드가 데이터마이닝 기법으로 수사를 하는 그런 드라마라는 이야기를 듣고 요즘 몸 좀 쉬고있는 동안이라 보게 되었다.

사실 이곳에 나오는 데이터를 기반으로 하는 수사기법도 수사기법이지만 찰스라는 주인공이 하는 이야기들과 또 그와 대화하는 교수의 말속에 그냥 지나치기에 힘든 그런 주옥같은 말들이 많이 포함되어 있다는 것을 알 수 있었다. 
사실 수사의 스토리 라인보다는 이들이 하는 이야기가 더 마음에 와 닿는다.

시즌1의 2편 Uncertainty Principle 에서 초반에 범인들의 행동을 예측 할 수 있다는 말에 교수가 충고 한마디 한다.

"Don't mistake the ability to pridict with the ability to control."
예측할 수 있다는 것과 통제할 수 있다는 것은 다르다.

예측의 정확도 만으로 모든걸 거머쥐었다고 착각을 하는 사람들에게 꼭 필요한 말인거 같다.

그리고 2편의 제목인 불확실성의 원리(Uncertainty Principle)는 하이젠버그가 말한 유명한 말인데, 관찰하는 행위가 관찰 대상에 영향을 준다는 원리이다.
이 말은 웹에서만 보더라도 페이지랭크라는 효과적인 링크를 기반으로 하는 랭킹이 나왔지만 이를 이용한 스팸이 성행하는 것을 보면 잘 알 수 있다. 어떻게 관찰하고 있는지 방법을 아는 관찰 대상은 어떻게든지 관찰 결과에 영향을 준다는것...

3편에서는 자신이 뭔가 잘 못 되었다는 알지만 수학적으로는 해를 구한 경우 뭐가 잘 못 되었는지 물어보러 교수를 찾아가는 장면이 나온다.

그런데 결론은 교수의 한마디로 끝난다.

"Go back to the data"
데이터를 다시 살펴봐라.


사실 알고리즘이 맞다고 확신이 선다면 결국엔 데이터에 문제가 있기 마련이니..
결국 모든 마이닝 프로세스는 데이터를 살펴보는것으로 시작되고 또 다시 데이터를 살펴보는 것으로 끝이나는거 같다.

사실 범죄수사에 사용되는 알고리즘의 큰 얼개는 association rule 관련 알고리즘이 대부분일 거라고 생각한다. 여기서 graph를 적용하느나, vector를 적용하느냐의 여러 변형이 있겠지만 계속 보다 보면 굉장히 재미난 알고리즘에 대한 소개가 나올 것으로 기대해 본다.
그러나 이 드라마가 흥미로운건 가장 예측하기 힘들다는 사람의 행동을 예측하는것을 소재로 한다는 건데, 이 때문에 상당히 알아두면 좋은 개념들, 특히 알고리즘을 맹신함으로 빚어지는 다양한 예외 상황이 많이 나오는거 같다.

공부하는 느낌으로 드라마를 본건 처음이고 이 드라마로 조만간 드라마 영어공부를 해볼까도 한다.





TAG
1월달 기고문으로 기고한 클라우드 컴퓨팅 관련 글이다.

기존의 클라우드 컴퓨팅을 어렵게 설명한 문서들을 보면서 약간 쉽게 접근할 수 없을까 고민하면서 써봤다.
이 자료가 클라우드 컴퓨팅을 쉽게 이해할 수 있는데 조금이나마 도움이 되었으면 좋겠다.




랜덤 쿼리 1000개만 뽑아주세요.

요즘 집중하고 있는 일이 몇개 있어서 매우 바쁜데 위와 같은 요청이 들어와서 단순하게 쿼리 각각을 늘어놓고 n번째 쿼리를 뽑아 주면 되겠다 하고 생각을 했었다.

하지만 점심 시간에 밥먹으면서 고민했는데, 우리가 랜덤 샘플링을 하는 이유가 무엇인지 생각을 해봤다. 그것은 바로 모집단의 특징을 알아보기 위해서 샘플링을 하는 것인데, 샘플링은 반드시 모집단의 특징을 띄고 있어야 한다는건 통계학의 기본이다.

그래서 다시 왜 랜덤 쿼리를 뽑는지 물어보고 그 목적에 맞게 잘 뽑아드렸다. (그래서 선택한 방법이 Stratified sampling 방법이 되겠다. )


예를 들어 쿼리를 뽑는다면



랜덤 샘플링을 한다고 하더라도 위와 비슷한 그래프가 샘플링 데이터로도 보여져야 한다.


만일 샘플링을 잘못하면 그 테스트 자체가 무효가 될 수 있고 자칫 헛수고만 할 경우가 많다. 게다가 헛수고를 했다는 사실조차 모른다면 잘못된 정보로 잘못된 정책판단을 하게 되어 버린다.

이 방법은 각 쿼리의 빈도 비율에 비례해서 샘플링을 하는 방법으로 모집단의 특징을 그대로 반영한다. (물론 샘플링 개수가 적다면 위의 경향을 보이기는 힘들것이고 샘플링 개수도 충분히 커여 할 것이다.)

뭐 위키의 예제를 보면 알겠지만 상당히 간단한 방법이고 누구든지 좀더 고민을 하면 비슷한 생각을 할 수 있는 방법이다.

추출 방법을 이야기 하기 보다는 여기서 말하고 싶은것은 특히나 어떤 정책을 결정하는 테스트를 할때 모집단의 특징을 보기 위해 샘플링을 하는데 자칫 랜덤이라는 간단한 의미만을 생각해 잘못 뽑는 과오를 하지 말고 다시한번 생각해서 데이터를 뽑자는 이야기다. (랜덤이라는 말이 마구잡이로 아무 생각없이 그냥 뽑아도 된다는 의미는 아니다.)

내가 데이터를 정확하게 뽑지 못하면 그것에 기반한 정책 자체도 잘못된 방향으로 갈 수 있으니 귀찮더라도 좀더 생각하고 행동에 옮기는게 정말 중요한거 같다는 생각을 해본다.