본문 바로가기

기계학습/weka

WEKA를 이용하여 데이터마이닝을 해보자

http://www.cs.waikato.ac.nz/ml/weka/ : WEKA Home
http://www.amazon.com : Data Mining Practical Machine Learning Tools and Technieques
http://sourceforge.net/projects/weka/ : 소스 및 실행파일 다운로드


데이터마이닝 이라고 하면, 너무 어렵고 뭘 해야 할지도 모르겠고, 그래서 일단 제일 만만한 툴킷을 찾아보던 중, 그나마 괜찮은 도구가 있는 것 같아 한번 시작해 보기로 했습니다.

WEKA, for Waikato Environment for Knowledge Analysis
뉴질랜드의 와이카토 대학에서의 기계학습 기법을 이용한 데이터마이닝 프로젝트라고 간략히 설명되어 있구요, 처음에 와이카토라고 해서 일본 대학인가 했습니다만, 뉴질랜드의 지명 이름이기도 하고, 강이름이기도 합니다. 뉴질랜드에서는 지명이름을 뉴질랜드 원주민어인 '마오리어'를 주로 사용한다고 하는군요.

하지만 만만해 보이던 툴킷 조차도 간단히 시작하기는 힘들군요 역시 세상엔 공짜란 없나 봅니다.
일단, 윈도우즈 환경이라면 그다지 고민할 거리는 별로 없겠지만, 리눅스 환경에서는 몇 가지 손을 봐야지 정상적인 구동이 가능할 것 같습니다.

일단 소스포지를 통해서 공개된 메뉴얼을 독파하는 데에도 시간이 걸릴 뿐더러, 빼곡히 차있는 설명들 하나 하나를 이해해 내는 것도 생각보다는 인내심이 필요한 것 같습니다.

일단, 실행 해보기
java -jar weka.jar
하지만, 이렇게 -jar 옵션을 주게되면, mysql 관련 classpath를 찾을 수 없다는 오류메시지를 던지고 그냥 실행은 가능합니다. 원인이 무엇이냐 하면, java에서 -jar 옵션을 주고 실행을 하게되면, 시스템에서 지정하고 있는 환경변수의 CLASSPATH 영향을 받지 못하게 되어 외부 jar 를 별도로 갖고 있는 경우 제대로 사용할 수 없는 문제점이 있습니다. 처음에는 이것 때문에 상당한 삽질을 거듭했습니다. 대신에 -classpath 라는 옵션으로 해결이 가능합니다.

그래서 간단히 weka.sh 파일을 만들어 보았습니다. (붉은색 내용은 한 줄입니다.)
#!/bin/bash
java -Xmx2048m -classpath dist/weka.jar:/usr/local/mysql-jdbc/mysql-connector-java-5.0.8-bin.jar weka.gui.Main
mySQL을 통한 WEKA구동은 다시 자세히 정리해 볼 생각이구요, 일단 구동 후에 샘플 arff 파일을 통하여 일단 돌려볼 수는 있습니다.

ARFF : Attribute-Relation File Format
weka에서 파일로 입출력을 수행할 때에 사용되는 속성과 관계를 설명한 파일포맷입니다.

가장 기본적인 Explorer를 기동하여 샘플로 제공되는 ARFF 파일을 열어 데이터마이닝에서 가장 많이 사용되는 기본적인 방법들인, Classification, Clustering, Association, Selecting Attribute 등을 실험해보실 수 있습니다.

용량이 적은 학습셋인 경우는 크게 문제될 것이 없지만, 학습 instance의 용량이 100m를 초과하는 경우는 대략 메모리의 사용에 제약을 받게되고, 학습 알고리즘에 따라서 heap overflow 오류가 나서 학습과정에서 또는 검증과정에서 프로그램이 종료될 수도 있습니다.

제가 Classification 관련 학습 실험에 대한 경험한 것을 말씀드리면

  1. Instance별 속성이 12가지 종류
  2. Arff 파일의 크기가 대략 100m
  3. Linux Ubuntu
  4. Intel core 2 duo 1.4g
  5. Ram 2g
Explorer를 통해서 초기 데이터 로딩시에는 800~900m 정도의 메모리를 사용하고, Decision Tree를 통한 Classification 과 10-Fold cross validation 수행시에 대략 1.7g 이상을 사용하다가 Heap-overflow로 사망했습니다. 그래서 초기에 샘플링을 통하여 개략적인 데이터의 성격 및 기본적인 알고리즘 테스트를 끝내고, 최종 학습 및 검증은 콘솔을 통해서 작업을 합니다.

참고로 Weka Explorer의 경우 초기에 ARFF 파일을 전부 메모리에 올리고 작업을 수행
합니다. 여러가지 도구들이 제공되는데 물론 Incremental 하게 Learning 할 수 있는 도구도 있는 것 같습니다.

제공되는 샘플 중에 weather.arff 을 사용하여 Decision Tree 중에 C4.5를 WEKA 내에서 구현한 J48 을 사용합니다. 편의상
mySQL 관련 CLASSPATH를 뺐습니다. 물론 모든 작업은 리눅스 환경에서만 실행을 해보았습니다. 윈도우 환경에서는 현재는 다 테스트 해보지는 못할 것 같습니다.

우선 아래와 같이 수행하면,
java -classpath weka.classifiers.trees.J48 -h
관련 실행 옵션이 주루룩 뜨게되는데 필요한 몇 가지만 사용합니다.
실제로 소스를 뜯어 보시면, 1/3이 이러한 외부 인터페이스를 위한 내용과 코멘트들로 이루어져 있군요, 정말 교육용 소프트웨어는 이래야 한다는 생각이 들었습니다.
java -classpath weka.classifiers.trees.J48 -t weather.arff -d weather.model -C 0.25 -M 2
이렇게 실행하게되면, Explorer에서 실행 후에 우측에 나오는 버퍼출력이 콘솔로 출력되고, 학습된 모델은 weather.model로 저장됩니다. 또한 해당 모델을 통하여 새로운 실험용 파일을 실험하는 것도 가능합니다.


Reflection_
글을 다 적고보니, 글을 머릿속으로 정리하는 데에 더 많은 공을 들여야 하겠다는 생각이 들었습니다. 모니터 앞에서 대략 1시간 30분을 투자하고 서도 이렇게 글이 어지럽게 한 눈에 들어오지 않다니... 흠