아파치 머하웃(Apache Mahout)
아파치 머하웃(Apache Mahout)이라는 프로젝트를 최근에 알게 됐습니다. 실제 개발이 시작된건 2011년처럼 보이는데 2015년 4월 11일 0.10.0 버전이 릴리즈 됐습니다. [출처] https://mahout.apache.org/
머하웃?(Mahout?)
머하웃(Mahout)이라는 단어는 코끼리 조련사라는 뜻을 가지고 있습니다. 코끼리라는 말로 봐서 이 프로젝트 역시 Hadoop에서 파생된것으로 볼 수 있겠네요. 위키피디아에서는 다음처럼 소개하고 있습니다.
Apache Mahout is a project of the Apache Software Foundation to produce free implementations of distributed or otherwise scalable machine learning algorithms focused primarily in the areas of collaborative filtering, clustering and classification.
Wikipedia - Apache Mahout
아파치 머하웃은 협력 필터링, 클러스터링, 분류에 주로 촛점을 맞춘 분산 처리 및 확장 가능한 기계 학습 알고리즘의 자유 구현을 만들기 위한 아파치 소프트웨어 재단의 프로젝트입니다.
기계 학습이라는 말을 봐서는 데이터셋을 넣어 학습을 시킨 후 추후 input데이터를 넣었을때 output을 도출해주는 프로젝트로 보이네요.
0.10.0 버전 동향
공식 웹사이트에서 2015년 4월 11일 0.10.0 버전을 릴리즈 했습니다. 그리고 새로운 계산 환경인 Samsara를 발표했네요. 이것을 기반으로 한 알고리즘도 많아 보입니다. 머하웃 알고리즘은 머하웃-삼사라(Mahout-Samsara)의 속도를 위한 새로 작성한 것을 포함하고 있다고 합니다.
Scala, R, Spark Cluster 등에서 사용가능한 것으로 보이는데 어떤식으로 사용할 수 있는지는 조금 더 검토를 해봐야 할 것 같네요.
머하웃 설치(Install Mahout)
실제로 설치를 한번 진행해 봅니다. 해당 내용은 공식 웹사이트 - 다운로드부분을 참조했습니다. 설치 환경은 CentOS 6.4입니다.
소스 코드 내려받기
다음과 같은 커맨드로 현재 스냅샷의 소스 코드를 다운로드 받을 수 있습니다.
$ git clone https://github.com/apache/mahout.git mahout
커맨드 실행시 다음처럼 나옵니다.
Initialized empty Git repository in /home/dev/mahout/.git/ remote: Counting objects: 82377, done. remote: Compressing objects: 100% (62/62), done. remote: Total 82377 (delta 23), reused 0 (delta 0), pack-reused 82294 Receiving objects: 100% (82377/82377), 39.90 MiB | 294 KiB/s, done. Resolving deltas: 100% (44182/44182), done.
환경 구성
해당 리눅스 계정의 ~/.bashrc 파일에 설정을 해줘야 합니다. 맥 사용자라면 ~/.bash_profile 파일을 바꿔야겠네요.
export MAHOUT_HOME=/path/to/mahout export MAHOUT_LOCAL=true # for running standalone on your dev machine, # unset MAHOUT_LOCAL for running on a cluster
MAHOUT_HOME에 방금 설치한 mahout의 디렉토리를 잡아주신 뒤 MAHOUT_LOCAL값을 true로 바꿔줍니다. 해당 값은 standalone방식으로 실행하기 위한 것입니다. 클러스터로 동작시키려면 해당 값은 삭제해주세요. 그리고 또한 스파크(Spark)를 실행 중이라면 $SPARK_HOME을 잡아줍니다. 물론 $JAVA_HOME으로 자바 실행 위치도 잡아주세요.
머하웃 라이브러리
머하웃을 라이브러리 용도로 사용하고자 한다면 Maven을 이용하거나 Gradle을 이용해 사용할 수 있습니다. 아래의 링크를 클릭하세요. {=[출처] Using Mahout as a Library
실제로 프로젝트를 구성할때 Gradle을 사용한다면 다음과 같은 부분을 build.gradle 파일에 넣어주세요.
compile("org.apache.mahout:mahout-hdfs:0.10.0") compile("org.apache.mahout:mahout-math:0.10.0") compile("org.apache.mahout:mahout-core:0.9")
예제를 돌려봅시다.
머하웃 라이브러리를 이용해서 간단하게 예제를 만들어 봅시다. 해당 부분은 Creating a User-Based Recommender in 5 minutes부분을 참조합시다. :)
실제로 돌려 봤습니다. 코드는 다음처럼 작성했습니다. 데이터셋은 DataSet을 참조하세요. 해당 데이터셋의 구조는 ID,아이템ID,추천점수 순입니다.
public class Test { public static void main(String[] args) throws IOException, TasteException { DataModel model = new FileDataModel(new File("data.csv")); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, model); UserBasedRecommender recommender = new GenericUserBasedRecommender( model, neighborhood, similarity); List<RecommendedItem> recommendations = recommender.recommend(2, 3); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); } } }
결과는 아래처럼 나왔습니다.
RecommendedItem[item:12, value:4.8328104] RecommendedItem[item:13, value:4.6656213] RecommendedItem[item:14, value:4.331242]
ID가 2번인 사람에게 3개의 아이템을 추천하라고 했는데 12,13,14번 아이템을 추천을 해준것으로 보입니다.
유사(Similarity)
2015.04.28 유사라는 것은 무언가와 비교할 때 비슷하다는 개념이죠. 머하웃에서의 유사는 두 종류가 존재합니다. 바로 사용자 유사(UserSimilarity)와 아이템 유사(ItemSimilarity)입니다. 이 두 가지는 다른 접근을 합니다.
2015.04.28 먼저 사용자 유사는 두 사용자 간의 유사한 정도를 측정하고 이것을 지표로 삼는것입니다. 추천 엔진에서 매우 중요한 부분입니다. 반대로 아이템 유사는 아이템 간의 유사한 정도를 측정해 지표로 삼는 방식입니다.
추천기(Recommender)
2015.04.28 머하웃에는 기본적인 두 종류의 추천기가 있습니다. 사용자 기반 추천기(User-based Recommender)와 아이템 기반 추천기(Item-based Recommender)가 그것입니다.
2015.07.03 보다 자세한 내용을 원한다면 Mahout Overview 항목을 참조하세요.
사용자 기반 추천기(User-based Recommender)
2015.04.28 사용자 기반 추천기는 기본적입니다. 데이터가 꼬여있거나, 조그만 볼륨의 데이터 셋에 알맞고 빠른 추천 시스템이 필수적이지 않다면 좋은 생산성을 보여줍니다.
2015.04.28 예를 들자면, A라는 사람과 B라는 사람이 있을 때 A는 a,b,c를 좋아하고 B는 b,c를 좋아한다고 하면 A와 B는 공통적으로 b,c를 좋아하니 유사도가 높다고 판단하고 A의 a를 B에게 추천을 해주는것 정도로 이해하면 될 것 같습니다.
아이템 기반 추천기(Item-based Recommender)
2015.04.28 아이템 기반 추천기는 사용자가 아닌 아이템의 유사한 정도를 지표로 삼는 추천기입니다. 다만 사용자 간의 유사성보단 아이템 간의 유사성이 더 고정되어 있습니다. 따라서 큰 볼륨의 데이터 셋에 알맞고 미리 계산할 수도 있습니다.
2015.04.28 예를 들자면, A부터 D까지의 아이템이 있는데, A와 B가 같은 카테고리고 C와 D가 같은 카테고리라고 가정한다면 어떤 사용자가 A를 좋아한다고 할 때 같은 카테고리 아이템인 B를 추천해 준다는 것 정도로 이해하면 될 것 같습니다.
Closing Remarks
조금 더 검토를 해서 포스팅에 추가해야겠네요. :)