1.4 필수 라이브러리와 도구들

1.3 scikit-learn | 목차 | 1.5 파이썬 2 vs. 파이썬 3

­

scikit-learn이 무엇이고 어떻게 사용하는지 아는 것이 중요하지만, 그 전에 꼭 알아둬야 할 중요한 라이브러리들이 있습니다. scikit-learn은 파이썬 과학 라이브러리인 NumPy와 SciPy를 기반으로 만들었습니다. 우리는 NumPy와 SciPy 외에 pandas와 matplotlib도 사용할 것입니다. 그리고 브라우저 기반의 대화식 프로그래밍 환경인 주피터 노트북도 소개하겠습니다. scikit-learn을 십분 활용할 수 있도록 이런 도구들에 대해 간단히 소개하겠습니다. 1

1.4.1 주피터 노트북

주피터 노트북은 프로그램 코드를 브라우저에서 실행해주는 대화식 환경입니다. 이런 방식은 탐색적 데이터 분석에 아주 적합하여 많은 데이터 분석가가 주피터 노트북을 사용하고 있습니다. 주피터 노트북은 다양한 프로그래밍 언어를 지원하지만 우리는 파이썬만 사용하겠습니다. 그리고 주피터 노트북은 코드와 설명, 이미지들을 쉽게 섞어 쓸 수 있습니다. 사실 이 책 전부를 주피터 노트북으로 썼습니다. 이 책에 포함된 모든 예제 코드는 깃허브(https://github.com/rickiepark/introduction_to_ml_with_python)에서 내려받을 수 있습니다. 2

1.4.2 NumPy

NumPy(http://www.numpy.org/)는 파이썬으로 과학 계산을 하려면 꼭 필요한 패키지입니다. 다차원 배열을 위한 기능과 선형대수 3 연산과 푸리에 변환 4 같은 고수준 수학 함수와 유사pseudo 난수 5 생성기를 포함합니다.

scikit-learn에서 NumPy 배열은 기본 데이터 구조입니다. scikit-learn은 NumPy 배열 형태의 데이터를 입력으로 받습니다. 그래서 우리가 사용할 데이터는 모두 NumPy 배열로 변환되어야 합니다. NumPy의 핵심 기능은 다차원(n-차원) 배열인 ndarray 클래스입니다. 이 배열의 모든 원소는 동일한 데이터 타입이어야 합니다. 다음 코드는 NumPy 배열의 예입니다.

In[2]:

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]])
print("x:\n{}".format(x))

Out[2]:

x:
[[1 2 3]
 [4 5 6]]

이 책에서는 NumPy를 아주 많이 사용할 것입니다. NumPy의 ndarray 클래스의 객체를 간단하게 NumPy 배열 혹은 그냥 배열이라고 부르겠습니다.

1.4.3 SciPy

SciPy(https://www.scipy.org/scipylib)는 과학 계산용 함수를 모아놓은 파이썬 패키지입니다. SciPy는 고성능 선형대수, 함수 최적화, 신호 처리, 특수한 수학 함수와 통계 분포 등을 포함한 많은 기능을 제공합니다. scikit-learn은 알고리즘을 구현할 때 SciPy의 여러 함수를 사용합니다. 그중에서 가장 중요한 기능은 scipy.sparse입니다. 이 모듈은 scikit-learn에서 데이터를 표현하는 또 하나의 방법인 희소 행렬 기능을 제공합니다. 희소 행렬sparse matrix, 희박 행렬은 0을 많이 포함한 2차원 배열을 저장할 때 사용합니다.

In[3]:

from scipy import sparse

# 대각선 원소는 1이고 나머지는 0인 2차원 NumPy 배열을 만듭니다.
eye = np.eye(4)
print("NumPy 배열:\n{}".format(eye))

Out[3]:

NumPy 배열:
[[ 1. 0. 0. 0.]
 [ 0. 1. 0. 0.]
 [ 0. 0. 1. 0.]
 [ 0. 0. 0. 1.]]

In[4]:

# NumPy 배열을 CSR 포맷의 SciPy 희소 행렬로 변환합니다.
# 0이 아닌 원소만 저장됩니다.
sparse_matrix = sparse.csr_matrix(eye)
print("SciPy의 CSR 행렬:\n{}".format(sparse_matrix))

Out[4]:

SciPy의 CSR 행렬:
  (0, 0) 1.0
  (1, 1) 1.0
  (2, 2) 1.0
  (3, 3) 1.0

보통 희소 행렬을 0을 모두 채운 2차원 배열로부터 만들지 않으므로(메모리가 부족할 수 있어서) 희소 행렬을 직접 만들 수 있어야 합니다. 다음은 COO 포맷 6 을 이용해서 앞서와 동일한 희소 행렬을 만드는 예제입니다.

In[5]:

data = np.ones(4)
row_indices = np.arange(4)
col_indices = np.arange(4)
eye_coo = sparse.coo_matrix((data, (row_indices, col_indices)))
print("COO 표현:\n{}".format(eye_coo))

Out[5]:

COO 표현:
  (0, 0) 1.0
  (1, 1) 1.0
  (2, 2) 1.0
  (3, 3) 1.0

SciPy의 희소 행렬에 대한 자세한 내용은 SciPy 강의 노트(http://www.scipy-lectures.org)의 2.5절을 참고하세요.

1.4.4 matplotlib

matplotlib(https://matplotlib.org/)은 파이썬의 대표적인 과학 계산용 그래프 라이브러리입니다. 선 그래프, 히스토그램, 산점도 등을 지원하며 출판에 쓸 수 있을 만큼의 고품질 그래프를 그려줍니다. 데이터와 분석 결과를 다양한 관점에서 시각화해보면 매우 중요한 통찰을 얻을 수 있습니다. 이 책의 모든 그래프는 matplotlib을 사용했습니다. 주피터 노트북에서 사용할 때는 %matplotlib notebook이나 %matplotlib inline 명령을 사용하면 브라우저에서 바로 이미지를 볼 수 있습니다. 대화식 환경을 제공하는 %matplotlib notebook 명령을 권장합니다(하지만 이 책에서는 %matplotlib inline을 사용합니다). 다음 코드는 [그림 1-1]의 그래프를 그리는 간단한 예제입니다.

In[6]:

%matplotlib inline
import matplotlib.pyplot as plt

# -10에서 10까지 100개의 간격으로 나뉘어진 배열을 생성합니다.
x = np.linspace(-10, 10, 100)
# 사인(sin) 함수를 사용하여 y 배열을 생성합니다.
y = np.sin(x)
# 플롯(plot) 함수는 한 배열의 값을 다른 배열에 대응해서 선 그래프를 그립니다.
plt.plot(x, y, marker="x")

1-1

그림 1-1 matplotlib으로 그린 사인(sine) 함수

1.4.5 pandas

pandas(http://pandas.pydata.org/)는 데이터 처리와 분석을 위한 파이썬 라이브러리입니다. R의 data.frame을 본떠서 설계한 DataFrame이라는 데이터 구조를 기반으로 만들어졌습니다. 간단하게 말하면 pandas의 DataFrame은 엑셀의 스프레드시트와 비슷한 테이블 형태라고 할 수 있습니다. pandas는 이 테이블을 수정하고 조작하는 다양한 기능을 제공합니다. 특히, SQL처럼 테이블에 쿼리나 조인을 수행할 수 있습니다. 전체 배열의 원소가 동일한 타입이어야 하는 NumPy와는 달리 pandas는 각 열의 타입이 달라도 됩니다(예를 들면 정수, 날짜, 부동소숫점, 문자열). SQL, 엑셀 파일, CSV 파일 같은 다양한 파일과 데이터베이스에서 데이터를 읽어 들일 수 있는 것이 pandas가 제공하는 또 하나의 유용한 기능입니다. 이 책은 pandas의 기능을 자세히 설명하지는 않습니다. 대신 pandas에 대한 훌륭한 안내서로 웨스 맥키니Wes Makinney가 쓴 『파이썬 라이브러리를 활용한 데이터 분석』(한빛미디어, 2013)을 추천합니다. 다음 코드는 딕셔너리를 사용하여 DataFrame을 만드는 간단한 예제입니다.

In[7]:

import pandas as pd

# 회원 정보가 들어간 간단한 데이터셋을 생성합니다.
data = {'Name': ["John", "Anna", "Peter", "Linda"],
        'Location' : ["New York", "Paris", "Berlin", "London"],
        'Age' : [24, 13, 53, 33]
       }

data_pandas = pd.DataFrame(data)
# IPython.display는 주피터 노트북에서 Dataframe을 미려하게 출력해줍니다.
display(data_pandas)

이 코드의 결과는 다음과 같습니다.

Age Location Name
0 24 New York John
1 13 Paris Anna
2 53 Berlin Peter
3 33 London Linda

이 테이블에 질의하는 방법이 몇 가지 있는데, 다음은 그 예입니다.

In[8]:

# Age 열의 값이 30 이상인 모든 행을 선택합니다.
display(data_pandas[data_pandas.Age > 30])

다음은 이 코드를 실행한 결과입니다.

Age Location Name
2 53 Berlin Peter
3 33 London Linda

1.4.6 mglearn

이 책은 깃허브(https://github.com/rickiepark/introduction_to_ml_with_python)에 있는 코드와 병행해서 작성했습니다. 깃허브의 코드는 이 책의 예제뿐 아니라 mglearn 라이브러리도 포함합니다. 이 라이브러리는 그래프나 데이터 적재와 관련한 세세한 코드를 일일이 쓰지 않아도 되게끔 이 책을 위해 만든 유틸리티 함수들입니다. 혹시 궁금하다면 깃허브 저장소에서 함수 코드를 상세히 살펴볼 수 있습니다만, mglearn 모듈의 상세 사항은 이 책이 다루는 내용과 큰 관련이 없습니다. 이 책에서는 간단하게 그림을 그리거나 필요한 데이터를 바로 불러들이기 위해 mglearn을 사용합니다. 깃허브에 있는 노트북을 실행할 때는 이 모듈에 관해 신경 쓸 필요가 없습니다. 만약 다른 곳에서 mglearn 함수를 호출하려면, pip install mglearn 명령으로 설치하는 것이 가장 쉬운 방법입니다.

노트_ 이 책은 NumPy, matplotlib, pandas를 많이 사용합니다. 따라서 모든 코드는 다음의 네 라이브러리를 임포트한다고 가정합니다.

from IPython.display import display
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn

또한 모든 코드는 주피터 노트북에서 실행되며 그래프를 표시하기 위해 %matplotlib notebook이나 %matplotlib inline 명령을 사용한다고 가정합니다. 만약 이런 매직 커맨드를 사용하지 않는다면 이미지를 그리기 위해 plt.show 명령을 사용해야 합니다.


  1. 옮긴이_ NumPy나 matplotlib에 익숙하지 않다면 SciPy 강의 노트(http://www.scipy-lectures.org/)의 1장을 읽어볼 것을 권합니다.
  2. 옮긴이_ 번역서의 코드는 scikit-learn 라이브러리의 최신 버전에 맞추었고 주석을 한글로 번역하였습니다. 원서의 깃허브 저장소 주소는 다음과 같습니다. https://github.com/amueller/introduction_to_ml_with_python
  3. 옮긴이_ 벡터, 행렬, 선형 변환을 연구하는 수학의 한 분야입니다.
  4. 옮긴이_ 시간의 함수인 신호 등을 주파수 성분으로 분해하는 변환입니다.
  5. 옮긴이_ 초깃값을 이용하여 이미 결정되어 있는 메커니즘에 의해 생성되는 난수로, 초깃값을 알면 언제든 같은 값을 다시 만들 수 있으므로 진짜 난수와 구별하여 유사 난수라 합니다.
  6. 옮긴이_ Coordinate 포맷의 약자로 데이터가 놓일 행렬의 위치를 별도의 매개변수로 전달합니다. 한편 CSR은 ‘Compressed Row Storage’의 약자로 행의 인덱스를 압축하여 저장합니다.

1.3 scikit-learn | 목차 | 1.5 파이썬 2 vs. 파이썬 3

이 글은 한빛미디어에서 출간한  “파이썬 라이브러리를 활용한 머신러닝“의 1장과 2장입니다. 이 책의 저작권은 한빛미디어(주)에 있으므로 무단 복제 및 무단 전제를 금합니다.

1.4 필수 라이브러리와 도구들”에 대한 2개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중