글쓴이 보관물: 박해선

[사이킷런 정주행] 1. LinearRegression

선형 회귀

회귀는 연속적인 타깃을 예측하는 알고리즘입니다. 그 중에 선형 회귀Linear Regression가 가장 기본입니다. 선형 회귀는 훈련 데이터에 가장 잘 들어 맞는 선형 방정식

\hat{y}=w_1 \times x_1+w_1 \times x_1+\cdots+w_n \times x_n+b

를 찾는 문제입니다. 여기에서 n은 훈련 데이터에 있는 특성의 수입니다.

편의상 bw_0으로 바꾸어 하나의 벡터 \bold{w}로 나타내겠습니다. \bold{w}에 포함된 w_0에 대응하기 위해 훈련 데이터에 x_0=1을 추가하여 벡터 \bold{x}를 정의합니다. 이제 이 선형 방정식은

\hat{y} =\begin{pmatrix} w_0 & w_1 & \cdots & w_n \end{pmatrix}\cdot\begin{pmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{pmatrix} =\bold{w}^T\bold{x}

와 같이 간단히 쓸 수 있습니다. 훈련 샘플이 하나가 아니라 여러개이므로 벡터 \bold{x}를 다음과 같이 행렬로 확장할 수 있습니다. 벡터는 굵은 소문자, 행렬은 굵은 대문자를 사용합니다. 여기에서 m은 훈련 샘플의 수입니다.

\bold{\hat{y}} =\begin{pmatrix}   x_0^1 & x_1^1 & \cdots & x_n^1 \\   x_0^2 & x_1^2 & \cdots & x_n^2 \\   \vdots \\   x_0^m & x_1^m & \cdots & x_n^m \end{pmatrix} \cdot \begin{pmatrix} w_0 \\ w_1 \\ \cdots \\ w_n \end{pmatrix} =\begin{pmatrix}   \bold{x}^1 \\   \bold{x}^2 \\   \vdots \\   \bold{x}^m \end{pmatrix} \cdot \begin{pmatrix} w_0 \\ w_1 \\ \cdots \\ w_n \end{pmatrix} =\bold{X} \bold{w}

얼마나 잘 들어 맞는지를 측정 방법으로는 평균 제곱 오차Mean Square Error, MSE를 사용합니다.

\text{MSE} =\frac{1}{m} (\bold{y}-\bold{\hat{y}})^2 =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^2

이런 측정 함수를 비용 함수cost function이라고 부릅니다. 선형 회귀의 비용 함수인 평균 제곱 오차를 최소화하는 선형 방정식의 \bold{w}를 찾아야 합니다. 해석적인 방법으로 해를 구할 수 있습니다. 비용 함수를 미분하여 도함수가 0이 되는 점을 찾습니다. 먼저 MSE 비용 함수를 간단한 식으로 표현하겠습니다.

\text{MSE} =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^2 =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^T(\bold{y}-\bold{X}\bold{w}) \\ \\ =\frac{1}{m} (\bold{y}^T\bold{y}-\bold{y}^T\bold{X}\bold{w}-\bold{w}^T\bold{X}^T\bold{y}+\bold{w}^T\bold{X}^T\bold{X}\bold{w}) =\frac{1}{m} (\bold{y}^T\bold{y}-2\bold{w}^T\bold{X}^T\bold{y}+\bold{w}^T\bold{X}^T\bold{X}\bold{w})

\frac{1}{m}은 미분 결과에 영향을 미치지 않으므로 제외하고 \bold{w}에 대해 미분합니다.

\frac{\partial}{\partial \bold{w}}\text{MSE} =-2\bold{X}^T\bold{y}+2\bold{X}^T\bold{X}\bold{w}

이 도함수가 0이 되는 \bold{w}는 다음과 같습니다. 이 식을 정규 방정식Normal Equation이라고 합니다.

\bold{w}=(\bold{X}^T\bold{X})^{-1}\bold{X}^T\bold{y}

샘플 데이터

사이킷런에 포함된 샘플 데이터 중 캘리포니아 주택 가격 데이터셋을 사용하겠습니다.

import sklearn
import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing

fetch_california_housing()함수를 호출하여 사이킷런의 Bunch 클래스 객체를 얻습니다. 캘리포니아 주택가격 데이터셋은 전체 샘플 개수가 20,640개이고 8개의 특성을 가집니다.

housing = fetch_california_housing()
print(housing.data.shape, housing.target.shape)
(20640, 8) (20640,)

train_test_split() 함수를 사용해서 75%는 훈련 세트로 25%는 테스트 세트로 분리합니다. 편의상 그래프로 나타내기 편하도록 하나의 특성만 사용하겠습니다. 사이킷런의 모델은 훈련 데이터가 2차원 배열일 것으로 예상합니다. 따라서 housing.data 에서 하나의 특성만 선택하더라도 2차원 배열이 되도록 넘파이 슬라이싱을 사용했습니다. 여기서는 첫 번째 특성만 사용합니다.

X_train, X_test, y_train, y_test = train_test_split(housing.data[:, 0:1], 
                                                    housing.target, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
(15480, 1) (5160, 1) (15480,) (5160,)
계속 읽기

Spinning Up in Deep RL

OpenAI에서 강화 학습 교육 자료인 스피닝 업(Spinning Up)을 공개했습니다. 깃허브에서 관련 코드도 같이 제공됩니다. 아래 알고리즘 트리 중에서 스피닝 업에서 다루는 것은 Policy Gradient, PPO, TRPO, DDPG, TD3, SAC입니다.

rl_alg.tree.png

OpenAI에서 스피닝 업을 만들게 된 이유가 강화 학습을 배우기 위한 적절한 자료가 없기 때문이라고 합니다. 곰곰히 생각해 보면 일리가 있습니다. 딥러닝 관련되어서는 좋은 책과 온라인 자료를 쉽게 찾을 수 있지만 강화 학습은 많이 부족합니다. <핸즈온 머신러닝> 16장에서 강화 학습을 다루고 있지만 제한된 범위입니다. 서튼(Sutton) 교수의 <Reinforcement Learning: An Introduction> 2판이 곧 출간될 예정입니다. 이 책은 강화 학습의 대표적인 텍스트 북입니다. 조금 더 핸즈온 스타일의 강화 학습 책으로는 어떤 것이 있는지 찾아 보았습니다.

71y3a2bdjf3l  zai-drl-meap-hi  morales_drl_hiresmeap

맥심 라판(Maxim Lapan)이 쓴 팩킷(Packt)의 <Deep Reinforcement Learning Hands-On>이 아마존에서 독자 반응이 좋습니다. 이 책은 DQN, Policy Gradient, A2C, A3C, TRPO, PPO, I2A, AlphaGo Zero 등을 다룹니다.

매닝에서는 <Deep Reinforcement Learning In Action>과 <Grokking Deep Reinforcement Learning>이 준비되고 있습니다. 매닝 책은 출간되려면 아직 한참 기다려야 할 것 같네요. 재미있게도 이 세 책은 모두 파이토치를 사용합니다. 🙂

TensorFlow 1.12.0 Release

텐서플로 1.12.0 버전이 릴리스되었습니다. 케라스 모델이 SavedModel 포맷(via tf.contrib.saved_model.save_keras_model())과 tf.data.Dataset을 지원합니다.

텐서플로 1.12.0 버전은 pip 명령으로 손쉽게 설치할 수 있습니다. 파이썬 2.7, 3.3, 3.4(이상 윈도우즈 제외), 3.5, 3.6 버전을 지원합니다.

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

CPU 사용자를 위한 conda 텐서플로 패키지는 아직 1.12.0 버전이 준비되지 않았습니다. 🙂

사이킷런 코리아 페이스북 그룹을 소개합니다.

scikit-learn-logo텐서플로 코리아, 케라스 코리아, 파이토치 코리아 등 유명 딥러닝 라이브러리들의 페이스북 그룹이 있습니다. 불현듯 생각해 보니 사이킷런은 페이스북 그룹이 없더라구요. 한국에 사이킷런 관련 커뮤니티가 어디엔가 있을런지 모르겠지만 페이스북에 없는 것 같아 제가 하나 만들었습니다! 사이킷런 코리아 페이스북 그룹에 가입하시면 다양한 정보를 얻으실 수 있을 거에요. 놀러 오세요! 🙂

pip install tensorflow vs conda install tensorflow

tensorflowtraining

아나콘나(Anaconda)의 텐서플로가 1.9.0 버전부터 MKL-DNN 라이브러리를 사용하여 패키징되었습니다. 이 때문에 pip에 등록된 텐서플로 패키지보다 몇 배 빠르다고 합니다(미디엄 포스트, 아나콘다 블로그). 물론 CPU를 사용할 경우에 국한된 이야기입니다. 아나콘다에 포함된 파이썬 과학 패키지들이 MKL 라이브러리의 덕을 보는데요. 이제 텐서플로도 해당되는 것 같습니다. 앞으로는 CPU 텐서플로 설치 안내에 꼭 아나콘다도 포함해야 겠네요. 🙂

“핸즈온 머신러닝” 사이킷런 0.20 업데이트

사이킷런 0.20 버전에 맞추어 <핸즈온 머신러닝> 도서에 반영될 내용을 정리하였습니다. 깃허브 주피터 노트북에는 더 많은 내용이 반영되어 있습니다! 🙂

  • sklearn.preprocessing.Imputer 클래스는 사이킷런 0.22 버전에서 삭제될 예정입니다. 대신 0.20 버전에서 추가된 sklearn.impute.SimpleImputer 클래스로 변경합니다.
    • (p100) 두 번째 문단 시작 부분에 “사이킷런의 Imputer는 누락된 … 지정하여 Imputer의 객체를 생성합니다.”를 “사이킷런의 SimpleImputer는 누락된 … 지정하여 SimpleImputer의 객체를 생성합니다.”로 변경합니다. 첫 번째 코드 블럭에서
      from sklearn.preprocessing import Imputer
      imputer = Imputer(strategy=”median”)

      from sklearn.impute import SimpleImputer
      imputer = SimpleImputer(strategy=”median”)
      로 변경합니다.
    • (p101) 주석 34의 첫 문장에서 ‘(예를 들면 Imputer(strategy=”median”) )’를 ‘(예를 들면 SimpleImputer(strategy=”median”) )’로 변경합니다.
    • (p108, 109) 파이프라인 정의 코드에서 ‘Imputer(strategy=”median”)’을 ‘SimpleImputer(strategy=”median”)’로 변경합니다.
  • OneHotEncoder 클래스가 종전에는 훈련 데이터에 나타난 0~최댓값 사이 범위를 카테고리로 인식하여 원-핫 인코딩하지만 앞으로는 고유한 정수 값 또는 문자열을 원-핫 인코딩할 수 있습니다. 정수 특성과 문자열 특성이 함께 있는 경우에는 에러가 발생합니다. 경고 메세지를 피하고 고유한 값을 사용하는 방식을 선택하기 위해 categories 매개변수를 'auto'로 지정합니다.
    • (p103) 마지막 코드 블럭에서 encoder = OneHotEncoder()를 encoder = OneHotEncoder(categories='auto')로 변경합니다.
  • 0.22 버전에서 RandomForestClassifierRandomForestRegressor 모델의 n_estimators 기본값이 10에서 100으로 늘어납니다. 경고 메세지를 피하기 위해 명시적으로 트리 개수를 10으로 지정합니다.
    • (p114, p116) 코드 블럭에서 RandomForestRegressor()를 RandomForestRegressor(n_estimators=10)으로 변경합니다.
    • (p139, p244) 코드 블럭에서 RandomForestClassifier()를 RandomForestClassifier(n_estimators=10)으로 변경합니다.
  • 공개된 훈련 데이터를 다운로드 받는 fetch_mldata 함수가 mldata.org 사이트의 잦은 에러로 openml.org 를 사용하는 fetch_openml 함수로 변경되었습니다.
    • (p124) mnist = fetch_mldata('MNIST original')을 mnist = fetch_openml('mnist_784', version=1)로 변경합니다. openml.org의 MNIST 타깃 데이터는 문자열로 저장되어 있으므로 mnist.target = mnist.target.astype(np.int)와 같이 정수로 바꾸는 것이 좋습니다.
  • 사이킷런 0.22 버전에서 LogisticRegression 클래스의 solver 매개변수 기본값이 'liblinear'에서 'lbfgs'로 변경될 예정입니다. 경고 메세지를 피하고 출력 결과를 일관되게 유지하기 위하여 solver 매개변수를 'liblinear'로 설정합니다.
    • (p192, p244) LogisticRegression()을 LogisticRegression(solver='liblinear')로 변경합니다.
  • SVCSVR ​클래스의 gamma 매개변수 옵션에 'auto'외에 'scale'이 추가되었습니다. 'auto'는 1/n_features, 즉 특성 개수의 역수입니다. 'scale'은 1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 'auto'에서 'scale'로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 'scale'과 'auto'는 차이가 없습니다. 경고를 피하기 위해 명시적으로 'auto' 옵션을 지정합니다.
    • (p213) 맨 아래 코드 블럭에서 SVR(kernel="poly", degree=2, C=100, epsilon=0.1)SVR(kernel="poly", gamma='auto', degree=2, C=100, epsilon=0.1)로 변경합니다.
    • (p244) SVC()를 SVC(gamma='auto')로 변경합니다.
  • LinearSVC의 verbose 매개변수가 0이 아닐 때 max_iter 반복 횟수가 부족하면 경고 메세지가 출력됩니다. 사이킷런 0.20 버전부터는 verbose 매개변수에 상관없이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수 증가 경고가 나옵니다. 경고 메세지를 피하기 위해 max_iter 매개변수의 기본값을 1,000에서 2,000으로 증가시킵니다.
    • (p206) LinearSVC(C=10, loss="hinge")를 LinearSVC(C=10, loss="hinge", max_iter=2000)으로 변경합니다.

TensorFlow 1.12.0 RC0 Release

텐서플로 1.12.0 RC0 버전이 릴리스되었습니다. 1.11.0 버전이 나온지 한달도 되지 않았는데 정말 빠르네요. 심지어 1.11.0 버전에 맞추어 재실행한 <핸즈온 머신러닝> 주피터 노트북을 아직 커밋하기도 전입니다. 🙂

케라스 모델을 SavedModel 포맷으로 저장할 수 있어(via tf.contrib.saved_model.save_keras_model()) 텐서플로 서빙에 사용할 수 있는 점이 눈에 띄입니다. 텐서플로 1.12.0 RC0 버전은 pip 명령으로 손쉽게 설치할 수 있습니다. 파이썬 2.7(윈도우즈제외), 3.5, 3.6 버전을 지원합니다.

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

사이킷런 0.20 버전은 몇몇 버그를 수정한 0.20.1 버전이 릴리스될 것 같습니다. 🙂

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

(업데이트) 텐서플로 1.12.0 RC2 버전이 릴리스되었습니다.

Keras 2.2.4 Release

<케라스 창시자에게 배우는 딥러닝> 책이 출간되자 마자 공교롭게도 케라스 2.2.4 버전이 릴리스되었습니다. 🙂  2.2.4 버전은 며칠 전 릴리스된 2.2.3 버전의 버그 픽스입니다. 주요한 변경 사항은 2.2.3 버전에 담겨 있습니다. 몇 가지 눈에 띄이는 내용을 살펴 보겠습니다. 전체 변경 내용은 케라스 2.2.3 버전의 릴리스를 참고하세요.

  • 텐서플로 1.11.0의 Keras API와 통일하기 위해 ThresholdedReLULeakyReLU의 기능을 ReLU 클래스에 추가하였습니다. 이 때문에 ReLU 클래스에 두 개의 매개변수가 추가되었습니다. ThresholdedReLUtheta 매개변수 역할을 하는 thresholdLeakyReLUalpha 매개변수 역할을 하는 negative_slope입니다. 백엔드의 relu 함수에는 이미 alpha 매개변수가 있었기 때문에 threshold 매개변수만 추가되었습니다.
  • TensorBoard 콜백 클래스에 로깅 간격을 지정할 수 있는 update_freq 매개변수가 추가되었습니다. 기본값은 'epoch'로 이전과 동일하게 에포크마다 로그를 기록합니다. 'batch'는 배치마다 로그를 기록하고 정수를 입력하면 지정된 샘플 개수마다 로그를 기록합니다. tf.keras에는 아직 반영되지 않았습니다.
  • 다른 *Pooling2D 클래스처럼 MaxPooling1D, GlobalMaxPooling1D, AveragePooling1D, GlobalAveragePooling1D 에 data_format 매개변수가 추가되었습니다. data_format 매개변수의 값이 channels_last일 때 입력은 (batch_size, steps, features) 크기의 3D 텐서이고 channels_first일 때는 (batch_size, features, steps)입니다. 기본값은 channels_last입니다.
  • Conv2DTranspose 클래스에 아트루스 합성곱을 위한 dilation_rate 매개변수가 적용되었습니다.
  • EarlyStopping 콜백 클래스에 restore_best_weights 매개변수가 추가되었습니다. 이 매개변수를 True 지정하면 patience 에포크가 지난 후의 모델이 아니라 이전 모델 중에서 최선의 가중치로 설정된 모델이 반환됩니다. 기본값은 False 입니다.
  • 이전에는 무조건 float32 타입의 넘파이 배열을 반환했던 to_categorical 함수에 dtype 매개변수가 추가되었습니다. 'float64', 'int32' 등을 지정할 수 있으며 기본값은 'float32' 입니다.

“케라스 창시자에게 배우는 딥러닝”이 출간되었습니다.

keras_dl_b 케라스 창시자이자 구글 AI 연구원인 프랑소와 숄레(François Chollet)의 “Deep Learning with Python“의 번역서 <케라스 창시자에게 배우는 딥러닝>이 출간되었습니다! 온라인/오프라인 서점에서 판매(YES24교보문고) 중입니다.

이 책은 케라스를 사용하여 딥러닝의 기초와 다양한 실전 모델을 배울 수 있도록 안내합니다. 또 프랑소와의 딥러닝에 대한 견해와 전망을 엿볼 수 있습니다. 예제 코드는 깃허브에 공개되어 있습니다. 블로그에 실었던 원서에 대한 소개번역 후기도 참고하세요.

케라스의 새 버전에 맞추어 코드를 수정하고 에러타를 꾸준히 반영하겠습니다. 도서 메일링 리스트에 가입하면 편하게 에러타를 확인할 수 있습니다.

저자 프랑소와도 맘에 든다고 하네요! 🙂

책을 만드는 데 도움을 주신 많은 분들께 다시 한번 감사드립니다!

“파이썬 라이브러리를 활용한 머신러닝” 사이킷런 0.20 업데이트

사이킷런 0.20 버전이 릴리스되었습니다. <파이썬 라이브러리를 활용한 머신러닝> 도서에 영향을 미치는 부분을 정리하여 에러타로 등록하였습니다. 깃허브의 코드도 최신 라이브러리 버전에서 모두 재실행하여 커밋하였습니다. 자세한 변경 내용은 <파이썬 라이브러리를 활용한 머신러닝>의 에러타 페이지를 참고해 주세요. 다음은 주요 변경 내용입니다.

  • 사이킷런 0.19 버전 이하에서는 LinearSVC와 liblinear를 사용하는 LogisticRegression의 verbose 매개변수가 0이 아니고 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수를 증가하라는 경고 메세지가 나옵니다. 사이킷런 0.20 버전부터는 verbose 매개변수에 상관없이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수 증가 경고가 나옵니다. 경고 메세지를 피하기 위해 max_iter 매개변수의 기본값을 증가시킵니다.
  • 향후 사이킷런 0.22 버전에서 LogisticRegression 클래스의 solver 매개변수 기본값이 liblinear에서 lbfgs로 변경될 예정입니다. 사이킷런 0.20 버전에서 solver 매개변수를 지정하지 않는 경우 이에 대한 경고 메세지를 출력합니다. 경고 메세지를 피하고 출력 결과를 일관되게 유지하기 위하여 solver 매개변수를 liblinear로 설정합니다.
  • 사이킷런 0.20 버전에서 LogisticRegression의 multi_class 매개변수 옵션에 auto가 추가되었습니다. auto로 설정하면 이진 분류이거나 solver가 liblinear일 경우에는 ovr을 선택하고 그 외에는 multinomial을 선택합니다. 사이킷런 0.22 버전부터는 multi_class 매개변수의 기본값이 ovr에서 auto로 변경됩니다. 경고 메세지를 피하기 위해 명시적으로 ovr 옵션을 지정합니다.
  • 사이킷런 0.20 버전에서 SVC ​클래스의 gamma 매개변수 옵션에 auto외에 scale이 추가되었습니다. auto는 1/n_features, 즉 특성 개수의 역수입니다. scale은 1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 auto에서 scale로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 scale과 auto는 차이가 없습니다. 경고를 피하기 위해 명시적으로 auto 옵션을 지정합니다.
  • 사이킷런 0.22 버전에서 OneHotEncoder 클래스가 데이터에서 정수 카테고리를 인식하는 방식이 변경될 예정입니다. 종전에는 훈련 데이터에 나타난 0~최댓값 사이 범위를 카테고리로 인식하여 원-핫 인코딩하지만 0.22 버전부터는 고유한 정수 값을 카테고리로 사용합니다. 후자의 경우 0~최댓값 사이의 정수라도 훈련 데이터에 없는 값을 변환하려면 에러가 발생합니다. 경고 메세지를 피하고 고유한 정수 값을 사용하는 방식을 선택하려면 categories 매개변수를 auto로 지정합니다.
  • 사이킷런 0.22 버전에서 cross_val_score 함수와 GridSearchCV 클래스의 cv 매개변수 기본값이 3에서 5로 바뀔 예정입니다. 0.20 버전에서 cv 매개변수를 지정하지 않는 경우 이에 관한 경고 메세지가 출력됩니다. 경고 메세지를 피하기 위해 cv 매개변수 값을 명시적으로 3으로 지정합니다.
  • 사이킷런 0.22 버전부터는 GridSearchCV와 RandomizedSearchCV의 iid 매개변수 기본값이 True에서 False로 바뀝니다. 0.24 버전에서는 이 매개변수가 아예 삭제될 예정입니다. iid 매개변수가 True이면 독립 동일 분포라고 가정하고 테스트 세트의 샘플 수로 폴드의 점수를 가중 평균합니다. False로 지정하면 단순한 폴드 점수의 평균입니다. False일 때 기본 교차 검증과 동작 방식이 같습니다. 사이킷런 0.20 버전에서 iid 매개변수가 기본값일 때 가중 평균과 단순 평균의 차이가 10^-4 이상이면 경고 메세지가 발생합니다. 경고 메세지를 피하기 위해 GridSearchCV의 iid 매개변수를 True로 설정합니다.