기계학습으로 아파트 가격을 예측하는 서비스를 소개합니다.







안녕하세요. 저희는 스타트업 로보리포트 팀입니다. 


저희 팀에서 이번에 부동산 분석 리포트 서비스를 시작하였습니다. 


앞으로 차례대로 선 보여드릴 서비스 중에서 

오늘은 부동산 신호등 서비스를 소개합니다. 


지금이 집을 사기에 팔기에 적합한 시기인지 고민하시는 분들

전세를 연장해야 할지, 실거주용 집을 살까 고민하시는 분들이

결정을 내릴 때 참고가 될 만한 서비스입니다. 



서비스 링크 바로가기 




 








현재는 서울 지역 아파트 분석만 서비스하고 있지만

곧 전국으로 분석 범위를 넓힐 예정입니다 : )


부동산 신호등은  과거 10년동안 서울 전 지역 아파트들의 실거래매매 정보와 

아파트들의 주요 특성, 지역 정보들을 기계 학습하여 

현재 지역들이 고평가, 적정가, 저평가 되었는지 한 눈에 볼수 있게 

지도로 보여주는 서비스입니다. 






붉은 색이 진할수록 현재 아파트 가격이 고평가 되었다는 의미이고 

녹색이 진할수록 현재 지역이 저평가 되었다는 의미입니다. 


신호등에서 붉은 색일 때 멈추고 파란 색일 때 건너는 것과 

같은 의미로 색을 지정하였습니다 ^^






지도에서 송파구 가락동을 선택했을 경우 

해당 지역의 개별 아파트 예측으로 이동합니다. 


현재 매매가와 예측값이 아파트 매물 별로 확인이 가능합니다. 

참고로 개별 아파트 예측은 지난 달에 실거래가 매매가 있었으며 

최근 일년내에 같은 아파트, 같은 평수의 아파트의 매매가 있었던 매물만을 

대상으로 합니다!







해당 지역에 부동산 관련 호재 키워드가 있을 경우 

이 지역 주요 기사 키워드 섹션에서 확인이 가능합니다. 

이 서비스는 시범적으로 몇 개 지역만 대상으로 시행하고 있고 

곧 해당 지역을 늘릴 예정입니다!



 



현재 서비스는 시범 테스트 중으로 한달 동안 피드백을 받고 보강하여 

정식 서비스를 오픈하려고 합니다. 


사용하시다가 불편한 점이나 추가했으면 하는 기능이 있으면 

아래 피드백 섹션에 의견 부탁드립니다. 


건의 하신 부분은 최대한 빠르게 반영하려고 하니 

많은 피드백 부탁드립니다!





 






weka 메모리 사이즈 증가하기 ( Java heap space 오류 관련)





weka를 사용할 때 간혹 아래와 같은 java heap space 에러가 나는 경우가 있다. 


에러가 없더라도 데이터 사이즈가 큰 경우 메모리는 충분한 사이즈로 세팅하는 것이 좋다. 


java.lang.OutOfMemoryError: Java heap space

        sun.awt.image.ImageRepresentation.setPixels(Unknown Source)

        sun.awt.image.ImageDecoder.setPixels(Unknown Source)

        sun.awt.image.GifImageDecoder.sendPixels(Unknown Source)

        sun.awt.image.GifImageDecoder.parseImage(Native Method)

        sun.awt.image.GifImageDecoder.readImage(Unknown Source)

        sun.awt.image.GifImageDecoder.produceImage(Unknown Source)

        sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)

        sun.awt.image.ImageFetcher.fetchloop(Unknown Source)

        sun.awt.image.ImageFetcher.run(Unknown Source)

...




윈도우에서 weka gui로 사용할 때 아래 설명과 같이 버전에 따라 메모리 설정 방법이 다르다. 




Notes on Windows (RunWeka.bat, RunWeka.ini):
The heap size can be changed by editing one of the files RunWeka.bat or RunWeka.ini, located in the Weka directory (e.g., C:\Program Files\Weka-3-4 for version 3.4.x), or by modifying the shortcut parameters. The following will describe which change to make, based on Weka version.
  • <= 3.5.2/<= 3.4.7
    Edit RunWeka.bat.
  • 3.5.3/3.4.8
    Weka comes with two shortcuts in the Windows Start Menu. Only the one with (console) in its name executes the RunWeka.bat batch file. If you use this shortcut to start Weka, increase the heap size in the batch file. The other shortcut starts Weka directly, avoiding the command prompt. If you use this shortcut, you must edit the parameters specified in the "Target" field for the shortcut in order to increase the memory.
  • >= 3.5.4/>= 3.4.9
    Modify the maxheap parameter in the RunWeka.ini file.




현재 버전이 3.8.12 이라서  RunWeka.ini 파일을 아래와 같이 수정했다. 




# placeholders ("#bla#" in command gets replaced with content of key "bla")

# Note: "#wekajar#" gets replaced by the launcher class, since that jar gets

#       provided as parameter

maxheap=1024M

->

maxheap=4096M






참고로 리눅스에서 command line에서 사용할 때는 아래와 같이 -Xmx 옵션으로 메모리 사이즈를 설명해 주면 된다. 




java -Xmx10240m -cp /home/weka-3-7-13/weka.jar weka.classifiers.functions.MultilayerPerceptron -T ${arffdir}/testdata.arff -c first -l ${modeldir}/mlp-mid.model -p 5-6 &> ${resultdir}/test.out







참고: 


http://weka.wikispaces.com/OutOfMemoryException


http://weka.wikispaces.com/Java+Virtual+Machine







weka 사용법 - arff 파일 생성 방법 및 오류 설명




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는 빈문자열이 아닌 ?로 채워야 한다. 


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









 




주가예측어플 - 핑거스탁




Finger Stock은 기계 학습을 사용하여 주가 예측을 하는 어플리케이션이다.

사용하는 feature나 기계학습 알고리즘이 다르긴 하지만 

지금 개발중인 어플 역시 기계 학습을 사용하여 주가 예측을 하는 어플이기 때문에 

참고용으로 기록해둔다. 



주가 예측 기간 : 5일후의 주가 예측

사용 알고리즘: SVM, MARS, NN

사용 feature: ATR, SMI, ADX, EMV, MACD, SAR

전체 예측 정확도: 공개하지 않음 

(개별 종목의 예측 정확도는 공개, 각 종목별로 훈련 및 테스트 하는듯)

기계학습기간:2012년 12월~ 2015년 1월 (대략 2년)


기계학습기간이 조금 예전이고 예측만 업데이트되고 있어  

이제는 유지보수만 하는 듯 하다. 



아래는 어플의 메인화면이다. 

전체 회사의 기계학습별 예측 주가등락률을 보거나 

종목을 즐겨찾기 하여 예측 결과를 확인할 수 있다. 






예측에 사용하는 알고리즘에 대한 설명은 아래와 같다. 






메인에서 회사이름을 누르면 더 자세한 예측 결과를 보여주고 있다. 

아래 한국사이버결제와 지스마트글로벌은 같은 SVM을 예측 알고리즘을 사용하지만

기계학습 예측정확도와 기계학습에 사용한 자료가 다른 것으로 보아 

회사별로 다른 예측 알고리즘을 사용한 것으로 보인다. 







마지막으로 사용한 feature들에 대한 설명이다. 







weka 사용법 - weka 설치



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

간단한 decision tree, neural network부터 support vector machine등의 다양한 기계학습 알고리즘을 제공하고 있다. 

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

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


일단 아래 사이트에서 WEKA를 다운받아보자. 


웹사이트 : http://www.cs.waikato.ac.nz/ml/weka/

다운로드 사이트: http://www.cs.waikato.ac.nz/ml/weka/downloading.html


자신의 개발환경에 맞는 실행파일을 다운로드 한다. 

실행파일은 아래와 같이 jre 포함되어 있는 버전과 standalone 버전으로 2개가 있다. 




처음에 JRE 없는 버전을 (weka-3-6-12-x64.exe) 설치하고 실험하려고 하는데 아래와 같이 실험 중간에 멈추는 현상이 발생하였다. 



로그 오류 메세지와 설정 파일을 보니 weka에서 JRE1.8을 사용하고 있는 것을 알 수 있다. 

지금 컴퓨터에 깔려있는 자바 버전이 WEKA에서 사용하는 JRE1.7버전보다 새 버전이라 오류가 난 것 같아 

다시 weka3-6-12jre-x64.exe(JRE포함버전)을 다운받아 설치하였다. 




Exception in thread "Thread-12" java.lang.InternalError: java.io.FileNotFoundException: \C:\Program Files\Java\jre1.8.0_25\lib\ext\sunec.jar

sun.misc.URLClassPath$JarLoader.getResource(Unknown Source)

sun.misc.URLClassPath.getResource(Unknown Source)

java.net.URLClassLoader$1.run(Unknown Source)

java.net.URLClassLoader$1.run(Unknown Source)

java.security.AccessController.doPrivileged(Native Method)






설치방법은 간단하여 대부분 Next만 누르면 되지만 중간에 Install JRE 체크되어 있던 것은 지우지 않도록 한다. 


기본 설치 디렉토리 : C:\Program Files\Weka-3-6

데이터 샘플 디렉토리 : C:\Program Files\Weka-3-6\data 





이 옵션이 선택되어 있으면 아래와 같이 자바를 설치하게 된다. 








설치완료후 다시 weka를 실행하니 문제없이 classifier로 실험을 할 수 있었다.

 

한줄 요약) 

자바 버전 호환성 이슈가 있을 수 있으니 가능하면 JRE 포함 버전을 설치하자. 


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