월간 보관물: 2018 1월

AWS 스팟 인스턴스 + Deep Learning AMI

AWS의 EC2 스팟spot 인스턴스와 함께 AWS 공식 Deep Learning AMI를 사용하는 법에 대해 간단히 따라가 보도록 하겠습니다. 이 글은 ‘홍대 머신러닝 스터디‘를 위해 작성되었습니다.

먼저 AWS 페이지에서 계정을 만들어야 합니다. 계정을 만들 때 향후 결재를 위해 신용카드 정보를 입력해야 하는 것외에는 특별한 것은 없습니다. 계정을 만들고 AWS 콘솔에 로그인해서 메뉴바에 서비스 드롭다운 메뉴를 펼쳐 EC2를 찾아 클릭합니다.

스팟 인스턴스는 왼쪽 메뉴 ‘스팟 요청’에서 할 수 있습니다. 그런데 웬일인지 이 메뉴를 통해 스팟 인스턴스를 요청할 때는 아마존의 Deep Learning AMI(서버 이미지)를 찾을 수가 없었습니다. 물론 직접 Nvidia 드라이버와 텐서플로를 설치해도 되지만 편리하게 제공해 주는 것을 마다할 이유는 없겠지요.

아마존의 Deep Learning AMI를 사용해서 스팟 인스턴스를 띄우려면 먼저 아래 그림과 같이 좌측의 ‘AMI’ 메뉴에서 가능합니다. 혹시 서울 리전이 아니더라도 크게 상관은 없습니다만 아래 화면과 다를 수 있습니다. 서울 리전은 오른쪽 위에서 이름 옆의 드롭다운에서 선택할 수 있습니다. 검색창의 드롭다운 메뉴를 ‘퍼블릭 이미지’로 바꾼 다음  ‘deep learning ami’를 찾습니다. 아마존 리눅스와 우분투가 있는데 여기서는 우분투 버전을 선택했습니다.

스크린샷 2018-01-17 오후 8.29.36

그 다음 ‘작업’ 버튼을 눌러 ‘스팟 요청’ 메뉴를 클릭합니다.

스크린샷 2018-01-17 오후 8.29.57

계속 읽기

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)에서 확인할 수 있습니다.

TensorFlow 1.5.0 RC0 Release

텐서플로 1.5.0 RC0 버전이 릴리즈되었습니다. 정말 버전이 빠르게 올라가네요. 🙂 1.5.0 버전에서는 Eager ExecutionTensorFlow Lite 두 개의 굵직한 기능이 추가되었습니다(아직 프리뷰라고 합니다). 또 1.4.0 버전에서 예고한 대로 1.5.0 부터는 CUDA 9와 cuDNN 7을 사용하여 바이너리가 제공됩니다. 직접 컴파일하기 귀찮다면 CUDA, cuDNN을 업데이트해 주어야 합니다. 그리고 1.6.0 버전부터는 CPU의 AVX 명령을 지원하도록 바이너리가 제공될 예정입니다. CPU만 있는 경우에 조금 도움이 될 것 같습니다.

설치는 이전과 동일하게 pip로 설치 가능합니다.

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

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