카테고리 보관물: Python

Introduction to Computation and Programming Using Python 3rd Edition 번역 완료!

MIT 존 구탁(John Guttag) 교수의 “Introduction to Computation and Programming Using Python 3rd Edition” 책 번역을 드디어 완료했습니다. 이 책은 단순히 파이썬 문법만 다루지 않고 계산적 사고를 돕기 위해 파이썬으로 여러가지 흥미로운 알고리즘을 구현해 보고 머신러닝을 포함해 파이썬 과학 생태계의 여러 측면을 배울 수 있습니다. 다음은 각 장의 내용을 요약한 것입니다.

1장은 계산적 사고와 두 종류의 지식에 대해 설명하는 것으로 시작됩니다. 프로그램 고정식 컴퓨터와 프로그램 내장식 컴퓨터의 차이점을 언급하면서 간단한 프로그래밍 발전 역사를 엿봅니다. 끝으로 프로그래밍 언어의 기본 구조, 문법, 정적 시맨틱, 시맨틱에 대해 설명하면서 어떻게 좋은 프로그램을 만들 수 있는지, 다른 언어와 파이썬 간의 차이점은 무엇인지를 소개하는 것으로 마칩니다.

2장은 파이썬의 기본 요소를 소개합니다. 먼저 간단한 파이썬의 특징과 역사를 살펴보고 아나콘다와 스파이더 IDE를 설치하는 방법을 설명합니다. 그다음 파이썬의 객체와 기본 스칼라 타입에 대해 알아 보고 몇 가지 예를 셸 프롬프트로 실행해 봅니다. 이어서 변수에 대해 설명하고 변수에 객체를 재할당할 때 생기는 미묘한 문제를 설명합니다. 그다음 if 문을 사용한 분기 프로그래밍을 설명합니다. 이와 함께 파이썬 코드를 여러 줄로 나누어 작성하는 방법도 소개합니다. 다음으로 문자열과 인덱싱, 슬라이싱, f-문자열을 설명합니다. 파이썬에서 사용자에게 입력을 받는 방법을 설명하면서 유니코드 인코딩에 대한 소개도 하고 있습니다. 그다음은 반복문입니다. while 문과 for 루프를 사용해 반복이 필요한 문제를 처리하는 방법을 소개합니다. 자연스럽게 range 함수도 소개합니다. 마지막으로 2~1000 사이의 소수의 합을 출력하는 퀴즈로 마무리합니다.

3장은 2장에서 배운 if, for, while 문을 사용해 간단한 프로그램을 작성하는 방법을 배웁니다. 먼저 완전 열거(exhaustive enumeration) 방식으로 제곱근을 구합니다. 이 방식의 단점을 생각해 본 다음 이분 검색(bisection search)으로 제곱근의 근삿값을 찾는 프로그램을 작성합니다. 부동소수점 숫자가 컴퓨터에서 어떻게 표현되는지 알아 보고 float 타입의 변수를 비교 연산자에 사용했을 때 발생할 수 있는 문제를 생각해 봅니다. 이 과정에서 비트, 이진수, 유효 숫자, 정밀도 등에 대해 알게 됩니다. 마지막으로 보편적인 근사 알고리즘인 뉴턴 방법을 사용해 다항식의 근을 찾는 코드를 작성합니다.

4장은 코드의 재사용성을 높이기 위해 함수의 필요성을 언급하고 함수를 정의하고 사용하는 방법을 소개합니다. 3장에서 만들었던 제곱근을 구하는 코드를 함수로 다시 구현해 봅니다. 그다음 위치 인수와 키워드 인수, 가변 길이 인수에 대해 소개합니다. 종종 혼동이 되는 변수의 유효범위에 대해 자세히 설명합니다. 이를 위해 스택 프레임을 설명하고 예를 들어 스택의 생성 소멸 과정을 자세히 안내합니다. 그다음 함수의 사양(specification)에 대해 소개합니다. 특히 추상화를 대해 재미있는 비유로 설명합니다. 지금까지 만든 함수에 독스트링으로 사양을 작성해 봅니다. 그다음 하나의 함수를 여러 개로 쪼개어 보고 함수를 인수나 반환값으로 사용하는 방법을 배웁니다. 이 과정에서 람다 함수를 소개합니다. 마지막으로 객체의 메서드에 간단히 소개하고 마칩니다.

5장은 튜플, 리스트, 레인지, 딕셔너리를 소개합니다. 튜플과 문자열의 비슷한 점과 다른 점을 소개하고 함수 반환 값에 많이 사용하는 복수 할당을 알아 봅니다. 레인지와 반복 가능한 객체에 대해 알아 보고 range 함수를 for 문에 적용해 봅니다. 그다음은 부수 효과로 골치 아플 수 있지만 유용한 객체인 리스트입니다. 이 절에서 리스트 안의 객체와 변수 사이의 바인딩에 대해 조금 더 자세히 알아 봅니다. 이 과정에서 id 함수와 is 연산자를 배웁니다. 또한 매개변수 디폴트 값에 빈 리스트를 넣었을 때 발생할 수 있는 놀라운 일도 살펴 봅니다. 리스트를 복제하기 위해 슬라이싱하는 방법과 copy 모듈을 사용하는 방법을 배웁니다. copy.deepcopy가 생각만큼 deep하지 않다는 사실도 알 수 있습니다. 그다음 파이썬 프로그래머들이 즐겨 사용하는 리스트 내포를 소개합니다. 하지만 두 개 이상 중첩하면 골치 아픕니다. 마지막으로 리스트를 사용해 고차 함수(high-order function)을 구현해보고 내장 고차 함수인 map의 사용법을 배웁니다. 5장은 여기서 끝나지 않고 집합(set)에 대해 소개하고 딕셔너리로 넘어갑니다. 딕셔너리에서 자주 사용되는 메서드를 소개하고 딕셔너리 내포도 다룹니다. 마지막으로 딕셔너리를 사용해 책 암호(book cipher)를 구현하는 간단한 예제로 마무리합니다!

6장은 재귀와 전역변수를 다룹니다. 먼저 재귀 예제의 헬로 월드인 팩토리얼을 반복문을 사용해 만든 것과 재귀를 사용해 만든 것을 비교하여 봅니다. 그다음 피보나치 수열을 재귀를 사용해 만들어 봅니다(사실 피보나치 수열은 피보나치가 만든 것이 아니군요!). 재귀를 사용하지 않고 더 효율적으로 피보나치 수열을 만들 수도 있습니다(이건 번역서 깃허브에 담겨 있습니다). 숫자가 아닌 문제에도 재귀를 사용할 수 있습니다. 예를 들면 팰린드롬(palindrome)이죠. 팰린드롬을 구현하면서 분할 정복에 대해 살짝 소개합니다. 이에 대해서는 12장에서 다시 알아 봅니다. 마지막으로 전역 변수는 일반적으로 사용하지 않도록 권장하지만 꼭 필요한 경우가 있기 때문에 간략히 소개합니다.

계속 읽기

“혼자 공부하는 데이터 분석 with 파이썬”이 출간되었습니다!

파이썬을 활용한 초절정 데이터 분석 입문서 <혼자 공부하는 데이터 분석 with 파이썬>이 출간되었습니다!

이 책은 파이썬 데이터 과학 생태계의 핵심 라이브러리인 판다스, 넘파이, 맷플롯립, 사이파이, 사이킷런을 사용하여 데이터 분석에 필요한 기초 지식을 쌓을 수 있도록 돕습니다. 또한 뷰티플수프, 리퀘스트 같은 유용한 다른 패키지도 함께 배울 수 있죠.

데이터 수집, 정제, 분석, 시각화, 검증 그리고 모델링까지 이 분야의 기술이 궁금하다면 바로 이 책으로 시작하세요!

동영상 강의도 함께 들으시면 책을 완독하는데 도움이 되실거에요! 🙂

한빛미디어의 혼공단에 참여해서 같이 공부하시면 더욱 좋습니다! 🙂

“파이썬을 활용한 머신러닝 쿡북”이 출간되었습니다!

x9791162241950크리스 알본의 ‘Machine Learning with Python Cookbook’을 번역한 <파이썬을 활용한 머신러닝 쿡북>이 출간되었습니다. 200개의 레시피에 머신러닝 작업에 필요한 핵심을 잘 담아 놓았습니다.

508페이지 로 뽑아 주신 한빛미디어 출판사에 감사드립니다. 온라인/오프라인 서점(교보문고, Yes24)에서 판매 중입니다. 절판되기 전에 어서 주문하세요! 🙂

핸즈온 머신러닝’s 넘파이 튜토리얼

핸즈온 머신러닝 깃허브에 있는 부록 중 넘파이 튜토리얼을 번역하여 커밋하였습니다. 내용이 길어 생각보다 훨씬 오래 걸린 것 같습니다. 이 노트북을 막다운으로 변경하여 블로그의 핸즈온 머신러닝 1장, 2장 문서에도 포함했습니다. 재미있게 봐주세요! 🙂

Colab 팁: 깃허브 노트북 바로 열기!

일전에 구글이 공개한 주피터 노트북 환경인 Colab에 대해 포스팅했었습니다. Colab은 구글 드라이브에 있는 노트북(ipynb) 파일을 읽어서 실행하고 결과를 다시 구글 드라이브로 저장할 수 있어 교육 목적이나 간단한 실습용으로 유용합니다. 다만 요즘 공개된 자료는 대부분 깃허브에 올리기 때문에 Colab을 잘 쓰지 않았는데요. Colab이 깃허브와 연동되네요! 🙂

사용하는 방법은 nbviewer에서 깃허브의 노트북 파일을  지정하는 것과 매우 유사합니다. 깃허브에 있는 ‘파이썬 라이브러리를 활용한 머신러닝’ 노트북 하나를 선택하면 브라우저 주소는 다음과 같습니다.

https://github.com/rickiepark/introduction_to_ml_with_python/blob/master/01-introduction.ipynb

이 주소에서 https://github.com 을 github로 바꾸고 https://colab.research.google.com/ 뒤에 붙여 주면 됩니다.

https://colab.research.google.com/github/rickiepark/introduction_to_ml_with_python/blob/master/01-introduction.ipynb

그럼 다음 그림처럼 Colab에서 깃허브 노트북을 가져와 실행해 볼 수 있습니다. 정말 편하네요! 실행한 결과는 깃허브에 저장할 수도 있고 자신의 구글 드라이브에 따로 저장할 수 있습니다. 이제 아이패드에서도 주피터 노트북으로 코딩을 할 수 있겠어요! 🙂

스크린샷 2018-04-19 오전 11.56.27

QuantileTransformer

Scikit-Learn 0.19 버전에 추가된 기능 중 오늘은 QuantileTransformer() 변환기를 살펴 보겠습니다. 먼저 ‘파이썬 라이브러리를 활용한 머신러닝‘ 3장에 있는 스케일 조정의 예제와 비슷한 데이터 셋을 make_blobs 함수로 만들겠습니다. 여기서는 샘플 개수가 어느 정도 되어야 눈으로 확인하기 좋으므로 500개를 만들겠습니다.

X, y = make_blobs(n_samples=500, centers=2, random_state=4)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='black')

quantile-1

QuantileTransformer 는 지정된 분위수에 맞게 데이터를 변환합니다. 기본 분위수는 1,000개이며 n_quantiles 매개변수에서 변경할 수 있습니다. 여기서는 100개 정도로 지정해 보겠습니다.

quan = QuantileTransformer(n_quantiles=100)

fit() 메서드에서 입력 데이터의 범위를 분위수에 맞게 나누어 quantiles_ 속성에 저장합니다. 이를 위해 넘파이 percentile() 함수를 사용하여 분위에 해당하는 값을 손쉽게 구할 수 있습니다. QuantileTransformer 에는 기본값이 100,000인 subsample 매개변수가 있습니다.  만약 입력 데이터 개수가 subsample 보다 크면 계산량을 줄이기 위해 subsample 개수만큼 데이터를 샘플링하여 percentile() 함수를 적용합니다. percentile() 함수는 특성마다 각각 적용되므로 quantiles_ 속성의 크기는 [n_quantiles, X.shape[1]] 이 됩니다.

quan.fit(X)
print(quan.quantiles_.shape)
(100, 2)

transform() 메서드에서는 데이터를 quantiles_를 기준으로 하여 0~1 사이로 매핑합니다. 이를 위해 넘파이 interp() 함수를 사용합니다. 두 개의 특성이 모두 0~1 사이로 균등하게 나뉘어진 것을 그래프로 확인할 수 있습니다.

X_quan = quan.transform(X)
plt.scatter(X_quan[:, 0], X_quan[:, 1], c=y, edgecolors='black')

quantile-2

이런 변환은 RobustScaler와 비슷하게 이상치에 민감하지 않게 됩니다. 하지만 균등 분포라서 무조건 [0, 1] 사이로 클리핑합니다.

사실 transform() 메서드에서는 scipy.stats.uniform.ppf() 함수를 사용하여 균등 분포로 변환합니다. 하지만 interp() 함수에서 동일한 변환을 이미 하고 있기 때문에 효과가 없습니다. QuantileTransformer 에서 output_distribution=’normal’ 로 지정하면 scipy.stats.norm.ppf() 함수를 사용하여 정규 분포로 변환합니다.

quan = QuantileTransformer(output_distribution='normal', n_quantiles=100)
X_quan = quan.fit_transform(X)
plt.scatter(X_quan[:, 0], X_quan[:, 1], c=y, edgecolors='black')

quantile-3

변환된 데이터는 평균이 0, 표준편차가 1인 정규 분포임을 확인할 수 있습니다.

X_quan.mean(axis=0), X_quan.std(axis=0)
(array([-0.00172502, -0.00134149]), array([ 1.0412595 ,  1.03818794]))

StandardScaler 와 비교해 보면 평균 과 표준편차는 같지만 정규 분포를 따르지 않는 분포에서 차이를 확인할 수 있습니다. 🙂

from sklearn.preprocessing import StandardScaler
X_std = StandardScaler().fit_transform(X)
plt.scatter(X_std[:, 0], X_std[:, 1], c=y, edgecolors='black')

quantile-4

이 글의 샘플 코드는 ‘파이썬 라이브러리를 활용한 머신러닝‘ 깃허브(https://github.com/rickiepark/introduction_to_ml_with_python/blob/master/QuantileTransformer.ipynb)에서 확인할 수 있습니다.

더욱 랜덤한 포레스트-익스트림 랜덤 트리(ExtraTreesClassifier)

파이썬 라이브러리를을 활용한 머신러닝‘ 2장의 지도학습에서 대표적인 앙상블 모델로 랜덤 포레스트를 소개하고 있습니다. 랜덤 포레스트는 부스트랩 샘플과 랜덤한 후보 특성들을 사용해 여러개의 결정 트리decision tree를 앙상블 합니다. 그래서 훈련 데이터에 과대적합을 막아주고 모델의 일반화 성능이 항상 단일 트리보다 높습니다. 랜덤 포레스트 모델의 변종으로 익스트림 랜덤 트리extremely randomized trees 혹은 엑스트라 트리ExtraTrees라 부르는 모델이 있습니다. 엑스트라 트리는 포레스트 트리의 각 후보 특성을 무작위로 분할하는 식으로 무작위성을 증가 시킵니다. Scikit-Learn은 앙상블 패키지 안에 엑스트라 트리 모델을 제공합니다.

from sklearn.ensemble import ExtraTreesClassifier

​RandomForestClassifier 클래스가 사용하는 결정 트리는 DecisionTreeClassifier입니다. 이에 반해 ExtraTreesClassifier가 사용하는 결정 트리는 ExtraTreeClassifier입니다. 이름이 매우 비슷하니 유의하세요. ExtraTreesClassifier의 매개변수는 RandomForestClassifier와 동일합니다. 책에서와 같이 make_moons 데이터셋에 엑스트라 트리를 학습시켜 보겠습니다.

X, y = make_moons(n_samples=100, noise=0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, 
                                                    random_state=42)

xtree = ExtraTreesClassifier(n_estimators=5, random_state=2)
xtree.fit(X_train, y_train)

엑스트라 트리가 사용하는 ExtraTreeClassifier()의 기본값으로 베이스 트리가 만들어 집니다. 랜덤 포레스트와 같이 베이스 모델을 직접 만들어 주입할 수는 없습니다. 엑스트라 트리가 만든 베이스 트리와 전체의 결정 경계를 그려 보겠습니다.

extratrees

그래프에서 볼 수 있듯이 랜덤 포레스트가 만든 것보다 두 클래스의 경계를 잘 구분하고 있습니다. 사실 엑스트라 트리의 베이스 트리인 ExtraTreeClassifier는 DecisionTreeClassifier를 상속한 것이며 splitter=’best’가 아니고 splitter=’random’인 것과 max_features=’auto’인 것을 제외하고는 동일합니다.

이번에는 cancer 데이터셋에 적용해 보겠습니다.

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, 
                                                    random_state=0)
xtree = ExtraTreesClassifier(n_estimators=100, random_state=0)
xtree.fit(X_train, y_train)

print("훈련 세트 정확도: {:.3f}".format(xtree.score(X_train, y_train)))
print("테스트 세트 정확도: {:.3f}".format(xtree.score(X_test, y_test)))

훈련 세트 정확도: 1.000
테스트 세트 정확도: 0.972

훈련 세트와 테스트 세트에서의 정확도는 랜덤 포레스트와 동일합니다. 하지만 특성 중요도를 그려보면 차이점을 발견할 수 있습니다.

extratree_feature_importance_

이 그래프에서 볼 수 있듯이 엑스트라 트리가 랜덤 포레스트 보다 전반적으로 특성의 중요도를 더 높게 평가하고 있습니다. 이는 엑스트라 트리가 더 폭넓은 시각으로 특성들을 평가한다고 생각할 수 있습니다. 단일 결정 트리에서는 ‘worst radius’가 거의 독점적으로 주요한 특성으로 평가되었지만 랜덤 포레스트는 ‘worst perimeter’가 더 높았고 ‘worst area’는 훨씬 더 낮게  나왔습니다. 이에 비해 엑스트라 트리는 ‘worst area’, ‘worst perimeter’, ‘worst radius’, ‘mean concavity’ 등의 특성 중요도가 비교적 고르게 나온 것을 볼 수 있습니다.

당연히 회귀에 대응하는 엑스트라 트리인 ExtraTreesRegressor도 있습니다. ExtraTreesClassifier와 ExtraTreesRegressor의 매개변수 기본값은 부스트랩 샘플을 사용하지 않도록 bootstrap=False인 것을 제외하고는 랜덤 포레스트와 동일합니다. 이 포스트의 코드는 깃허브(https://github.com/rickiepark/introduction_to_ml_with_python/blob/master/ExtraTreesClassifier.ipynb)에서 확인하실 수 있습니다.

New Jupyter Environment: Colaboratory

구글이 회사 내부에서 사용하고 있던 주피터 노트북의 커스텀 버전인 Colaboratory를 공개하였습니다. Colaboratory는 연구와 교육의 목적으로 개발되었다고 합니다. https://colab.research.google.com에 접속하면 샘플 노트북이 로드되는데요. 주피터 커널이 연결되어 있지 않은 상태입니다. 커널을 연결하기 위해서 권한을 요청하면 하루 정도 지나서 메일로 승인이 되었다는 안내를 받을 수 있습니다.

Colab에서 노트북을 생성한 후에 구글 드라이브에 저장을 할 수가 있습니다. 또한 구글 드라이브에서 새 문서 버튼을 통해 Colab 노트북을 직접 만들 수도 있습니다. 또 로컬 컴퓨터에 있는 주피터 노트북을 업로드해서 다른 사람과 공유할 수도 있습니다. 막다운markdown과 라텍LaTex도 물론 지원됩니다. 또 좀 더 편리한 텍스트 셀을 제공하고 있습니다.

스크린샷 2017-10-26 오전 11.40.12

Colab 노트북의 최대 크기는 20M까지입니다. Python 2.7만 지원하고 R이나 Scala는 아직 지원하고 있지 않습니다. 재미있는 것은 대부분의 파이썬의 과학 패키지는 최신 버전을 유지하고 있는데 텐서플로와 Scikit-Learn의 버전이 좀 뒤쳐져 있네요. 하지만 스터디나 튜토리얼 세션 등에는 유용하게 사용될 수 있을 것 같습니다. 🙂

스크린샷 2017-10-26 오전 10.58.27

Andrew Ng launch New DL Courses!

바이두에서 나온 앤드류 응이 세가지 프로젝트를 진행한다고 합니다. 그 중에 먼저 첫 번째로 선을 보이는 것deeplearning.ai로 예고했던 코세라의 Deep Learning Specialization 코스입니다! 파이썬과 텐서플로를 사용하는 이 커리큘럼은 총 다섯개의 코스로 이루어져 있습니다.

  1. Neural Networks and Deep Learning
  2. Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
  3. Structuring Machine Learning Projects
  4. Convolutional Neural Networks
  5. Sequence Models

작년부터 시작한 코세라의 구독 모델이 적용되는 specialization으로 월 $49를 내고 빠른 속도(!)로 주파를 하면 Certificate를 받을 수 있습니다. 돈을 내지 않고 청강을 할 수도 있는데요. 각 코스의 링크로 직접 들어가서 Enroll을 하면 팝업 화면 아래 조그맣게 쓰인 Audit 링크를 누르시면 됩니다. 자세히는 아직 모르지만 전체 커리큘럼의 수준은 intermediate 정도로 보입니다.

deeplearningai

눈에 익은 책상과 모니터네요! 🙂

SciPy 2017

파이썬 과학 컴퓨팅 컨퍼런스인 SciPy 2017이 텍사스주 오스틴에서 지난 10~16일에 열렸습니다. 올해에도 풍성한 토크튜토리얼 동영상이 유투브에 공개되었습니다. 이 중에 눈에 띄는 몇 개를 골라 보았습니다.

이 외에도 다양한 주제에 대한 여러 동영상이 많이 올라와 있습니다. 전체 리스트를 확인해 보세요.