달력

06

« 2017/06 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
User-based Recommender와 테스트는 같으며, 단지 사용한 ItemSimilarity, GenericItemBasedRecommender 메서드만 다르다.
Fixture Code
	@Before
	public void fixture() throws IOException {
		// row data 100,000
		dataModel = new FileDataModel(new File("C:/Users/yunsunghan/Desktop/data_ml.txt"));
		userId = 303L;
	}

Test Code
	@Test
	public void item() throws IOException, TasteException{
		
		// 1) 원시 데이터를 읽음
		// fixture
		
		// 2) 유사성 상관관계 분석
		ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel); // 너무 느리다.
		// 야생에서는 유사성을 미리 계산해 놓은 형태를 많이 쓴다. 그것이 GenericItemSimilarity 이다.
		// 미리 계산하는 구조는 아래와 같다.
//		List similarities = new ArrayList(4);
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1417, 440, 0.9));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(440, 1128, 0.7));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1128, 1351, 0.5));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1351, 1413, 0.3));
//		ItemSimilarity itemSimilarity = new GenericItemSimilarity(similarities);
//		// 유사도 출력!!!
//		System.out.println("===========================================");
//		System.out.println("Similarity");
//		System.out.println("-------------------------------------------");
//		System.out.println(itemSimilarity.itemSimilarity(1417, 440));
//		System.out.println(itemSimilarity.itemSimilarity(440, 1128));
//		System.out.println(itemSimilarity.itemSimilarity(1128, 1351));
//		System.out.println(itemSimilarity.itemSimilarity(1351, 1413));
//		System.out.println("-------------------------------------------");
//		System.out.println();

		// 3) 사용자 기준의 추천
		Recommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
		// 3.1) 캐시에 넣고
		Recommender cachingRecommender = new CachingRecommender(recommender);
		// 3.2) 특정 사용자 기준의 추천 아이템 추출
		List recommendations = cachingRecommender.recommend(userId, 7);
		
		// 추천 아이템 출력!!!
		System.out.println("==========================================");
		System.out.println(userId + "님이 추천하는 상품 베스트 7 [Item-based]");
		System.out.println("-------------------------------------------");
		int count = 1;
		for(RecommendedItem item : recommendations){
			System.out.println(count + ") 추천 상품 : " + item.getItemID() +" \t 추천 지수 : "+ item.getValue());
			count++;
		}
		System.out.println("-------------------------------------------");
		Assert.assertEquals(7, recommendations.size());
	}

테스트 결과
==========================================
303님이 추천하는 상품 베스트 7 [Item-based]
-------------------------------------------
1) 추천 상품 : 1417   추천 지수 : 2.70215978E16
2) 추천 상품 : 440   추천 지수 : 53.677456
3) 추천 상품 : 1128   추천 지수 : 29.359428
4) 추천 상품 : 1351   추천 지수 : 17.797129
5) 추천 상품 : 1413   추천 지수 : 14.551755
6) 추천 상품 : 863   추천 지수 : 14.285224
7) 추천 상품 : 1170   추천 지수 : 12.785092
-------------------------------------------

==========================================
303님이 추천하는 상품 베스트 7 [Slope-One]
-------------------------------------------
1) 추천 상품 : 1500   추천 지수 : 5.8740354
2) 추천 상품 : 1449   추천 지수 : 5.4110007
3) 추천 상품 : 1398   추천 지수 : 5.388581
4) 추천 상품 : 1467   추천 지수 : 5.356462
5) 추천 상품 : 1642   추천 지수 : 5.2709184
6) 추천 상품 : 1367   추천 지수 : 5.123192
7) 추천 상품 : 1064   추천 지수 : 5.115589
-------------------------------------------

Slope-One Recommender도 크게 다르지 않다.

이쯤되면, 어떻게 User-baesed와 Item-based는 각각 Item에 대해서 또 User에 대해서, 위와 같은 추천지수와 유사지수를 구해 냈을까 궁금하지 않을수 없다. 도대체 무슨 근거로..., 단순히 산술평균은 아니다. 그럼 어떤 보이지 않은 것이 안에 숨어 있을까? 이것이 다음에 정리할 알고리즘을 봐야 할 이유다.
신고
Posted by summerwars

User Based Recommender는 크게 3가지 절차로 이루어진다.  1) 원시 데이터를 읽어 들이고, 2) 데이터로 부터 상관관계(유사성)을 계산하고, 3) 어떤 조건에 맞는 추천을 계산한다. 이때 가장 중요한건 2)번으로 두말할것도 없이 내부적으로 특정 알고리즘이 구현되어 있을 것이다.

아무것도 몰라도 테스트는 할수 있다. 아래와 같이 테스트코드를 작성한다. 데이터 소스는 특별히 구할 길이 없어, GroupLens Research에서 제공하는 데이터를 약간 가공 하였다. 소스코드에 순서별로 주석을 읽어보면 대략 짐작할수 있을 것이다.

	@Test
	public void user() throws  TasteException{
		
		// 1) 원시 데이터를 읽음
		DataModel dataModel = new FileDataModel(new File("C:/Users/yunsunghan/Desktop/data_ml.txt"));
		long userId = 303L;
		
		// 2) 유사성 상관관계 분석
		UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
		// 2.1) 선호도 추론
		userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
		// 2.2) 선호도 기준으로 3명의 이웃 추출
		UserNeighborhood neighberhood = new NearestNUserNeighborhood(3, userSimilarity, dataModel);
		
		// 유사 이웃 출력!!!
		long[] users = neighberhood.getUserNeighborhood(userId);
		System.out.println("===========================================");
		System.out.println(userId + "님과 가까운 이웃 3명은?");
		System.out.println("-------------------------------------------");
		for(int i=0; i < users.length; i++){
			System.out.println("가까운 이웃 :"+users[i]);
		}
		System.out.println("-------------------------------------------");
		System.out.println();
		
		
		// 3) 사용자 기준의 추천
		Recommender recommender = new GenericUserBasedRecommender(dataModel,neighberhood, userSimilarity);
		// 3.1) 캐시에 넣고
		Recommender cachingRecommender = new CachingRecommender(recommender);
		// 3.2) 특정 사용자 기준의 추천 아이템 추출
		List recommendations = cachingRecommender.recommend(userId, 7);
		
		// 추천 아이템 출력!!!
		System.out.println("==========================================");
		System.out.println(userId + "님이 추천하는 상품 베스트 7 [User-based]");
		System.out.println("-------------------------------------------");
		int count = 1;
		for(RecommendedItem item : recommendations){
			System.out.println(count + ") 추천 상품 : " + item.getItemID() +" \t 추천 지수 : "+ item.getValue());
			count++;
		}
		System.out.println("-------------------------------------------");
		Assert.assertEquals(7, recommendations.size());
	}


실행결과는 아래와 같다.

===========================================
35님과 가까운 이웃 3명은?
-------------------------------------------
가까운 이웃 :4
가까운 이웃 :853
가까운 이웃 :510
-------------------------------------------

==========================================
35님이 추천하는 상품 베스트 7 (row data 100,000)
-------------------------------------------
1) 추천 상품 : 292   추천 지수 : 4.0
2) 추천 상품 : 288   추천 지수 : 3.695456
3) 추천 상품 : 299   추천 지수 : 3.528888
4) 추천 상품 : 271   추천 지수 : 3.5083911
5) 추천 상품 : 323   추천 지수 : 3.471112
6) 추천 상품 : 294   추천 지수 : 3.365235
7) 추천 상품 : 324   추천 지수 : 3.148972
-------------------------------------------



사용된 데이터 소스를 첨부한다. 이후, Item-based 와 Slop-One Recommender도 테스트할때 사용할 것이다.


신고
Posted by summerwars

1. 프로젝트 구조
Mahout 소스코드는 SVN으로 관리하고 있다. svn checkout http://svn.apache.org/repos/asf/mahout/trunk mahout/trunk  으로 접속하여 소스코드를 받아 볼수 있다. 프로젝트 구성은 Maven을 이용하고 있고, 서브모듈 프로젝트로 buildtools, eclipse, math, core, taste-web, examples, utils가 있다. 이중 가장 핵심적인것은, core 프로젝트로 각종 알고리즘 구현체가 존재한다. 주요 의존성은, hadoop-core, hbase, lucene-core,lucene-analyzers,watchmaker-framework 등이 있고, 동 프로젝트에 직접적인 의존성 프로젝트는 mahout-math 프로젝트이다.




2. Core 프로젝트

Core 프로젝트는 현재, 다음과 같은 알고리즘을 구현해 놨으며, 점점 추가되고 있다.

Clustering

Classification

Genetic Programming

Decision Forest

Recommendation mining

This package comes with four examples based on netflix data, bookcrossing, grouplens and jester data.


각각의 알고리즘은, mahout-examples 프로젝트에서 테스트 할수 있다. 비주얼한 Recommendation 테스트는 mahout-taste-webapp 서브 프로젝트에서 테스트할수 있다. (참고 : Apache Mahout Taste-Web 설치하기) 앞으로 학습할 기준은 바로 이 알고리즘들을 이해하고, 구현이 어떻게 되었는지 학습하고, 테스트를 통해 성능을 확인할 것이다. 이후 개선점과 야생에서 사용할때 주의점들을 관찰할 것이다.


3. 앞으로의 학습방법

위에 언급된 알고리즘 중 가장 학습곡선이 낮고, 테스트가 용이하며, 흥미를 끌수 있는 녀석을 골라야 한다. 그것으로 부터 학습을 시작하는 것이 좋은 시작일듯 하다. 나는 GA에 관심이 많다. 궁극적으로 그것을 알기 위한 열망이 강한다. 하지만, 바로 접근하지 않고 가장 쉬운 접근인 Recommendation을 시작접으로 할 것이다. 이유는 다행스럽게도 mahout-taste-web 서브 프로젝트가 그것을 쉽게 도와줄 것이라는 희망에서이다. 내가 처음볼 프로젝트는 이프로젝트에서부터 시작이다. taste-web 프로젝트는 core 기능을 실무에서 충분히 활용할수 있을 정도로 확장성을 고려해서 진행중인 프로젝트이다. Mahout을 계속하려면, 이에 대해 좀더 알아볼 필요가 있다.

아래는 mahout-taste-web 프로젝트 구조 화면이다.
(대부분의 구성파일은, Core 프로젝트에 있고, taste-web은 단순히 servlet호출에 관한 3가지 클래스 뿐이다.)
신고
TAG Mahout
Posted by summerwars
2010.08.18 16:45

Apache Mahout 관련 링크 Mahout2010.08.18 16:45

1) Apache Mahout 홈페이지 : http://mahout.apache.org
2) Apache Mahout 구현 알고리즘 : https://cwiki.apache.org/confluence/display/MAHOUT/Algorithms
3) Apache Mahout - Taste Project : http://mahout.apache.org/taste.html (Document PDF버전 다운로드)
4) PT : http://www.slideshare.net/robinanil/oscon-apache-mahout-mammoth-scale-machine-learning
신고
TAG Mahout, taste
Posted by summerwars
2010.08.13 17:54

Apache Mahout Taste-Web 설치하기 Mahout2010.08.13 17:54


이전글에서 했던 환경을 그대로 이용해서, 가상의 데이터를 넣고 추천 테스트를 해보자. 원문 참조는 https://mahout.apache.org/taste.html 에서 볼수 있다.

1. 먼저 사용할 가상의 데이터가 필요한데, 여기 http://www.grouplens.org/node/73 에서 받는다. 원하는 크기를 받아서 하면되는데, 나는 1M Ratings Data Set (.tar.gz) 를 다운 받았다.

2. 압축을 풀면, movies.dat, ratings.dat, users.dat 파일이 있다. 모두 복사해서, /trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens 에붙여 넣는다. (아마, java 소스가 이미 있을 것이다.)

3. trunk 폴더로 이동후 'mvn install' 명령을 실행한다. 


4. 빌드가 성공하면, cd taste-web 이동후, cp ../examples/target/grouplens.jar ./lib 으로 복사한다.

5. 설정파일인, recommender.properties에 방금 생성한 Recommender를 마지막 라인에 추가한다.(만약 지난번에 주석을 풀었다면, 그대로 둔다)

recommender.class=org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommender

6. 현재 폴더인 /trunk/taste-web 에서 패키징 한다. 'mvn package' 빌드가 성공되면 war 파일이 생성된다.

7. 현재 디랙토리에서, war 파일을 실행한다. 'mvn jetty:run-war' 또는 'mvn tomcat:run-war' 으로 실행한다. 성공적으로 실행되었다면, 브라우저에서 http://localhost:8080/mahout-taste-webapp/RecommenderServlet?userID=1&debug=true 를 접근해 본다.


userID 값을 바꿔가며, 확인할수 있다.

9. Next?
아마도 여기까지 했으면, Mahout 환경을 설정하고, 예제를 돌리는 정도로 끝났다. 앞으로 봐야 할것은 본 예제에서 사용된 Recommender는 무엇이 있으며(User-based Recommender, Item-based Recommender, Slope-One Recommender), 사용된 알고리즘은 어떤 것이고, 또 그 알고리즘이 얼마나 우수한 것인지, 더 낳은것은 없는지, 또는 다른 알고리즘은 없는지, 어떤 환경에 어떤것이 더 적합한지, 관련 알고리즘엔 무엇이 있는지 등이 궁굼해 질것이다. 그리고 왜 이따위들이 필요한지도...

문서에 나온 소스를 보니, 알고리즘 이해 없이도 쓸수 있겠끔 잘 만들어진것 같다. 어떤 예측이나 통계적 결과는 적절한 Data 와 적합도를 위한 기준변수 산출이 중요한데, 생각보다 잘 작성되어 진것 같다. 물론 실무에 적용하려면, 이런 여러가지 환경적인 변수를 여러번 테스트해야만 하겠지만, 본 소스는 참조가 많이 될듯...:)

신고
Posted by summerwars
2010.08.13 17:53

Apache Mahout 설치하기 Mahout2010.08.13 17:53

(원문 https://cwiki.apache.org/MAHOUT/quickstart.html를 참조하여 설정하는 과정을 기록했다)

인터넷을 잘 뒤져 보면, 기계학습관련된 알고리즘 구현체가 꽤 많이 있다. 이런 알고리즘은 수학적으로는 이해하기 힘들지 모르지만, 프로그래밍되어 있는건 상대적(?)으로 이해가 쉬운편이다. 아마 수학이라는 또다른 언어를 배우는 과정이 쉽지 않아서 그럴수 있겠다. 어쨌든 오픈소스를 비롯해서 많이 존재 하는데, 그중 하나가 바로 Mahout 프로젝트이다. 굳이 대량의 데이터를 테스트 하지 않더라도, 그 가능성이 가장 좋아 보여서 이걸로 테스트 하기로 했다.


1. 환경 설정하기

1.1 기본 빌드 환경 : JDK1.6 + Maven 2.0.9 이상

1.2 Subversion에서 소스 체크아웃 받기
     - svn co http://svn.apache.org/repos/asf/mahout/trunk
     - 또는 릴리즈 버전 받기(http://www.apache.org/dyn/closer.cgi/mahout/) 

1.3 컴파일 : mvn install
여기서 주의할께 있다. 반약 윈도우를 사용해서 설치한다면, 도스창에서 메이븐 명령을 실행할텐데, 이럴경우 대부분 에러를 발생시킨다. 이놈도 결국 Cygwin를 통해서 설치해야 한다. (이부분이 까다롭다고 나와 있는데, 난 언제 설치했는지 모를 Cygwin이 있어서 그냥 잘 설치할수 있었다. 메뉴얼엔 이것저것를 참조해서 Cygwin를 설치하라고 나왔는데, 차라리 구글링해서, 한글문서를 참조하는게 좋을수도 있겠다.)  


또한, 윈도우 계정에 특수문자(공백같은)가 있어도 오류를 발생시킬수 있다고 한다.(나는 다행히 없었다.) 여기까지 되었다면, Mahout Core와 몇가지 예제를 빌드할 준비가 잘된 것이다. 이제 Core와 예제들을 빌드해 보자.

1.4 Install Core
core 디렉토리로 이동 후, mvn compile (compile 대신 mvn install 해도 된단다.)

1.5 Compile Examples
examples 디렉토리 이동 후, mvn compile (반드시 '14번 Install Core'을 해야 메이븐 모듈 의존성이 인식된다)

1.6 Compile Taste Web(Taste는 일종의 예제 프로젝트)
taste-web 디렉토리 이동 후, recommender.properties 파일 제일 하단에 주석을 하나 풀어라, (아마도 추천자(Recommender.java)클래스를 구현 했다면, 해당 클래스를 연결시키면 될것이지만, 지금은 구현한게 없으니, 예제 것을 그대로 쓴다.) 그리고, mvn package를 실행한다.

그러니까, 앞으로 구현체를 만들어 jar로 lib 디랙토리에 추가하고, recommender.properties에 한줄 추가해주고, mvn package를 실행하면, war로 빌들되어 테스트해볼수 있다는 말이 된다.


2. 예제실행하기

이미 빌드된 taste-web의 target 디렉토리에 mahout-taste-webapp-0.4-SNAPSHOT.war라는 war파일이 생성되어 있고, 적당한 서버(tomcat 같은)에 넣어서 예제를 실행시켜 볼수 있다. 아마 위와 같이 따라 했아면, http://localhost:8080/mahout/RecommenderService.jws 으로 접근할수 있다. WSDL 형태로, Recommender를 학습시키고, 그 결과를 볼수 있는 것 속성들로 구성되어 있다.(mvn jetty:run-war 또는 mvn tomcat:run-war 해도 된다)



3. 이클립스로 보기

체크아웃 받은 /trunk를 이클립스에서 Import 시키면 간단히 이클립스에서 볼수 있다.


4. Next?

https://cwiki.apache.org/MAHOUT/quickstart.html 에 보면, 각종 알고리즘을 구현한 예제와 Tip들이 있다. 내가 관심 있는 GA는 구현된것 같은데 예제엔 없는것 같다. https://cwiki.apache.org/confluence/display/MAHOUT/Algorithms 를 보면, EA와 GA에 대해서 개발중에 있고, SVM도 보인다, 관련 문서가 빈약하긴 한데, 있는것만으로도 감지덕지다. 관련해서 https://cwiki.apache.org/MAHOUT/mahout-wiki.html 를 보면, 읽을만한게 꽤 있다. 관심있으면, 봐 두자.

신고
TAG Mahout, 설치
Posted by summerwars


티스토리 툴바