- 전체
- Python 일반
- Python 수학
- Python 그래픽
- Python 자료구조
- Python 인공지능
- Python 인터넷
- Python SAGE
- wxPython
- TkInter
- iPython
- wxPython
- pyQT
- Jython
- django
- flask
- blender python scripting
- python for minecraft
- Python 데이터 분석
- Python RPA
- cython
- PyCharm
- pySide
- kivy (python)
Python 인공지능 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습
2015.05.21 22:53
| 제목 | 기계 학습의 A to Z : IPython notebook과 scikit-learn을 활용한 기계 학습 | ||
|---|---|---|---|
| 분류 | Etc | 조회수 | 807 |
| 작성일자 | 2015.04.13 | 출처 | 마이크로소프트웨어 3월호 |
| 첨부파일 | 작성자 | dbguide | |
|
◎ 연재기사 ◎ 기계 학습의 A to Z IPython notebook과 scikit-learn을 활용한 기계 학습 영화 ‘인터스텔라’와 자주 같이 이야기되는 ‘2001 스페이스 오딧세이’에서 가장 기억 남는 장면이 있다. 유인원이 뼈를 도구로 사용하는 모습이다. 인류는 다른 도구로 대체했고, 이제는 인간의 지능을 대체할 수 있는 기계를 만들고 있다. 좀 거창한 예시를 뒤로 하고 현실로 돌아와 보자. 일반 목적 언어였던 파이썬에 넘피(numpy), 스키피(scipy), 맷플롯립(matplotlib), 판다스(pandas)와 같은 다양한 라이브러리가 만들어지면서 데이터 과학, 과학 계산에 적합한 생태계(ecosystem)를 이루었다. 한번 구현하고 사용하던 기존 프로그램 구현 방법과 다르게, 데이터에 합리적인 기법을 적용하고, 도표나 문자로 결과를 확인한 후, 다음 기법을 적용하는 구현 방법(REPL, read?eval?print loop)이 자연스럽게 필요하게 되었다. 이러한 구현 과정에 적합한 도구인 아이파이썬 노트북(IPython notebook)을 살펴보고 그 위에서 기계 학습을 사용해 보겠다. 처음 IPython은 파이썬을 좀 더 빠르고 편리하게 사용할 수 있는 명령어 쉘(shell)로 개발되었으나, 차츰 대화형(interactive) 계산, 병렬 처리, 시각화를 제공하는 환경이 됐다. 현재의 IPython은 다음과 같은 주요 기능이 있다. 설치법윈도우에서 사용하려면 아나콘다(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"을 입력하면 다음과 같이 웹 브라우저가 나타난다.
<리스트 2> 마크다운 문서 In [1]: 최초 [IPython](http://ipython.org)은 **파이썬**을 좀 더 자연스럽고 편리하게 사용할 수 있는 명령어 `쉘(shell)`로 개발되었으나, 차츰 *대화형 계산*, *병렬 처리*, *시각화*를 제공하는 환경이 되었다. IPython은 다음과 같은 주요 기능이 있다. * 강력한 대화형 셀(interactive shells) * 문서화와 코드를 통합할 수 있는 웹 기반 notebook * 유연하고, 내장형(embeddable) 인터프리터 * 고성능이자 사용하기 쉬운 병렬 처리 파이썬 코드 ```python class Player: def __init__(self): print('hello') [Shift + Enter]로 셀 실행하면 다음과 같은 화면을 볼 수 있다.
<리스트 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'\begin{eqnarray*} x+3y+5z & = & 10\ 2x+5y+z & = & 8\ 2x+3y+8z & = & 3\end{eqnarray*}')
이를 <리스트 5>와 같은 행렬로 변형한다. <리스트 5> 변형한 행렬 from IPython.display import Math Math(r'\left[\begin{array}{c} x\ y\ z\end{array}\right]=\left[\begin{array}{ccc} 1 & 3 & 5\ 2 & 5 & 1\ 2 & 3 & 8\end{array}\right]^{-1}\left[\begin{array}{c} 10\ 8\ 3\end{array}\right]=\frac{1}{25}\left[\begin{array}{c} -232\ 129\ 19\end{array}\right]=\left[\begin{array}{c} -9.28\ 5.16\ 0.76\end{array}\right].')
<리스트 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 데코레이터를 넣는다. 다음은 위젯 함수를 시행한 결과다.
<리스트 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를 설치해야 한다. <리스트 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) 속성 중 하나인 방의 개수를 선택하고 도표를 그린다.
<리스트 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)에서 확인할 수 있다.
|
|||
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.









