대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습
등록일 조회수 4976
첨부파일  

기계 학습의 A to Z

IPython notebook과 scikit-learn을 활용한 기계 학습



영화 ‘인터스텔라’와 자주 같이 이야기되는 ‘2001 스페이스 오딧세이’에서 가장 기억 남는 장면이 있다. 유인원이 뼈를 도구로 사용하는 모습이다. 인류는 다른 도구로 대체했고, 이제는 인간의 지능을 대체할 수 있는 기계를 만들고 있다. 좀 거창한 예시를 뒤로 하고 현실로 돌아와 보자. 일반 목적 언어였던 파이썬에 넘피(numpy), 스키피(scipy), 맷플롯립(matplotlib), 판다스(pandas)와 같은 다양한 라이브러리가 만들어지면서 데이터 과학, 과학 계산에 적합한 생태계(ecosystem)를 이루었다. 한번 구현하고 사용하던 기존 프로그램 구현 방법과 다르게, 데이터에 합리적인 기법을 적용하고, 도표나 문자로 결과를 확인한 후, 다음 기법을 적용하는 구현 방법(REPL, read?eval?print loop)이 자연스럽게 필요하게 되었다. 이러한 구현 과정에 적합한 도구인 아이파이썬 노트북(IPython notebook)을 살펴보고 그 위에서 기계 학습을 사용해 보겠다.



처음 IPython은 파이썬을 좀 더 빠르고 편리하게 사용할 수 있는 명령어 쉘(shell)로 개발되었으나, 차츰 대화형(interactive) 계산, 병렬 처리, 시각화를 제공하는 환경이 됐다. 현재의 IPython은 다음과 같은 주요 기능이 있다.

- 강력한 대화형 셀(interactive shells)
- 문서화와 코드를 통합할 수 있는 웹 기반 notebook
- 유연하고, 내장형(embeddable) 인터프리터
- 고성능이자 사용하기 쉬운 병렬 처리

간략하게 설명하자면, IPython 대화형 셀은 파이썬의 기본 셀보다 다양한 기능을 제공하며 운영체제의 명령어를 셀에서 그대로 사용할 수 있다. pandas를 개발한 웨스 맥키니(Wes McKinney)는 파이썬 개발 환경으로도 추천할 정도이다. 내장형 인터프리터는 파이썬 프로그램에 IPython 삽입해 다양한 기능을 사용할 수 있도록 한다. 병렬 처리 기능은 병산 처리를 쉽게 구현하고 디버깅할 수 있도록 체계적으로 구현한 라이브러리이다. notebook은 2011년 IPython 0.12에서 발표되었다. 웹 기반으로 코드, 텍스트, 수학식, 인라인 도표, 다양한 표현력 높은 미디어(rich media)를 통합할 수 있어 대화형 과학 계산과 데이터 분석하는데 이상적인 환경이다. 코드를 설명할 수 있을 뿐만 아니라 재현성이 높아 누구나 쉽게 다시 코드를 재현, 변경할 수 있다.

또한, 구조를 메시지 프로토콜(messaging protocols)과 대화형 클라이언트(interactive clients)로 구성해 프로그램 언어와 독립적이다. 계산 기능을 하는 커널(Kerenl)과 클라이언트로 구분되어 있기 때문에, 커널을 다른 언어로 구현할 수 있다. 이와 관련하여 notebook에서 R언어를 사용한다.



설치법

윈도우에서 사용하려면 아나콘다(Anaconda)를 설치하면 매우 편리하다. Anaconda가 설치될 때, 사용자들가 많이 사용하는 라이브러리를 같이 설치되어, 별도로 라이브러리를 설치해야 하는 번거러움을 줄어준다. 명령어 창에 conda pip install [라이브러리]로 쉽게 추가할 수 있다. 우분투라면 다음 명령어로 입력한다.



<리스트 1> 설치 명령어 pip install distribute --upgrade pip install ipython pip install pyzmq pip install jinja2 pip install tornado



윈도우에서 Anaconda를 설치했다면, scipy, numpy, sckit-learn도 함께 설치된다.



마크다운(markdown)

명령어 창에 “ipython notebook"을 입력하면 다음과 같이 웹 브라우저가 나타난다.



새로운 notebook을 하나 만들어 보자. 오른쪽 위에 있는 [New Notebook]을 누른다. notebook은 제이슨(JSON) 형태로 저장된다. 셀에 코드나 문서를 넣고 실행하면 결과영역에 결과가 나타난다. IPython notebook 2.x부터 셀에 대한 ‘편집모드(edit mode)’와 ‘명령모드(command mode)’가 추가됐다.

- 편집 모드(edit mode)에서 코드와 텍스트를 입력하는 셀(Cell)의 내용을 편집할 수 있다
- 명령 모드(command mode)에서, 셀을 이동, 복사, 삭제, 형식을 변경할 수 있다

해당 셀에서 [Enter]를 누르면 [편집 모드]로 들어가 코드나 텍스트를 입력할 수 있으며, [Esc]로 [편집 모드]를 나와 [명령 모드]에서 셀을 실행할 수 있다. 다음은 [명령 모드]에서 유용한 단축키이다.

- [Shift + Enter] : 셀 실행
- [Ctrl + Enter] : 셀 실행 (다음 셀로 이동)
- m, y : 셀 타입(마크다운, 코드)
- a, b : 셀 추가
- x : 셀 삭제
- j, k : 셀 이동

다음은 편집 모드에서 셀에 마크다운로 만든 문서다.



<리스트 2> 마크다운 문서 In [1]: 최초 [IPython](http://ipython.org)은 **파이썬**을 좀 더 자연스럽고 편리하게 사용할 수 있는 명령어 `쉘(shell)`로 개발되었으나, 차츰 *대화형 계산*, *병렬 처리*, *시각화*를 제공하는 환경이 되었다. IPython은 다음과 같은 주요 기능이 있다. * 강력한 대화형 셀(interactive shells) * 문서화와 코드를 통합할 수 있는 웹 기반 notebook * 유연하고, 내장형(embeddable) 인터프리터 * 고성능이자 사용하기 쉬운 병렬 처리 파이썬 코드 ```python class Player: def __init__(self): print('hello')



[Shift + Enter]로 셀 실행하면 다음과 같은 화면을 볼 수 있다.


셀에 이미지와 HTML을 문서를 넣을 수도 있다. 다음은 서울시 구별 인구 지도다.



<리스트 3> HTML 문서 In [2]: from IPython.display import HTML HTML('< iframe width="700" height="500" scrolling="no" frameborder="no" src="https://www.google.com/fusiontables/embedviz?q=select+col2%2C+col3%2C+col6+from+137OUap7Yf5E2Yn ........p;hml=TWO_COL_LAT_LNG"> < / iframe>')



셀에 HTML() 함수를 호출하고 < iframe>인 html의 요소를 넣었다. 이미지는 IMAGE() 함수를 호출한다.


수학식를 출력하고 이에 대한 설명을 하는 데도 편리하다. 다음의 연립 방정식을 풀어보자.



<리스트 4> 연립 방정식 from IPython.display import Math Math(r'egin{eqnarray*} x+3y+5z & = & 10\ 2x+5y+z & = & 8\ 2x+3y+8z & = & 3end{eqnarray*}')





이를 <리스트 5>와 같은 행렬로 변형한다.



<리스트 5> 변형한 행렬 from IPython.display import Math Math(r'left[egin{array}{c} x\ y\ zend{array} ight]=left[egin{array}{ccc} 1 & 3 & 5\ 2 & 5 & 1\ 2 & 3 & 8end{array} ight]^{-1}left[egin{array}{c} 10\ 8\ 3end{array} ight]=frac{1}{25}left[egin{array}{c} -232\ 129\ 19end{array} ight]=left[egin{array}{c} -9.28\ 5.16\ 0.76end{array} ight].')





notebook에 해결해야 할 방정식을 나타내고, 손으로 역행렬을 이용해 해를 구했다. 그럼, scipy로 이 연립 방정식 해를 찾아보자.



<리스트 6> 변형한 행렬 In [4]: from IPython.display import Math import numpy as np from scipy import linalg A = np.array([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) b = np.array([[10], [8], [3]]) np.linalg.solve(A,b) Out[4]: array([[-9.28], [ 5.16], [ 0.76]])



데이터 과학이나 과학 계산에서 문서와 더불어 계산을 할 수 있기 때문에 다른 사용자나 연구자는 결과를 확인하며 아이디어를 공유할 수 있다.



매직 명령어(magic commands)

IPython notebook은 다양한 매직 명령어를 제공한다. 매직 명령어는 함수를 사용하기 편리하게 명령어로 만들어 놓은 것이다. 매직 명령어는 ‘%’로 시작한다. %lsmagic을 입력하면 사용할 수 있는 모든 매직 명령어를 볼 수 있다. 대표적인 몇 개의 매직 명령어를 보면 다음과 같다. 쉽게 사용하는 매직 명령어는 %time, %timeit이다. %time은 표현식(expression)이나 명령문(statement)의 실행 시간을 측정하고, %timeit는 내부적으로 다수의 실행에서 평균 실행 시간을 측정한다.



<리스트 7> %time 매직 명령어 In [7]: %time x = [1 for _ in range(100000)] Wall time: 18 ms



<리스트 8> %timeit 명령어 In [8]: %timeit x = [1 for _ in range(100000)] 100 loops, best of 3: 4.87 ms per loop



%run은 파이썬 스크립트를 실행하는 매직 명령어이다. 이를테면, %run solve.py은 solve.py를 실행한다. 매직 명령어뿐만 아니라 셀 매직도 있다. 셀 매직은 ‘%%’로 시작하며, 명령어를 이후 나머지 행들이 매개 변수가 된다. %%write file, %%html, %%python, %%python3 등이 있다. 다음은 %%writefile 셀 매직으로 파일을 작성해 보겠다.



<리스트 9> %%writefile 셀 매직 [9]: %%writefile solve.py import numpy as np from scipy import linalg A = np.array([[1, 3, 5], [2, 5, 1], [2, 3, 8]]) b = np.array([[10], [8], [3]]) c = np.linalg.solve(A,b) print(c) Writing solve.py



%%writefile <파일 이름>을 입력하고 파일에 넣고자 하는 내용을 입력한다. 셀을 실행하면, 현재 디렉토리에 solve.py가 만들어진다. 다른 편집기 없이 셀에서 파일을 만들었기 때문에 편리하다. 다음 셀에서 %run 매직 명령어로 스크립트를 실행한다.



<리스트 10> %run 매직 명령얼로 스크립트 실행 In [10]: %run solve.py Out[10]: array([[-9.28], [ 5.16], [ 0.76]])



사용자 매직 명령어

notebook은 사용자가 매직 명령어와 셀 명령어를 만들 수 있도록 한다. 매직 명령어와 셀 명령어도 함수이기 때문에, 사용자도 자주 사용하는 함수를 명령어로 만들 수 있다. 다음은 %time에 시스템이나 파이썬 부가 정보를 추가하는 함수를 만들어 매직 명령어로 등록하겠다. %time 매직 명령어도 파이썬 timeit 모듈을 사용하기 때문에 특별히 구현할 것은 없다. 매직 명령어와 함께 입력하는 아규먼트를 함수의 입력값인 line을 넣으면 된다. 다음은 작성한 함수에 register_line_magic 데코레이터를 붙이기만 한다.



<리스트 11> 사용자 매직 명령어 등록 In [11]: from IPython.core.magic import register_line_magic import timeit import platform @register_line_magic def timeit_extrainfo(line): print('Platform version: {v}'.format(v=platform.platform())) print('Python version: {v}'.format(v=platform.python_version())) return timeit.timeit(line)



<리스트 12> %time_extrainfo 사용자 매직 명령어 실행 In [12]: %timeit_extrainfo 'x = [1 for _ in range(100000)]' Platform version: Windows-7-6.1.7601-SP1 Python version: 2.7.8 Out[12]: 0.018681686875730106



셀 명령어도 입력값을 셀의 내용을 받는 함수를 작성한 후, register_cell_magic를 데코레이터를 붙이면 된다. 하지만 이러한 매직 명령어와 셀 명령어를 IPython 설정에 등록하지 않으면 다른 notebook에서는 사용할 수 없다. 다른 notebook에서도 사용하려면 IPython 설정에 반드시 등록해야한다.



위젯 사용하기

또 다른 IPython 2.0의 특징은 파이썬 커널과 연동하는 표현력 높은 GUI 어플리케이션을 만들 수 있다는 점이다. notebook에서는 대화형 위젯으로 사용자의 입력값을 받고 적용할 수 있다. 기계 학습이나 데이터 과학에서 최적의 값을 찾기 위해 다양한 방법을 사용하지만 시각화는 매우 중요한 방법이다. 하지만 매개 변수를 변경할 때마다 시각화를 다시 해주는 일은 대단히 시간 소모적인 작업이다. notebook에서 제공하는 위젯을 사용하여, 매개 변수를 변경에 따라 자동으로 시각화를 하도록 한다.



<리스트 13> 함수에 위젯 데코레이트 붙이기 In [16]: from IPython.html.widgets import interact @interact def plot(n=(1, 30, 2), k=('a', 'b', 'c')): print(n, k)



위젯을 사용하기 위해 interact을 임포트한 후, 매개 변수를 변경할 함수를 만들고 함수 위에 interact 데코레이터를 넣는다. 다음은 위젯 함수를 시행한 결과다.



다음은 붓꽃(iris) 종류를 SVM(Support Vector Machine)으로 구분하는 것이다. SVM은 몇 개의 매개 변수가 있다. kernel 매개 변수는 SVM에서 사용할 커널이며, C는 오차 항의 벌칙(Penalty)에 대한 매개 변수이다. 이외에도 degree, gamma등 다양한 매개 변수가 있다 (이 예제는 http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html을 기반으로 하였다). 셀에 다음 코드를 넣는다.



<리스트 14> 위젯으로 SVM의 매개 변수에 따른 시각화 # http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html %matplotlib inline import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets from IPython.html.widgets import interact iris = datasets.load_iris() X = iris.data[:, :2] # 앞 두 개의 속성만 사용한다. Y = iris.target h = .02 # mesh의 간격 @interact def plot(C=(0.1, 2.0), kernel=('linear', 'rbf', 'poly')): clf = svm.SVC(kernel=str(kernel), C=C) clf.fit(X, Y) # 색상으로 결정 경계선을 그린다. x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) # 결과를 색상으로 나타낸다. Z = Z.reshape(xx.shape) plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired) plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired) plt.show()



함수 plot(C=(0.1, 2.0), kernel=('linear', 'rbf', 'poly'))에서 변경할 매개 변수를 받아 들이고, 다음과 같이 svm.SVC(kernel= str(kernel), C=C) 모델을 만들고 데이터에 대해 적합화하고 시각화한다.





위젯에서 값을 변경할 때, 약간의 시간이 걸린다. 모델이 데이터에 대해 적합화하고 도표를 그리는데 시간을 소모한다. 붓꽃 데이터는 작기 때문에 비교적 시간이 적게 걸리지만 데이터가 클 경우 이를 고려해야 한다.



notebook에서 R 언어 사용하기

IPython 2.0에서는 파이썬이 아닌 다른 언어도 사용할 수 있다. 다른 언어의 코드와 다양한 미디어로 통합할 있다. 더 나아가, notebook에서 다른 언어를 같이 사용할 수도 있다. 이번에는 파이썬과 R을 함께 사용한다. 파이썬은 일반 목적 언어이기 때문에, 웹, 네트워크, 파일등 다양한 매체에서 데이터를 가져오기도 쉽고, 데이터를 다루기도 쉽다. 다수의 라이브러리를 이용하여 필요한 기술을 데이터에 적용하기가 편하다. 반면, R은 통계 분석 중심 언어이기 때문에, 데이터 분석과 시각화가 매우 쉽다. notebook은 이러한 두 언어의 장점을 모두 살릴 수 있는 환경을 제공한다. notebook에서 R을 사용하려면 R과 rpy2를 설치해야 한다.

1. http://cran.r-project.org/mirrors.html에서 운영 체제에 따라 R을 내려 받고 설치한다. 우분투에서는 sudo apt-get install r-base-dev로 설치할 수 있다.
2. http://rpy.sourceforge.net/rpy2.html에서 rpy2를 내려 받고 설치한다. 아나콘다에서는 install -c https://conda.binstar.org/r rpy2로 설치하며 pip install rpy2로 설치해도 좋다
3. IPython notebook에서 R 코드를 실행하려면 먼저 %load_ext rmagic을 실행한다.



<리스트 15> 파이썬으로 boston 데이터 구하기 In [20]: %load_ext rmagic from sklearn.datasets import load_boston boston = load_boston() print(boston.data.shape) print(boston.feature_names) print(np.max(boston.target), np.min(boston.target), np.mean(boston.target)) print(boston.DESCR)



scikit-learn의 sklearn.datasets에서 boston 주택 정보를 가져온다. 데이터는 560개이며 13개의 속성이 있다.



<리스트 16> 파이썬으로 도표 그리기 In [21]: %%matplotlib inline import numpy as np import matplotlib.pyplot as plt X = boston.data[:, 5] Y = boston.target plt.scatter(X, Y)



속성 중 하나인 방의 개수를 선택하고 도표를 그린다.


변수를 공통을 사용하게 하여, notebook에서 파이썬과 R을 함께 사용할 수 있다. 다음은 변수를 공통으로 사용하는 방법이다.



<리스트 17> 파이썬과 R에서 공통으로 변수를 사용하기 위한 명령어 * %Rpush 파이썬에서 사용한 변수를 rpy2에서 같은 이름의 변수를 사용할 수 있다. * %Rpull은 rpy2에서 사용한 변수를 파이썬에서 사용할 수 있도록 한다. * %R 매직 명령어로 rpy2에서 R 함수를 사용할 수 있다. * %%R은 셀 명령어로 셀에서 R을 사용할 있다. * %R -i <변수명>은 %Rpush <변수명>과 같다. * %R -o <변수명>은 %Rpull <변수명>과 같다.



다음은 R에서 선형 회귀를 사용하는 예이다. 선형 회귀를 한 후, R에서 제공하는 다양한 부과 정보를 얻을 수 있다.



<리스트 18> R로 선형 회귀로 데이터 적합화하기 %%R -i X,Y -o XYcoef XYlm = lm(Y~X) XYcoef = coef(XYlm) print(summary(XYlm)) par(mfrow=c(2,2)) plot(XYlm)





결론

지금까지 notebook의 여러 기능과 기계 학습을 좀 더 쉽게 적용할 수 있는 방법을 살펴보았다. 먼저, 마크다운으로 사용자가 이해하기 쉬운 문서화를 만들 수 있고, notebook에서 지원하는 함수로 풍부한 미디어를 사용할 수도 있었다. notebook의 매직 명령어, 사용자 명령어, 위젯으로 생산성과 편의성을 높였고, 마지막으로 파이썬 R을 같이 사용하여 두 언어의 장점을 살릴 수 있었다. IPython은 이외에도 더 많은 특성을 가지고 있으며 올해 공개될 IPython 3.0은 개발자나 연구자에서 더 많은 편의성을 제공할 것이라 생각한다. 코드는 다음 링크(http://nbviewer.ipython.org/github/brenden17/ipynote/blob/master/ipython-notebook.ipynb)에서 확인할 수 있다.



출처 : 마이크로소프트웨어 3월호

제공 : 데이터전문가 지식포털 DBguide.net