태그 보관물: scikit-learn

Scikit-Learn 0.21.0 Release

사이킷런 0.21 버전이 릴리스 되었습니다! RC 버전에서 언급되었던 히스토그램 기반 부스팅 알고리즘인 HistGradientBoostingClassifier, OPTICS 클러스터링 알고리즘, 누락된 값을 예측하여 채울 때 사용할 수 있는 IterativeImputer, NeighborhoodComponentsAnalysis 가 추가되었습니다.

0.21 버전은 pip로 설치할 수 있습니다. conda 패키지는 하루 이틀 걸릴 것 같네요.

$ pip install scikit-learn

이 중에 HistGradientBoostingClassifier와 IterativeImputer는 실험적인 기능이라 기본으로 활성화되어 있지 않습니다. 다음처럼 sklearn.experimental 모듈 아래를 참조해 주어야 합니다.

>>> from sklearn.experimental import enable_hist_gradient_boosting
>>> from sklearn.ensemble import HistGradientBoostingClassifier
>>> from sklearn.experimental import enable_iterative_imputer
>>> from sklearn.impute import IterativeImputer

무슨 일인지 HistGradientBoostingClassifier 문서가 생성되지 않았네요. 급한대로 소스 코드에서 긁어 올립니다. 🙂

"""Histogram-based Gradient Boosting Classification Tree.

This estimator is much faster than
:class:`GradientBoostingClassifier<sklearn.ensemble.GradientBoostingClassifier>`
for big datasets (n_samples >= 10 000). The input data ``X`` is pre-binned
into integer-valued bins, which considerably reduces the number of
splitting points to consider, and allows the algorithm to leverage
integer-based data structures. For small sample sizes,
:class:`GradientBoostingClassifier<sklearn.ensemble.GradientBoostingClassifier>`
might be preferred since binning may lead to split points that are too
approximate in this setting.

This implementation is inspired by
`LightGBM <https://github.com/Microsoft/LightGBM>`_.

.. note::

  This estimator is still **experimental** for now: the predictions
  and the API might change without any deprecation cycle. To use it,
  you need to explicitly import ``enable_hist_gradient_boosting``::

    >>> # explicitly require this experimental feature
    >>> from sklearn.experimental import enable_hist_gradient_boosting  # noqa
    >>> # now you can import normally from ensemble
    >>> from sklearn.ensemble import HistGradientBoostingClassifier

Parameters
----------
loss : {'auto', 'binary_crossentropy', 'categorical_crossentropy'}, \
        optional (default='auto')
    The loss function to use in the boosting process. 'binary_crossentropy'
    (also known as logistic loss) is used for binary classification and
    generalizes to 'categorical_crossentropy' for multiclass
    classification. 'auto' will automatically choose either loss depending
    on the nature of the problem.
learning_rate : float, optional (default=1)
    The learning rate, also known as *shrinkage*. This is used as a
    multiplicative factor for the leaves values. Use ``1`` for no
    shrinkage.
max_iter : int, optional (default=100)
    The maximum number of iterations of the boosting process, i.e. the
    maximum number of trees for binary classification. For multiclass
    classification, `n_classes` trees per iteration are built.
max_leaf_nodes : int or None, optional (default=31)
    The maximum number of leaves for each tree. Must be strictly greater
    than 1. If None, there is no maximum limit.
max_depth : int or None, optional (default=None)
    The maximum depth of each tree. The depth of a tree is the number of
    nodes to go from the root to the deepest leaf. Must be strictly greater
    than 1. Depth isn't constrained by default.
min_samples_leaf : int, optional (default=20)
    The minimum number of samples per leaf. For small datasets with less
    than a few hundred samples, it is recommended to lower this value
    since only very shallow trees would be built.
l2_regularization : float, optional (default=0)
    The L2 regularization parameter. Use 0 for no regularization.
max_bins : int, optional (default=256)
    The maximum number of bins to use. Before training, each feature of
    the input array ``X`` is binned into at most ``max_bins`` bins, which
    allows for a much faster training stage. Features with a small
    number of unique values may use less than ``max_bins`` bins. Must be no
    larger than 256.
scoring : str or callable or None, optional (default=None)
    Scoring parameter to use for early stopping. It can be a single
    string (see :ref:`scoring_parameter`) or a callable (see
    :ref:`scoring`). If None, the estimator's default scorer
    is used. If ``scoring='loss'``, early stopping is checked
    w.r.t the loss value. Only used if ``n_iter_no_change`` is not None.
validation_fraction : int or float or None, optional (default=0.1)
    Proportion (or absolute size) of training data to set aside as
    validation data for early stopping. If None, early stopping is done on
    the training data.
n_iter_no_change : int or None, optional (default=None)
    Used to determine when to "early stop". The fitting process is
    stopped when none of the last ``n_iter_no_change`` scores are better
    than the ``n_iter_no_change - 1``th-to-last one, up to some
    tolerance. If None or 0, no early-stopping is done.
tol : float or None, optional (default=1e-7)
    The absolute tolerance to use when comparing scores. The higher the
    tolerance, the more likely we are to early stop: higher tolerance
    means that it will be harder for subsequent iterations to be
    considered an improvement upon the reference score.
verbose: int, optional (default=0)
    The verbosity level. If not zero, print some information about the
    fitting process.
random_state : int, np.random.RandomStateInstance or None, \
    optional (default=None)
    Pseudo-random number generator to control the subsampling in the
    binning process, and the train/validation data split if early stopping
    is enabled. See :term:`random_state`.

Attributes
----------
n_iter_ : int
    The number of estimators as selected by early stopping (if
    n_iter_no_change is not None). Otherwise it corresponds to max_iter.
n_trees_per_iteration_ : int
    The number of tree that are built at each iteration. This is equal to 1
    for binary classification, and to ``n_classes`` for multiclass
    classification.
train_score_ : ndarray, shape (max_iter + 1,)
    The scores at each iteration on the training data. The first entry
    is the score of the ensemble before the first iteration. Scores are
    computed according to the ``scoring`` parameter. If ``scoring`` is
    not 'loss', scores are computed on a subset of at most 10 000
    samples. Empty if no early stopping.
validation_score_ : ndarray, shape (max_iter + 1,)
    The scores at each iteration on the held-out validation data. The
    first entry is the score of the ensemble before the first iteration.
    Scores are computed according to the ``scoring`` parameter. Empty if
    no early stopping or if ``validation_fraction`` is None.

Examples
--------
>>> # To use this experimental feature, we need to explicitly ask for it:
>>> from sklearn.experimental import enable_hist_gradient_boosting  # noqa
>>> from sklearn.ensemble import HistGradientBoostingRegressor
>>> from sklearn.datasets import load_iris
>>> X, y = load_iris(return_X_y=True)
>>> clf = HistGradientBoostingClassifier().fit(X, y)
>>> clf.score(X, y)
1.0
"""

Scikit-Learn 0.21 RC Release

사이킷런 0.21 RC 버전이 릴리스 되었습니다. 일전에 소개해 드렸던 히스토그램 기반의 부스팅 트리 알고리즘인 HistGradientBoostingClassifierHistGradientBoostingRegressor가 가장 주목을 받고 있습니다. 샘플이 만 개 이상이면 기존의 그래디언트 부스팅보다 훨씬 빠릅니다. 이 클래스들은 마이크로소프트의 LightGBM에 영향을 받아 만들어진 pygbm의 사이킷런 포팅입니다. 히스토그램 기반 부스팅 트리는 캐글에서 가장 많이 사용하는 알고리즘 중 하나입니다.

그외에도 많은 기능이 추가되었습니다. 눈에 띠는 것은 다음과 같습니다.

  • OPTICS 클러스터링 알고리즘이 추가되었습니다. DBSCAN와 유사하지만 매개변수 설정이 쉽고 대용량 데이터셋에도 잘 동작합니다.
  • 데이터셋에서 한 특성을 타깃으로 정하고 나머지 특성을 사용하여 누락된 값을 예측하는 IterativeImputer가 추가되었습니다. 타깃 열을 바꾸어 가며 반복합니다. 모델링에 사용하는 기본 추정기는 BayesianRidge 클래스입니다.
  • 샘플 간의 거리 지표를 학습(metric learning)하여 차원 축소로도 활용할 수 있는 NeighborhoodComponentsAnalysis(NCA)가 추가되었습니다.

0.21 버전의 자세한 변경 사항은 What’s new 페이지를 참고하세요.

0.21 RC 버전은 다음과 같이 설치할 수 있습니다.

pip install scikit-learn==0.21rc2

“[개정판] 파이썬 라이브러리를 활용한 머신러닝”이 출간되었습니다!

x9791162241646안드레아스 뮐러Andreas Mueller와 세라 가이도Sarah Guido의 베스트 셀러 “Introduction to Machine Learning with Python“의 번역서인 “파이썬 라이브러리를 활용한 머신러닝“이 개정판으로 새롭게 출간되었습니다!

지난해 10월 원서 저자들이 최신 사이킷런 버전에서 추가된 내용을 반영하여 새롭게 원서를 릴리스했습니다. 원서에서 바뀐 부분을 번역서에 반영하기에는 변경사항이 너무 많아 난처했습니다.

다행히 출판사와 협의하여 새롭게 개정판을 준비할 수 있었습니다. 그동안 많은 독자들에게 사랑을 받았던 책이라 개정판은 특별히 컬러 인쇄가 되었습니다! 여러가지 배려를 아끼지 않은 한빛미디어에 감사드립니다. 시원한 컬러 그래프를 볼 생각을 하니 너무 기쁘네요. 🙂

개정판에 추가, 변경된 내용은 [개정판] 파이썬 라이브러리를 활용한 머신러닝 페이지를 참고하세요. 이 책은 YES24, 교보문고와 같은 온라인 서점과 오프라인 서점에서 판매 중입니다!

“머신 러닝 교과서” 베타 테스터 모집합니다!

 

“머신 러닝 교과서”의 정오표 페이지는 여기입니다.

 

지난 겨울내내 끙끙맸던 세바스찬 라시카의 “Python Machine Learning” 2nd Ed. 번역을 마쳤습니다. 원서와 달리 번역서는 사이킷런 0.20과 텐서플로 2.0을 기준으로 출간됩니다. 특히 딥러닝을 설명하는 후반 챕터는 텐서플로 2.0에 맞게 많은 부분을 새롭게 작성하였습니다.

길벗 출판사에서 이 책의 베타 테스터를 모집합니다. 페북 글을 참고하시고 관심있으신 분은 신청해 주세요. 감사합니다! 🙂

Scikit-Learn supports nightly-build!

드디어 사이킷런 라이브러리가 nightly-build를 지원하기 시작했습니다! 😀

파이썬 3.6 이상에서 사이킷런의 최신 기능을 맛보고 싶다면 다음 명령을 통해 nightly-build를 설치하세요.

pip install --pre -f http://nightly.scikit-learn.org scikit-learn

HTTPS에 관한 경고가 발생하지만 사이킷런 팀에서 곧 이에 대한 대안을 찾을 수 있으리라 생각합니다. 사이킷런 nightly-build는 tf-nightly처럼 패키지명이 다르지 않고 동일합니다. 안정 버전과 혼용하시려면 주의를 기울여 주세요.

Fast Gradient Boosting Tree

사이킷런에 xgboost와 같은 고급 그래디언트 부스팅 알고리즘인 FastGradientBoostingClassifier와 FastGradientBoostingRegressor가 추가될 예정입니다. 이 두 클래스는 pygbm의 사이킷런 포팅입니다. pygbm은 마이크로소프트의 LightGBM의 히스토그램 바이닝(histogram-binning) 방식을 사용하는 부스팅 트리의 파이썬 구현입니다. LightGBM이 xgboost 보다 성능이 조금 더 높거나 거의 비슷한 수준으로 알려져 있습니다. 사이킷런에 추가된 새 클래스가 LightGBM 만큼은 아니더라도 비슷한 수준의 성능이 나온다면 좋겠네요. 이 두 클래스는 사이킷런 0.21 버전에 추가될 예정입니다. 🙂

Scikit-Learn 0.20.1 Release

사이킷런 0.20.1 버전이 릴리즈되었습니다.  이 버전은 0.20.0의 버그 수정이 주로 담겨있습니다. 0.20.0 버전을 사용하고 있다면 꼭 업데이트하세요. 자세한 수정 내용은 릴리즈 노트를 참고하세요. 사이킷런 0.20.1은 pip와 conda 사용하여 설치할 수 있습니다.
$ pip install --upgrade scikit-learn
$ conda update scikit-learn
<파이썬 라이브러리를 활용한 머신러닝>의 원서 저자인 안드레아스 뮐러가 사이킷런 0.20 버전과 향후 로드맵에 대해 DataEngConf에서 발표를 했습니다. 동영상이 아직 공개되진 않았지만 이전 컨퍼런스 영상이 공개되어 있기 때문에 기대해 봅니다. 일단 슬라이드만이라도 먼저 보시죠! 🙂

[사이킷런 정주행] 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,)
계속 읽기

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

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

“핸즈온 머신러닝” 사이킷런 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)으로 변경합니다.