Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Regression

이제 본격적으로 머신러닝을 학습한다. 지금 시점에서는 Scikit-Learn이 설치됐어야 한다. 아직 설치하지 않았다면 Pandas와 matplotlib를 설치해야 한다. 아직 설치하지 않았다면 아래와 과정을 따르자.
pip install numpy
pip install scipy
pip install scikit-learn
pip install matplotlib
pip install pandas
  • numpy : 파이썬 프로그래밍 언어를 위한 라이브러리로 다차원배열과 행렬처리를 위해서 사용한다.
  • scipy : 과학 및 기술 컴퓨팅에 사용하는 오픈소스 파이썬 라이브러리다. 선형 대수학, 이미지 처리, 보간(Interpolation), 최적화(optimization), 통계, 물리및 수학 함수를 제공한다.
  • scikit-learn : 2007년 구글 썸머 코드에서 구현됐다. 파이썬으로 구현된 가장 유명한 기계학습 오픈소스라이브러리 중 하나다.
  • matplotlib : NumPy를 위한 플로팅 라이브러리다. 자료들을 차트나 플롯으로 시각화 할 수 있다.
  • pandas : pandas는 데이터 구조 및 데이터 분석도구를 제공하는 파이썬 라이브러리다.
문서 전반에 걸쳐서 quandl데이터를 사용한다. 이것도 설치하자.
pip install quandl
quandl은 오픈데이터 플랫폼으로 금융전문가, 경제 전문가 및 투자자를 대상으로 하는 금융, 경제 데이터를 제공한다.

이제 시작하자. 회귀(Regression)란 무엇인지를 알아보자. 회귀는 연속된 데이터를 가져와서 데이터를 표현하는데 가장 적합한 방정식을 찾는 과정이다. 적합한 방정식을 찾으면, 어떤 값을 방정식에 넣었을 때의 결과를 예측 할 수 있다. 간단한 선형회귀분석은 최적의 fit line을 만드는 것이다.

 fit line

데이터는 어떤 패턴을 가지기 마련인데, 그 중 가장 간단한 패턴이 위 그래프와 같은 선형 방정식이다.

회귀는 주식 가격을 예측하는데 널리 사용한다. 시간이 지남에 따른 연속적인 데이터 세트를 얻은 다음, 회귀를 이용해서 적당한 방정식을 만들어서 다음 가격을 예측하는 방식이다.

회귀는 슈퍼바이저 머신 러닝(supervised machine learning)다. 데이터분석가가 기계에 올바른 정답 셋을 반복적으로 입력해서 기계를 가르치는 방법이다. 입력된 정답 셋을 이용해서 기계가 학습을 하고 나면, 새로운 데이터입력을 기계가 테스트 할 수 있게 된다. 데이터분석가는 자신이 알고 있는 정답과, 기계가 리턴한 정답을 비교해서 기계학습의 정확도를 측정 할 수 있다. 정확도가 충분히 높다면, 데이터분석가는 해당 알고리즘을 실 세계에 사용할 것을 고려한다.

회귀는 주식가격예측에 널리 사용하고 있으므로, 실제 데이터를 이용해서 테스트 할 수 있다. 우리는 앞서 설치한 quandl의 데이터를 이용해서 학습을 할 것이다. 먼저 구글의 시세와 Alphabet의 주식데이터를 이용해서 분석을 시작해보자.
import pandas as pd
import quandl

df = quandl.get("WIKI/GOOGL")

print(df.head())

실행결과다.
              Open    High     Low    Close      Volume  Ex-Dividend  Split Ratio  Adj. Open  Adj. High   Adj. Low  Adj. Close  Adj. Volume
Date                                                                                                                                       
2004-08-19  100.01  104.06   95.96  100.335  44659000.0          0.0          1.0  50.159839  52.191109  48.128568   50.322842   44659000.0
2004-08-20  101.01  109.08  100.50  108.310  22834300.0          0.0          1.0  50.661387  54.708881  50.405597   54.322689   22834300.0
2004-08-23  110.76  113.48  109.05  109.400  18256100.0          0.0          1.0  55.551482  56.915693  54.693835   54.869377   18256100.0
2004-08-24  111.24  111.60  103.57  104.870  15247300.0          0.0          1.0  55.792225  55.972783  51.945350   52.597363   15247300.0
2004-08-25  104.76  108.00  103.88  106.000   9188600.0          0.0          1.0  52.542193  54.167209  52.100830   53.164113    9188600.0
시작이 좋다. 패키지 몇개 설치하는 것으로 앞으로 학습에 사용할 데이터를 가져왔다. 그런데 데이터가 너무 많다 !!. 많은 사람들이 기계학습에 대해서 "무언가 데이터 때려 넣으면, 컴퓨터가 원하는 답을 척척 내놓는 일종의 마법과 같은 것으로 생각하는 경향이 있다. 기계학습은 가치있는 정보를 출력할 수 있지만, 그러기 위해서는 가치있는 데이터 즉, 의미있는 데이터를 준비해야 한다. 그렇다면 의미있는 정보인지 어떻게 알 수 있을까 ? 유일한 방법은 두뇌를 사용하는 것이다. 생각해보자. 과거의 가격이 미래의 가격을 나타내는가 ? 이렇게 생각 할 수도 있겠지만 가격은 시간에 따라서 변한다. 좀 더 긴 시간을 두고, 가격변동에 영향을 주는 다른 요인들을 함께 분석한다면, 조금 더 잘 예측 할 수 있을 것이다. 데이터는 많을 수록 유용하지만, 의미있는 데이터도 추출 할 수 있어야 한다. 이런 이유로 머신리닝에 제공되는 원시데이터는 몇 번의 가공과정을 거치게 된다. 데이터가 많아지면 가공에 많은 시간이 걸리고 빅 데이터기술을 사용해야 한다. 여러분이 머신러닝을 본격적으로 적용해야 한다면 빅 데이터 기술도 함께 학습해야 할 것이다.

우리가 가져온 데이터를 보자. Open, High, Low, Close 정보는 단순하긴 하지만, 별로 좋은 정보는 아니다. 분할, 배당, 배분, 신주발행등이 반영된 Adj(수정 주가)가 붙은 데이터를 사용하는게 좋다.

하여, 원본 데이터에서 필요한 정보만 가져오도록 수정했다.
df = df[['Adj. Open',  'Adj. High',  'Adj. Low',  'Adj. Close', 'Adj. Volume']]
아래와 같이 실행결과가 조정됐다.
            Adj. Open  Adj. High   Adj. Low  Adj. Close  Adj. Volume
Date                                                                
2004-08-19  50.159839  52.191109  48.128568   50.322842   44659000.0
2004-08-20  50.661387  54.708881  50.405597   54.322689   22834300.0
2004-08-23  55.551482  56.915693  54.693835   54.869377   18256100.0
2004-08-24  55.792225  55.972783  51.945350   52.597363   15247300.0
2004-08-25  52.542193  54.167209  52.100830   53.164113    9188600.0
심심해서 가장최근 결과를 출력해보기로 했다.
print(df.tail())

            Adj. Open  Adj. High  Adj. Low  Adj. Close  Adj. Volume
Date                                                               
2018-03-21    1092.57    1108.70   1087.21     1094.00    1990515.0
2018-03-22    1080.01    1083.92   1049.64     1053.15    3418154.0
2018-03-23    1051.37    1066.78   1024.87     1026.55    2413517.0
2018-03-26    1050.60    1059.27   1010.58     1054.09    3272409.0
2018-03-27    1063.90    1064.54    997.62     1006.94    2940957.0
2018년 3월/27일이 최신 데이터인거 같다. 와우 14년 동안 200배가 올랐다. 이제 수정(adjust)된 컬럼만 남았다. 계속해서 데이터를 변환해보자.

가장 낮은 주가와 높은 주가의 변화율 HL_PCT와 현재값과 이전 값사이의 변화를 백분율로 계산한 PC_change 컬럼을 추가하기로 했다.
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Low']) / df['Adj. Close'] * 100.0
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]

실행결과값은 아래와 같다.
            Adj. Close    HL_PCT  PCT_change  Adj. Volume
Date                                                     
2004-08-19   50.322842  8.072956    0.324968   44659000.0
2004-08-20   54.322689  7.921706    7.227007   22834300.0
2004-08-23   54.869377  4.049360   -1.227880   18256100.0
2004-08-24   52.597363  7.657099   -5.726357   15247300.0
2004-08-25   53.164113  3.886792    1.183658    9188600.0

목차 Regression - Features and Labels