'최소 최대 0~1 범위 변환'에 해당되는 글 1건

  1. 2016.12.16 [Python] 최소 최대 '0~1' 범위 변환 (scaling to 0~1 range) : sklearn.preprocessing.MinMaxScaler()

지난번 포스팅에서는 변수들의 척도(Scale)가 서로 다를 경우에 상호 비교를 위해서 표준화하는 방법으로서

 

  - 정규분포를 따르는 데이터의 표준정규분포로의 표준화 (z standardization)

    (평균과 표준편차 이용)

 

  - 이상치/특이값이 포함되어 있는 데이터의 표준화(scaling data with outliers)

    (중앙값과 IQR(InterQuartile Range) 이용)

 

에 대해서 소개하였습니다.

 

이번 포스팅에서는 최소값(Min)과 최대값(Max)을 사용해서 '0~1' 사이의 범위(range)로 데이터를 표준화해주는 '0~1 변환'에 대해서 알아보겠습니다.  어디서 사용하나 싶을 텐데요, 요즘 각광받고 있는 인공신경망, 딥러닝 할 때 변수들을 '0~1' 범위로 변환해서 사용합니다.

 

Python은 '0~1' 범위 변환에 사용하는 

  - sklearn.preprocessing.MinMaxScaler() method

  - sklearn.preprocessing.minmax_scale() 함수

제공합니다.

 

 

 

 

먼저, 필요한 모듈을 불러오고, 실습에 사용할 array 데이터를 만들어보겠습니다.

 

 

# importing modules

In [1]: import numpy as np


In [2]: import pandas as pd


In [3]: from sklearn.preprocessing import MinMaxScaler

 

# making a trainig data array

In [4]: X = np.array([[ 10., -10., 1.],

   ...: [ 5., 0., 2.],

   ...: [ 0., 10., 3.]])

   ...:


In [5]: X

Out[5]:

array([[ 10., -10.,   1.],
        [  5.,   0.,   2.],
        [  0.,  10.,   3.]])

 

 

 

 

'0~1' 변환을 하는 3가지 방법을 차례대로 예를 들어서 소개하겠습니다.

 

 

  (1) 최소, 최대값을 구해서 '0~1' 범위로 변환

 

 

In [5]: X

Out[5]:

array([[ 10., -10.,   1.],
        [  5.,   0.,   2.],
        [  0.,  10.,   3.]])

 

# Scaling features to [0-1] range using the formula

In [6]: X_MinMax = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))


In [7]: X_MinMax

Out[7]:

array([[ 1. ,  0. ,  0. ],
        [ 0.5,  0.5,  0.5],
        [ 0. ,  1. ,  1. ]])

 

 

 

 

  (2) sklearn.preprocessing.MinMaxScaler() method를 사용한 최소.최대 '0~1' 범위 변환

 

training set에 대해 transformer API를 통해서 '0~1' 범위 변환을 훈련시키고 => 최소.최대 '0~1' 변환 모델을 test set (new data)에 대해 적용해서 '0~1' 범위 변환을 해보겠습니다.

 

 

In [5]: X

Out[5]:

array([[ 10., -10.,   1.],
        [  5.,   0.,   2.],
        [  0.,  10.,   3.]])

 

# min_max_scaler training using the transformer API

In [8]: min_max_scaler = MinMaxScaler()


In [9]: X_MinMax_train = min_max_scaler.fit_transform(X)


In [10]: X_MinMax_train

Out[10]:

array([[ 1. ,  0. ,  0. ],
       [ 0.5,  0.5,  0.5],
       [ 0. ,  1. ,  1. ]])

 

 

# making new test set

In [11]: X_new = np.array([[9., -10., 1.],

    ...: [5., -5., 3.],

    ...: [1., 0., 5.]])


In [12]: X_new

Out[12]:

array([[  9., -10.,   1.],
       [  5.,  -5.,   3.],
       [  1.,   0.,   5.]])

 


# applying min_max_scaler to test set (new data)

In [13]: X_MinMax_new = min_max_scaler.transform(X_new)


In [14]: X_MinMax_new

Out[14]:

array([[ 0.9 ,  0.  ,  0.  ],
       [ 0.5 ,  0.25,  1.  ],
       [ 0.1 ,  0.5 ,  2.  ]])

 

 

 

 

  (3) sklearn.preprocessing.minmax_scale() 함수를 사용한 최소.최대 '0~1' 범위 변환

 

sklearn.preprocessing.MinMaxScaler() method를 사용할 때 보다 조금 더 편한 면은 있으며, 결과는 동일합니다.

 

 

In [15]: X

Out[15]:

array([[ 10., -10.,   1.],
        [  5.,   0.,   2.],
        [  0.,  10.,   3.]])

 

# importing minmax_scale function from sklearn.preprocessing

In [16]: from sklearn.preprocessing import minmax_scale

 

# scaling X to min~max '0~1' range

In [17]: X_MinMax_scaled = minmax_scale(X, axis=0, copy=True)


In [18]: X_MinMax_scaled

Out[18]:

array([[ 1. ,  0. ,  0. ],
       [ 0.5,  0.5,  0.5],
       [ 0. ,  1. ,  1. ]])

 

 

 

다음번 포스팅에서는 이항변수화(binarization)에 대해서 알아보겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

 

 

Posted by R Friend R_Friend