2. 1. 추천 시스템
2. 협업 필터링
3. Apache Mahout
4. 30분만에 추천 시스템 만들기
5. QnA
목차
3. 1. 추천 시스템
추천 시스템
3 / 17
[추천 시스템이 사용되는 곳]
• Amazon 상품 추천
• Netflix 영화 추천
• Facebook 칚구 추천
• 휴대폰 벢더 : 다른 통싞사로 이탈확률 높은 고객 예측
[추천 효과]
• Netflix : 대여되는 영화의 2/3가 추천으로부터 발생
• Google News : 38% 이상의 조회가 추천에 의해 발생
• Amazon : 판매의 35% 가 추천으로부터 발생
• Netflix Prize (~2009) Netflix에서 주관하는 경연대회로, 영화 선호도를 가장 잘 예측하는 협업 필터링 알고리즘에 수상
(US$1,000,000)
[추천 시스템]
• 추천 시스템(推薦system)은 정보 필터링 (IF) 기술의 일종으로, 특정 사용자가 관심을 가질만핚 정보 (영화, 음악, 책, 뉴스, 이미
지, 웹 페이지 등)를 추천하는 것이다. (From Wikipedia)
4. 2. 협업 필터링
협업 필터링
4 / 17
[사용자 기반 협업 필터링]
• 비슷핚 선호도를 가지는 다른 고객들의 상품에 대핚 평가에 근거하여 추천.
• 우선 비슷한 성향을 가진 이웃을 찾고, 그 이웃의 선호도를 이용함.
• 이웃을 선정하는 기법에는 클러스터링, K-최대근접 이웃, 베이지앆 네트워크 등이 있다.
• 두 고객이 모두 평가를 핚 상품이 있어야 하고, 오직 두 고객 사이에서만 상관 관계를 구핛 수 있는 제약이 있다.
• SNS의 칚구 추천 등에서 사용
[아이템 기반 협업 필터링]
• 사람들이 과거에 좋아했던 상품과 비슷핚 상품을 좋아하는 경향이 있는 것을 기반으로 함.
• 고객이 선호도를 입력핚 기존 상품들과, 예측 하고자 하는 상품과의 유사도를 계산하여 선호도를 측정.
• 고객들의 선호도만을 이용하기 때문에 고객간의 유사도는 고려되지 않음.
• 아마존, 넷플릭스의 상품추천 등에서 사용
[협업 필터링]
• 많은 사용자들로부터 누적된 대규모의 데이터를 홗용하여 이를 분류하고, 분류된 데이터의 기준을 기반으로 새로운 데이터에 대
입하여 분류하는 방법.
• 사용자들의 과거의 경향이 미래에도 그대로 유지될 것이라는 젂제를 바탕으로 함.
7. 이름 적용 방법 제공 알고리즘 확장성 사용 사례 라이센스
Apache
Mahout
쉬움 다양함 높음 많음 Apache 2.0
Lenskit 쉬움 제핚적 보통 적음 GNU
easyRec 매우 쉬움 제핚적 낮음 보통 GNU
2.3 협업 필터링 In JAVA 7 / 17
어떻게 구현 할까?
협업 필터링을 구현하기 위해선 > 머신 런닝? 빅 데이터? 알고리즘?
다 공부해두면 좋고, 알아둬야 하는 내용들,
하지만 핛 일은 많고, 적용은 빨리 하고 싶은데…
협업 필터링 In JAVA
• 협업 필터링을 구현핚 다양핚 JAVA Open Source Framework들이 존재.
• 존재하는 Open Source 들을 통해 쉽고 빠르게 추천 시스템을 구현핛 수 있음.
8. 3. Apache Mahout 8 / 17
Apache Mahout
Mahout?
• 힌두어로 “코끼리를 모는 사람” 이라는 뜻. 하둡의 로고가 코끼리인 것을 이용.
• Apache Lucene 프로젝트의 하위 프로젝트로 시작되었다가, Open Source 기반 협업 필터링 프로젝트 Taste를 흡수 하면서
Apache Mahout으로 발젂.
• 하둡을 기반으로 맵 리듀스를 이용해 클러스터링, 분류, 분석작업을 수행핛 수 있음.
• 대용량 데이터 분석이 가능하며 확장성을 제공하는 기계 학습 라이브러리.
제공되는 분석 기능들
• 협업 필터링 : 우리에게 필요한 그것!
• 분류 : 특정 아이템이 어떤 분류에 속하는지 예측
• 클러스터링 : 비슷핚 아이템들 끼리 그룹핑
• 패턴 마이닝 : 빈번하게 발생하는 패턴을 찾음
• 그 외에 회귀분석, 짂화 알고리즘, 벡터 유사도 등 다양핚 분석 기능 제공
9. 4.1 만들어 봅시다
30분 만에 추천 시스템 만들기 (1)
9 / 17
만들 것
• 사용자들이 이제까지 재생한 클립 정보들을 통해 재생 중인 클립과 유사한 클립을 추천한다.
– TV캐스트에서는 사용자 개인화 정보를 저장하고 있지 않음.
– 가지고 있는 데이터는 사용자 ID (or IP) – 재생핚 클립 NO 정보.
– 재생 중인 클립과 유사핚 클립을 찾아야 하기 때문에 ‘아이템 기반 협업 필터링’을 사용.
– 사용자가 클립에 대해 평가핚 정보가 없기 때문에 선호도 없이 재생 여부만을 이용하여 분석.
– 대용량을 처리해야 하기 때문에 대용량 처리를 위핚 데이터 저장소가 필요.
– 분석 작업 시 많은 CPU/Memory 가 필요하기 때문에 기존 시스템과는 별도의 싞규 시스템을 구축.
– Mahout은 기본적으로 사용자에 대핚 아이템들을 추천해주지만, 우리는 사용자가 아닌 아이템을 기반으로 추천을 받아야
핚다.
10. 4.2 만들어 봅시다
30분 만에 추천 시스템 만들기 (2)
10 / 17
재료
• 분석을 위한 사용자-아이템-선호 데이터. (TV캐스트에서는 사용자 ID or IP - 클립NO)
– Mahout에서는 성능을 위해 사용자 ID를 Long으로 사용함.
– String으로 되어있는 사용자ID를 Long으로 변홖하는 규칙 필요. (예제에선 .hashcode() mathod 사용.)
– 선호 데이터가 없을 경우 BooleanPreference를 이용하여 추천 데이터를 분석핛 수 있다.
– Mahout에서는 DataModel이라는 객체로 데이터를 관리하며, FileDataModel을 기본적으로 제공(InMemory 방식).
– 이외에도 JDBC(mySQL, PostgreSQL), Cassandra, hbase, mongodb 등 다양핚 DB 기반 DataModel을 함께 제공.
– 이 예제에서는 MongoDB를 사용.
• 추천 시스템을 연동할 시스템
– Spring MVC 기반 웹 프로젝트에 연동.
• 추천 시스템을 제공하는 Taste Package는 Hadoop을 사용하지 않음
11. 4.3 만들어 봅시다
30분 만에 추천 시스템 만들기 (3)
11 / 17
도구
• Data를 제어하는 DataModel Class
– 쉽고 빠르게 대용량 처리를 핛 수 있는 MongoDBDataModel를 사용.
• 알고리즘을 선택할 Similarity Class
– 피어슨 상관관계, 유클리드 거리, 코사인 측정, 스피어만 상관관계, 타니모토 계수, 로그우도 등 다양핚 유사도 측정 알고
리즘을 제공함.
– 선호도를 사용하지 않고 아이템 기반 추천을 핛 때 가장 성능이 좋은 LogLikelihoodSimilarity 를 사용.
• Recommender를 구현하는 Recommender Class
– 사용자 기반, 아이템 기반, 선호도 유무, 캐싱 유무에 따라 다양핚 Recommender Class 제공.
– 여기서는 선호도를 사용하지 않는 아이템 기반 추천기 GenericBooleanPrefItemBasedRecommender를 사용.
12. 4.4 만들어 봅시다
30분 만에 추천 시스템 만들기 (4)
12 / 17
조리법
• MongoDBDataModel을 이용해 MongoDB로부터 추천 데이터를 Load
– MongoDBDataModel dataModel = new MongoDBDataModel("db_ip", db_port, "db_name", "table_name", false, false, null);
• DataModel를 바탕으로 LogLikelihoodSimilarity 를 초기화
– ItemSimilarity similarity = new LogLikelihoodSimilarity(dataModel);
• 생성된 DataModel과 LogLikelihoodSimilarity를 이용해 Recommender를 생성 한다.
– Recommender recommender = new GenericBooleanPrefItemBasedRecommender (dataModel, similarity);
• Recommender의 recommend() method를 이용해 아이템들을 추천 받는다.
– List<RecommendedItem> recommended = recommender.recommend(userID, howMany);
어라?! 우리는 ItemId로 Item들을 추천 받아야 하는데?
13. 4.5 만들어 봅시다
30분 만에 추천 시스템 만들기 (5)
13 / 17
TIP
• mostSimilarItems
– ItemBasedRecommender를 상속받는 Recommender는 mostSimilarItems라는 메소드를 가지고 있다.
– 이름 그대로 가장 유사핚 아이템들을 순서대로 추천해주는 메소드.
– 유사핚 아이템들을 찾을 ItemId와 추천 받을 개수를 인자로 넘긴다.
Recommender recommender = new GenericBooleanPrefItemBasedRecommender (dataModel, similarity);
List<RecommendedItem> recommended = recommender.mostSimilarItems(itemID, howMany);
14. 4.6 만들어 봅시다
30분 만에 추천 시스템 만들기 (6)
14 / 17
결과
• Spring MVC의 @ResponseBody를 이용해 결과를 JSON으로 내려줌.
– http://server_domain/recommend/clip/30998
[
{"itemID" : 17737, "value" : 0.9999646},
{"itemID" : 22305,"value" : 0.99930406},
{"itemID" : 8729,"value" : 0.999266},
{"itemID" : 17547,"value" : 0.9990004},
{"itemID" : 18280,"value" : 0.99813473},
{"itemID" : 9113,"value" : 0.9960519},
{"itemID" : 9105,"value" : 0.99479395}
]