ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • weka 사용법 - arff 파일 생성 방법 및 오류 설명
    프로그래밍/자연어처리 2016. 2. 13. 22:05
    반응형




    WEKA(Waikato Environment for Knowledge Analysis)는 Waikato 대학교에서 개발한 기계학습 툴로 

    간단한 decision tree, neural network부터 support vector machine등의 

    다양한 기계학습 알고리즘을 제공하고 있다. 

    알고리즘이 달려져도 대부분 동일한 데이터 format을 사용하기 때문에 

    동일한 데이터에 여러 알고리즘을 적용해보고 결과를 비교해보기 편리하여 종종 사용하게 되는 것 같다. 




    다음은 기계학습에 사용할 데이터를 생성해보겠다. 

    weka에서는 arff라는 특정 format의 데이터가 사용되는데 자세한 내용은 아래 웹사이트를 참조한다. 


    참고사이트1 바로가기 http://weka.wikispaces.com/ARFF

    참고사이트2 바로가기 http://weka.wikispaces.com/ARFF+%28book+version%29


    Arff파일은ASCII text file으로 header와 data 두 부분으로 나누어 지는데

    header에는 relation 이름과 각 칼럼의 속성들과 타입들이 명시되고

    data에는 실제 데이터 인스턴스들이 나열되어 있다. 


    arff파일 기본 인코딩이 ASCII이므로 한글 속성 이름 및 데이터 값으로 한글이 지원이 되지 않는 불편함이 있다. 

    UTF-8 인코딩을 사용해야 한다면 ARFF가 아닌 XRFF format으로 데이터를 준비해야한다. 

    XRFF는 XML을 사용한 데이터 파일로 파일 인코딩을 지정하는 것이 가능하다. 


    참고사이트3 바로가기  http://weka.wikispaces.com/XRFF


    아래는 ARFF 파일 작성법을 설명하겠다. 

    기본 데이터 셋으로 들어있는 아이리스 샘플 데이터를 조금 변형해보았다.  


    - Header


    %

    % Title: Iris Plants Database

    %

    @RELATION iris


    @ATTRIBUTE sepallength NUMERIC

    @ATTRIBUTE lcc STRING


    @ATTRIBUTE class {Iris-setosa, Iris-versicolor, Iris-virginica}





    %는 주석을 붙일때 사용한다. 

    @relation은 데이터를 대표하는 이름으로 이름에 공백이 있을 경우 ' ' 를 붙여야한다. 

    @attribute는 각 칼럼의 속성으로 각 속성 타입이 나열되는 순서는 

    데이터에서 컬럼(속성 값)이 나열되는 순서와 동일해야 한다. 


    각 attribute 는 아래와 같이 속성이름 데이터타입 순으로 나열을 한다. 

    속성 이름은 알파벳으로 시작을 해야하며 공백이 있을 경우 전체 이름에 ""를 붙여야 한다. 


    @attribute <attribute-name> <datatype>


    WEKA에서 지원하는 데이터 타입은 아래와 같다. 


    - numeric (integer, real type도 역시 numeric에 속한다)

    - nominal-specification

    - string

    - date [<date-format>]


    NUMERIC 속성 

    - integer, real등 모든 숫자 데이터 


    NOMIINAL 속성 

    - 속성 값으로 정해진 특정 값들만 가질 경우 사용한다. 속성 값들은 { 속성값1, 속성값2, 속성값3, ...}와 같이 나열하며 속성 값에 공백이 있을경우 ' ' 로 감싸야한다.    

    예시 ) 아이리스 데이터 


    @ATTRIBUTE class {iris-setosa, Iris-versicolor, Iris-virginica}



    String 속성

    - 말그대로 문자열을 값으로 가지는 속성 

        @ATTRIBUTE LCC    string


     Date 속성

        @ATTRIBUTE <name> date [<date-format>]

     - name은 속성 이름이고 date-format은 옵션으로 날짜 format 형태를 명시한다. (default: ISO-8601) 

        예시) @ATTRIBUTE datestr DATE yyyy-MM-dd



    - Data 

    실제의 데이터들을 각 속성들을 , 으로 구분하여 하나의 라인으로 입력한다.


    예시 ) 

       @DATA

       5.1,3.5,1.4,0.2,Iris-setosa

       4.9,3.0,1.4,0.2,Iris-setosa

       4.7,3.2,1.3,0.2,Iris-setosa

       4.6,3.1,1.5,0.2,Iris-setosa

       5.0,3.6,1.4,0.2,Iris-setosa

       5.4,3.9,1.7,0.4,Iris-setosa

       4.6,3.4,1.4,0.3,Iris-setosa

       5.0,3.4,1.5,0.2,Iris-setosa

       4.4,2.9,1.4,0.2,Iris-setosa

       4.9,3.1,1.5,0.1,Iris-setosa







    간혹 속성값과 데이터 컬럼 개수가 맞지 않을 경우 아래와 같은 에러가 나올수 있다. 



    Unable to determine as arff (Reason: java.io.IOException: premature end of line, read Token [EOL], line 11.


    You have six attributes, though your data only contains five.


    속성 개수보다 데이터 칼럼 개수가 더 작을때 생기는 오류이다. 


    열 값을 하나하나 비교해보면서 빠진 부분을 찾거나 (에레에 명시된 line값을 참조한다) 

    값에 null 값(빈문자열)이 있을경우 데이터가 없는것으로 간주되어 오류가 나는 것인지 확인해본다. 

    데이터에서 missing value는 빈문자열이 아닌 ?로 채워야 한다. 


    그럼 다음 포스팅에서는 실제 데이터를 기계학습으로 돌려보도록 하겠다. 









     




    728x90
    반응형
Designed by Tistory.