티스토리 뷰

3장_01_스케일

Introduction to Machine Learning with Python

Chapter 3. 비지도 학습과 데이터 전처리


스케일 조정

  • 커널 SVM 을 배우면서, 데이터 속성들의 스케일 조정이 중요하다는 점을 강조했습니다.
  • 일반적으로 다차원 공간상의 거리(distance) 가 중요한 모델에서는 모두 스케일 조정이 필요합니다.
  • 구체적인 데이터를 다룰 때, 스케일 조정이 필요한지 아닌지 판단하는 것이 가장 우선되어야 할 요소입니다.

대표적인 스케일 조정 방식

  1. StandardScaler : 각 속성들을 평균이 0, 표준편차가 1이 되도록 조정
  2. MinMaxScaler : 최소값이 0, 최대값이 1이 되도록 비율을 조정
  3. Normalizer : 속성(열)이 아니라 각각의 샘플(행)의 유클리디안 길이가 1이 되도록 조정 (지름이 1인 구 표면에 각각의 샘플을 투영)
In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Numpy 를 이용하는 방법

In [2]:
X = np.arange(12).reshape(4,3)
X
Out[2]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
  • 각 속성(열)의 범위를 0~1 로 제한하고 싶을 경우
In [3]:
X_max = X.max(axis=0)
X_min = X.min(axis=0)

X_ms = (X-X_min) / (X_max-X_min)
X_ms
Out[3]:
array([[0.        , 0.        , 0.        ],
       [0.33333333, 0.33333333, 0.33333333],
       [0.66666667, 0.66666667, 0.66666667],
       [1.        , 1.        , 1.        ]])
  • 각 속성(열)을 정규분표(평균이 0, 표준편차가 1)로 바꾸고 싶을 경우
In [4]:
X_mean = X.mean(axis=0)
X_std = X.std(axis=0)

X_ss = (X-X_mean) / X_std
X_ss
Out[4]:
array([[-1.34164079, -1.34164079, -1.34164079],
       [-0.4472136 , -0.4472136 , -0.4472136 ],
       [ 0.4472136 ,  0.4472136 ,  0.4472136 ],
       [ 1.34164079,  1.34164079,  1.34164079]])
  • 각 샘플(행)의 길이를 1로 바꾸고 싶을 경우
In [5]:
X_dist = np.sqrt((X**2).sum(axis=1)) # 각 행의 길이를 구한다

X_ns = X / X_dist.reshape(-1,1) # reshape() 로 열 벡터로 변환
X_ns
Out[5]:
array([[0.        , 0.4472136 , 0.89442719],
       [0.42426407, 0.56568542, 0.70710678],
       [0.49153915, 0.57346234, 0.65538554],
       [0.5178918 , 0.57543534, 0.63297887]])

sklearn 활용

In [6]:
from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer

ms = MinMaxScaler()
ms.fit(X)
ms.transform(X)
#ms.fit_transform(X)
C:\Anaconda3\lib\site-packages\sklearn\utils\validation.py:595: DataConversionWarning: Data with input dtype int32 was converted to float64 by MinMaxScaler.
  warnings.warn(msg, DataConversionWarning)
Out[6]:
array([[0.        , 0.        , 0.        ],
       [0.33333333, 0.33333333, 0.33333333],
       [0.66666667, 0.66666667, 0.66666667],
       [1.        , 1.        , 1.        ]])
In [7]:
ss = StandardScaler()
ss.fit_transform(X)
C:\Anaconda3\lib\site-packages\sklearn\utils\validation.py:595: DataConversionWarning: Data with input dtype int32 was converted to float64 by StandardScaler.
  warnings.warn(msg, DataConversionWarning)
C:\Anaconda3\lib\site-packages\sklearn\utils\validation.py:595: DataConversionWarning: Data with input dtype int32 was converted to float64 by StandardScaler.
  warnings.warn(msg, DataConversionWarning)
Out[7]:
array([[-1.34164079, -1.34164079, -1.34164079],
       [-0.4472136 , -0.4472136 , -0.4472136 ],
       [ 0.4472136 ,  0.4472136 ,  0.4472136 ],
       [ 1.34164079,  1.34164079,  1.34164079]])
In [8]:
ns = Normalizer()
ns.fit_transform(X)
Out[8]:
array([[0.        , 0.4472136 , 0.89442719],
       [0.42426407, 0.56568542, 0.70710678],
       [0.49153915, 0.57346234, 0.65538554],
       [0.5178918 , 0.57543534, 0.63297887]])
  • 학습세트와 테스트세트가 분리하였을 때에는, 학습세트를 가지고 스케일 조정에 대한 기준을 만든 다음 이 기준에 따라 테스트세트를 조정하여야 한다.

    ss.fit(X_train)
    ss.transform(X_train)
    ss.transform(X_test)

  • 목표값인 y 에 대해서는 스케일 조정이 일반적으로 필요하지 않다.

회전변환 사례

In [9]:
xs = np.random.uniform(0,2,size=100)
ys = xs + np.random.normal(0,0.1,size=100)

plt.scatter(xs, ys)
Out[9]:
<matplotlib.collections.PathCollection at 0x1a0d6b76518>
In [10]:
xs2 = xs * np.cos(np.pi/4) + ys * np.sin(np.pi/4)
ys2 = -xs * np.sin(np.pi/4) + ys * np.cos(np.pi/4)

plt.scatter(xs2, ys2)
plt.axis('equal')
Out[10]:
(-0.22108129389334782,
 3.0346804895241353,
 -0.16669635584686526,
 0.2148694860014551)
In [11]:
X = np.c_[xs, ys]

theta = -np.pi/4
tf = [[np.cos(theta), np.sin(theta)], [-np.sin(theta), np.cos(theta)]] # 회전변환 행렬
X_rot = np.matmul(X, tf) # 행렬곱

plt.scatter(X_rot[:,0], X_rot[:,1])
plt.axis('equal')
Out[11]:
(-0.22108129389334782,
 3.0346804895241353,
 -0.16669635584686526,
 0.2148694860014551)

'beginner > 파이썬 머신러닝 기초' 카테고리의 다른 글

비지도학습-DBSCAN(군집화)  (0) 2019.04.09
비지도학습-군집  (0) 2019.04.08
지도학습-비선형회귀  (0) 2019.04.05
지도학습-릿지와 라쏘  (0) 2019.04.02
지도학습-경사하강법  (0) 2019.04.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함