[핸즈온 머신러닝] 업데이트 안내해 드립니다.

핸즈온 머신러닝” 도서의 수정 사항에 대해 안내해 드립니다. 최근 원서 깃허브에 여러가지 내용이 추가 되어서 이를 번역서 깃허브에 반영하였습니다. 본문 내용에 영향이 있는 것은 에러타로 등록하였습니다. 도서를 구매하셨다면 꼭 확인 부탁드립니다. 주요한 변경 사항은 다음과 같습니다.

  • 7장의 연습문제 8, 9번의 답이 추가되었습니다.
  • 16장의 연습문제 8번의 답이 추가되었습니다.
  • 2장 3장에 범주형 변수의 인코딩을 위해 OrdinalEncoder와 OneHotEncoder를 사용하는 예가 추가되었습니다(사이킷런 0.20에 추가될 예정인 CategoricalEncoder가 두 개의 클래스로 리팩토링되었습니다). 그리고 두 클래스를 future_encoders.py 로 분리했습니다.
  • 2장에 신뢰 구간을 구하는 예가 추가되었습니다.
  • 7장에 XGBoost 예가 추가되었습니다.
  • 10장에 tf.contrib.learn 외에 tf.estimator를 사용한 예가 추가되었습니다.
  • 12장에 tf.data 를 사용한 예가 추가되었습니다.
  • 16장에 넘파이 배열을 사용한 재현 메모리 구현 예가 추가되었습니다.
  • tf.examples.tutorials.mnist 가 deprecated 될 예정이므로 Keras에 포함된 MNIST 함수를 사용하도록 바꾸었습니다.
  • 텐서보드를 주피터 노트북에 표현하기 위해 추가했던 코드를 tensorflow_graph_in_jupyter.py 파일로 분리했습니다.
  • 9장에 있던 자동 미분 예를 extra_autodiff.ipynb로 분리했습니다. 이 노트북의 번역을 완료하여 업데이트했습니다.

아직 번역하지 못한 extra 노트북이 여러개 남아 있습니다. 꾸준히 작업하고 있으니 조금만 기다려 주세요. 감사합니다!

머신러닝 Yearning 01~27

앤드류 응Andrew Ng 박사가 쓰고 있던 머신러닝 Yearning이 잠시 업데이트가 없었습니다. 코세라Courseradeeplearning.ai 강좌 때문이었다고 하네요. 강의 개발을 모두 끝내고 나서 다시 드래프트 버전을 업데이트하고 있습니다. 총 55개의 챕터가 쓰여질 예정인데 현재 27개의 챕터가 완료되었습니다. 아직 못 보신 분 들을 위해 지금까지 업데이트된 PDF를 모아서 블로그에 올려 놓았습니다!(다운로드) 🙂

(업데이트) 28~30장이 릴리즈되었습니다!(Ng_MLY05), 31~32장이 릴리즈되었습니다!(Ng_MLY06), 33-35장이 릴리즈되었습니다!(Ng_MLY07), 36-39장이 릴리즈되었습니다!(Ng_MLY08), 40~43장이 릴리즈되었습니다!(Ng_MLY09), 44~46장이 릴리즈되었습니다!(NG_MLY10), 47~49장이 릴리즈되었습니다!(NG_MLY11), 50~52장이 릴리즈되었습니다!(Ng_MLY12)

TensorFlow 1.8.0 Release

텐서플로 1.8.0 버전이 릴리즈되었습니다. 눈에 띄이는 것은 그래디언트 부스팅 모델(BoostedTreesClassifier, BoostedTreesRegressor)이 estimator 아래 추가되어 사용하기 편리해진 것입니다. ‘핸즈온 머신러닝‘을 출간하자마자 모든 노트북을 다시 실행해야겠네요. 🙂

자세한 변경 내용은 릴리즈 노트를 참고하세요. 이전과 마찬가지로 pip 명령으로 간단히 설치할 수 있습니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

PyTorch 0.4.0 Release

파이토치PyTorch 0.4.0 버전이 릴리즈되었습니다. 많은 기능이 추가되고 개선되었다고 합니다. 그중에서도 눈에 띄이는 것은 텐서(Tensor)와 변수(Variable)를 하나로 합친 것과 checkpoint 컨테이너입니다. checkpoint 컨테이너를 사용해 모델을 나누어 만들면 메모리가 부족하여 정방향에서 계산한 값을 유지하지 못할 경우 역전파를 위해 가까운 체크포인트에서부터 정방향 패스의 중간 값들을 다시 계산합니다. 수행시간은 느려지겠지만 메모리가 작은 GPU를 사용하는 경우에는 아주 반가운 소식입니다! 또 한가지는 드디어 윈도우즈 지원이 됩니다! 다만 윈도우즈는 파이썬 3.5와 3.6 만을 지원합니다.

더 자세한 변경사항은 릴리즈 노트를 참고하세요. 설치할 때 conda 대신에 pip를 사용할 수도 있습니다. 윈도우즈에서 pip로 설치할 경우는 wheel 패키지 경로를 직접 지정해 주어야 합니다.

# macOS (no GPU)
$ conda install pytorch torchvision -c pytorch

# Linux CUDA 8.0
$ conda install pytorch torchvision -c pytorch
# Linux CUDA 9.0
$ conda install pytorch torchvision cuda90 -c pytorch
# Linux CUDA 9.1
$ conda install pytorch torchvision cuda91 -c pytorch
# Linux CPU
$ conda install pytorch-cpu torchvision -c pytorch

# Windows CUDA 8.0
$ conda install pytorch -c pytorch
# Windows CUDA 9.0
$ conda install pytorch cuda90 -c pytorch
# Windows CUDA 9.1
$ conda install pytorch cuda91 -c pytorch
# Windows CPU
$ conda install pytorch-cpu -c pytorch
# pip를 사용할 때 wheel 경로
# 파이썬 3.5, CUDA 8.0: http://download.pytorch.org/whl/cu80/torch-0.4.0-cp35-cp35m-win_amd64.whl
# 파이썬 3.5, CUDA 9.0: http://download.pytorch.org/whl/cu90/torch-0.4.0-cp35-cp35m-win_amd64.whl
# 파이썬 3.5, CUDA 9.1: http://download.pytorch.org/whl/cu91/torch-0.4.0-cp35-cp35m-win_amd64.whl
# 파이썬 3.5, CPU: http://download.pytorch.org/whl/cpu/torch-0.4.0-cp35-cp35m-win_amd64.whl
# 파이썬 3.6, CUDA 8.0: http://download.pytorch.org/whl/cu80/torch-0.4.0-cp36-cp36m-win_amd64.whl
# 파이썬 3.6, CUDA 9.0: http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-win_amd64.whl
# 파이썬 3.6, CUDA 9.1: http://download.pytorch.org/whl/cu91/torch-0.4.0-cp36-cp36m-win_amd64.whl
# 파이썬 3.6, CPU: http://download.pytorch.org/whl/cpu/torch-0.4.0-cp36-cp36m-win_amd64.whl
# Windows 공통
$ pip3 install torchvision

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

‘핸즈온 머신러닝’이 출간되었습니다.

b9267655530_lHands-On Machine Learning with Scikit-Learn & TensorFlow의 번역서 ‘핸즈온 머신러닝‘이 출간되었습니다!

그 동안 이 작업을 하면서 많은 것을 배웠습니다. 모쪼록 다른 누군가에게도 도움이 된다면 다행입니다.

원래 번역서 제목이 ‘사이킷런과 텐서플로를 활용한 머신러닝, 딥러닝 실무’ 정도로 예상되었는데 출간 직전에 ‘핸즈온 머신러닝’으로 변경되었습니다. 개인적으로는 단순하고 평소에도 부르는 이름이라 만족입니다. 🙂 혹시 이 책에 관해 궁금한 점 있으면 언제든지 댓글이나 메일 주세요.

마지막으로 책을 만드는 데 도움을 주신 많은 분들께 다시 한번 감사드립니다.

(저자 오렐리앙도 아주 기뻐하네요. ㅎ)

TensorFlow 1.8.0 RC0 Release

텐서플로 1.8.0 RC0 버전이 릴리즈되었습니다. 1.7.0 버전이 나온지 보름만이네요. 자세한 변경 내용은 릴리즈 노트를 참고하세요. 이전과 마찬가지로 1.8.0 RC0 버전은 pip 명령으로 간단히 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

(업데이트) 1.8.0 RC1 버전이 릴리즈되었습니다.

TensorFlow 1.7.0 Release

텐서플로 1.7.0 버전이 릴리즈되었습니다. RC 버전에서 소개되었던 기능과 큰 변화는 없는 것 같습니다. tf.contrib.learn 하위의 모든 모듈들이 삭제될 예정입니다. 자세한 내용은 깃허브 문서를 참고하세요. 버전 1.7.0의 자세한 변경 내용은 릴리즈 노트를 참고하세요.

1.7.0 버전은 pip 명령으로 간단히 설치할 수 있습니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

결정 트리와 불순도에 대한 궁금증

이 글은 세바스찬 라쉬카의 머신러닝 FAQ 글(Why are implementations of decision tree algorithms usually binary and what are the advantages of the different impurity metrics?)을 번역한 것입니다.

결정 트리 알고리즘은 왜 이진 트리로 구현되어 있을까요? 각 불순도 지표들의 장점은 무엇인가요?

현실적인 이유로(조합의 폭발적인 증가combinatorial explosion) 대부분의 라이브러리들은 결정 트리를 이진 트리로 구현합니다. 좋은 점은 이진 트리가 NP-완전 문제NP-complete라는 것입니다(Hyafil, Laurent, and Ronald L. Rivest. “Constructing optimal binary decision trees is NP-complete.” Information Processing Letters 5.1 (1976): 15-17.).

(CARTClassification And Regression Tree 알고리즘의) 목적 함수는 각 분할에서 정보 이득information gain(IG)을 최대화하는 것입니다:

IG(D_p, f) = I(D_p) - \sum_{j=1}^{m}\dfrac{N_j}{N}I(D_j)

는 분할에 사용되는 특성이고 D와 D는 각각 부모 노드와 번째 자식 노드의 데이터셋입니다. 는 불순도 지표입니다. N 은 샘플의 전체 개수이고 Njj 번째 자식 노드의 샘플 개수입니다. 이제 분류에서 가장 널리 사용되는 (CART 알고리즘의) 분할 기준을 살펴 보겠습니다. 간단하게 이진 분할로 식을 표현하지만 당연히 다중 분할로 일반화될 수 있습니다. 이진 분할에 대한 IG 는 다음과 같이 계산합니다:

IG(D_p, a) = I(D_p) - \dfrac{N_{left}}{N}I(D_{left}) - \dfrac{N_{right}}{N}I(D_{right})

이진 결정 트리에서 가장 널리 사용되는 불순도 지표 또는 분할 기준은 지니 불순도Gini impurity(IG)와 엔트로피Entropy(IH)와 분류 오차Classification Error(IE)입니다. 엔트로피의 정의부터 살펴보죠. 다음과 같습니다.

I_H(t) = - \sum_{i=1}^c p(i|t)\,log_2\,p(i|t)

클래스에 샘플이 하나라도 있다면

p(i|t) \ne 0

이고 p(i|t) 는 특정 노드 t 에서 클래스 c 에 속한 샘플의 비율입니다. 그러므로 한 노드의 샘플이 모두 동일한 클래스에 속한다면 엔트로피는 0입니다. 클래스 별로 균등하게 분포되어 있다면 당연하게 엔트로피는 최대가 됩니다. 지니 불순도는 잘 못 분류될 확률을 최소화시키려는 기준으로 생각할 수 있습니다.

I_G(t) = \sum_{i=1}^c p(i|t)(1-p(i|t)) = 1 - \sum_{i=1}^c p(i|t)^2

엔트로피와 비슷하게 지니 불순도는 클래스가 균일하게 섞여 있을 때 최대가 됩니다. 그러나 실제로 지니 불순도와 엔트로피는 매우 비슷한 결과를 만들며 불순도 기준을 사용하여 트리를 평가하는데 시간을 들이는 것보다 가지치기pruning 방식을 바꿔보는 것이 더 낫습니다. 또 다른 불순도 지표는 분류 오차입니다.

I_E = 1 - \text{max}\{ p(i|t) \}

가지치기에는 좋은 지표지만 노드의 클래스 확률 변화에 덜 민감하기 때문에 결정 트리를 구성하는데는 적합하지 않습니다.

overview-plot

분류 오차가 클래스 확률 변화에 왜 덜 민감한지 보기 위해 다음 그림에서 두 개의 분할 사례를 살펴 보겠습니다.

split

클래스 1에 40개의 샘플, 클래스 2에 40개의 샘플을 가진 부모 노드의 데이터셋 Dp 를 각각 두 개의 데이터셋 Dleft 와 Dright 로 나누었습니다. 분류 오차를 분할 기준으로 사용했을 때 정보 이득은 AB 의 경우 모두 같습니다(IGE = 0.25):

I_E(D_p) = 1 - \text{max}(0.5 + 0.5) = 0.5

A:

I_E(D_{left}) = 1 - \text{max}(0.75, 0.25) = 0.25

I_E(D_{right}) = 1 - \text{max}(0.25, 0.75) = 0.25

IG_E = 0.5 - \dfrac{40}{80}\times0.25-\dfrac{40}{80}\times0.25 = 0.25

B:

I_E(D_{left}) = 1 - \text{max}(\dfrac{20}{60},\dfrac{40}{60}) = \dfrac{1}{3}

I_E(D_{right}) = 1 - \text{max}(1, 0) = 0

IG_E = 0.5 - \dfrac{60}{80}\times\dfrac{1}{3}-\dfrac{20}{80}\times0 = 0.25

하지만 지니 불순도 기준의 IG는 A(0.125) 보다 B(0.1666) 가 더 순수하기 때문에 높습니다.

I_G(D_p) = 1 - (0.5^2 + 0.5^2) = 0.5

A:

I_G(D_{left}) = 1 - \left( \left(\dfrac{3}{4}\right)^2 + \left(\dfrac{1}{4}\right)^2 \right) = \dfrac{3}{8} = 0.375

I_G(D_{right}) = 1 - \left( \left(\dfrac{1}{4}\right)^2 + \left(\dfrac{3}{4}\right)^2 \right) = \dfrac{3}{8} = 0.375

IG_G = 0.5 - \dfrac{40}{80}\times0.375 - \dfrac{40}{80}\times0.375 = 0.125

B:

I_G(D_{left}) = 1 - \left( \left(\dfrac{2}{6}\right)^2 + \left(\dfrac{4}{6}\right)^2 \right) = \dfrac{4}{9}

I_G(D_{right}) = 1 - \left( \left(\dfrac{2}{2}\right)^2 + \left(\dfrac{0}{2}\right)^2 \right) = 1 - 1 = 0

IG_G = 0.5 - \dfrac{60}{80}\times\dfrac{4}{9} - \dfrac{40}{80}\times0 = 0.1666

비슷하게 엔트로피 기준은 A(0.19) 보다 B(0.31)를 선호합니다.

I_H(D_p) = - (0.5\,log_2\,(0.5) + 0.5\,log_2(0.5)) = 1

A:

I_H(D_{left}) = - \left( \dfrac{3}{4}\,log_2\left(\dfrac{3}{4}\right) + \dfrac{1}{4}\,log_2\left(\dfrac{1}{4}\right) \right) = 0.81

I_H(D_{right}) = - \left( \dfrac{1}{4}\,log_2\left(\dfrac{1}{4}\right) + \dfrac{3}{4}\,log_2\left(\dfrac{3}{4}\right) \right) = 0.81

IG_H = 1 - \dfrac{40}{80}\times0.81 - \dfrac{40}{80}\times0.81 = 0.19

B:

I_H(D_{left}) = - \left( \dfrac{2}{6}\,log_2\left(\dfrac{2}{6}\right) + \dfrac{4}{6}\,log_2\left(\dfrac{4}{6}\right) \right) = 0.92

I_H(D_{right}) = - \left( \dfrac{2}{2}\,log_2\left(\dfrac{2}{2}\right) + \dfrac{0}{2}\,log_2\left(\dfrac{0}{2}\right) \right) = 0

IG_G = 1 - \dfrac{60}{80}\times0.92 - \dfrac{40}{80}\times0 = 0.31

지니 불순도와 엔트로피에 대해 덧붙이자면 위에 언급한 것처럼 만들어진 트리는 실제 매우 비슷합니다. 지니 불순도의 장점은 로그를 계산할 필요가 없어서 구현 성능이 조금 더 낫다는 것입니다.

옮긴이: 위 그림을 보면 엔트로피보다 지니 불순도 방식이 불순도 값을 줄이기 위해 더 클래스 확률을 낮추어야 함을 알 수 있습니다. 즉 엔트로피 방식이 조금 더 균형잡힌 트리를 만들 가능성이 높습니다. scikit-learn의 DecisionTreeClassifier와 DecisionTreeRegressor 및 이들을 사용하는 랜덤 포레스트와 그래디언트 부스팅에서 특성 중요도 속성은(feature_importances_) 트리가 분할에 사용한 특성별로 발생되는 모든 정보 이득을 더하고 전체 특성 중요도의 합이 1이 되도록 정규화한 것입니다.

TensorFlow 1.7.0 RC0 Release

텐서플로 1.7.0 RC0 버전이 릴리즈되었습니다. 정말 빠르네요. 🙂

eager execution이 contrib에서 메인으로 올라왔고 custom_gradient, regex_replace와 같은 새로운 기능이 추가되었습니다. sqlite 데이터베이스에서 데이터를 읽을 수 있고 텐서보드 디버거 플러그인도 함께 포함되는 등 많은 기능이 추가되고 여러 버그가 수정되었네요. 조금 더 자세한 내용은 릴리즈 노트를 참고해 주세요. 1.7.0 RC0 버전은 다음과 같이 pip 명령으로 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

(업데이트) 텐서플로 1.7.0 RC1 버전이 릴리즈되었습니다.