본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-8] - Data Pre-processing

by 노마드공학자 2021. 1. 12.

"Data Pre-Processing"

 

 

데이터 전처리(Data pre-processing)은, 머신러닝 및 빅데이터 분석가에게 아주 필요한 기술입니다.

데이터들의 범위는 중구난방이기 때문에 균일화를 해줄 필요가 있기 때문이죠

 

예를들면, 저는 [1,2,3] [1000,3,4], [10000,5,2] 라는 x_data를 학습시킨다고 가정해보죠

Feature 1은 1~10000의 범위를 갖는동안 나머지는 +-2정도의 값변화를 가지죠

 

즉, Feature들 간에 값의 scailing차이가 너무 나게되면, 한쪽으로 강한 Bias가 생긴 값들이 나올 수 있다는 것입니다.

따라서, 데이터를 학습시키기전에 전처리를 해주는 과정이 필요한데요

 

보통, Gaussian pdf를 따른다는 전제하에, Z-score (x-mean(x)/stddev(x))으로 표준 정규화를 해주는 방법을 주로 사용하지만, 가장 간단하게 사용할 수 있는 min max scailing에 관해 설명드리고자 합니다.

 

min max scailing = (x-min(x))/(x-max(x))를 해주는것으로 전체 값을 0과 1사이로 맞추어주는데 의의가 있습니다.

코드로 보면 직관적입니다. (혹시나 분모가 0이 될것을 방지하고자 아주 작은 숫자를 더해줍니다.)

 

출처 : https://www.simplypsychology.org/z-score.html

 

def min_max_scaler(data):

    numerator = data - np.min(data, 0)

    denominator = np.max(data, 0) - np.min(data, 0)

    # noise term prevents the zero division

    return numerator / (denominator + 1e-7)

 

이렇게 코드를 전처리해주면, 아래의 표처럼 값이 바뀝니다.

 

[기존]

        [828.659973833.450012908100828.349976831.659973],

        [823.02002828.0700071828100821.655029828.070007],

        [819.929993824.4000241438100818.97998824.159973],

        [816820.9589841008100815.48999819.23999],

        [819.3599858231188100818.469971818.97998],

        [8198231198100816820.450012],

        [811.700012815.251098100809.780029813.669983],

        [809.51001816.6599731398100804.539978809.559998],

 

 

[변경]

       [[0.99999999 0.99999999 0.         1.         1.        ]

       [0.70548491 0.70439552 1.         0.71881782 0.83755791]

       [0.54412549 0.50274824 0.57608696 0.606468   0.6606331 ]

       [0.33890353 0.31368023 0.10869565 0.45989134 0.43800918]

       [0.51436    0.42582389 0.30434783 0.58504805 0.42624401]

       [0.49556179 0.42582389 0.31521739 0.48131134 0.49276137]

       [0.11436064 0.         0.20652174 0.22007776 0.18597238]

       [0.         0.07747099 0.5326087  0.         0.        ]]

 

 

즉, 원래 숫자배열들의 분포(pdf)는 그대로 가져가면서, scailing만 진행해준것입니다!

이렇게 된다면 여러 Feature간에 비교적 밸런스가 맞는 학습을 진행할 수 있습니다.

 

 

[코드 전문]

 

import tensorflow as tf

import numpy as np



def min_max_scaler(data):

    numerator = data - np.min(data, 0)

    denominator = np.max(data, 0) - np.min(data, 0)

    # noise term prevents the zero division

    return numerator / (denominator + 1e-7)



xy = np.array(

    [

        [828.659973833.450012908100828.349976831.659973],

        [823.02002828.0700071828100821.655029828.070007],

        [819.929993824.4000241438100818.97998824.159973],

        [816820.9589841008100815.48999819.23999],

        [819.3599858231188100818.469971818.97998],

        [8198231198100816820.450012],

        [811.700012815.251098100809.780029813.669983],

        [809.51001816.6599731398100804.539978809.559998],

    ]

)

 

# very important. It does not work without it.

xy = min_max_scaler(xy)

print(xy)

 

'''

[[0.99999999 0.99999999 0.         1.         1.        ]

 [0.70548491 0.70439552 1.         0.71881782 0.83755791]

 [0.54412549 0.50274824 0.57608696 0.606468   0.6606331 ]

 [0.33890353 0.31368023 0.10869565 0.45989134 0.43800918]

 [0.51436    0.42582389 0.30434783 0.58504805 0.42624401]

 [0.49556179 0.42582389 0.31521739 0.48131134 0.49276137]

 [0.11436064 0.         0.20652174 0.22007776 0.18597238]

 [0.         0.07747099 0.5326087  0.         0.        ]]

'''

 

x_data = xy[:, 0:-1]

y_data = xy[:, [-1]]

 

tf.model = tf.keras.Sequential()

tf.model.add(tf.keras.layers.Dense(units=1input_dim=4))

tf.model.add(tf.keras.layers.Activation('linear'))

tf.model.compile(loss='mse'optimizer=tf.keras.optimizers.SGD(lr=1e-5))

tf.model.summary()

 

history = tf.model.fit(x_data, y_data, epochs=1000)

 

predictions = tf.model.predict(x_data)

score = tf.model.evaluate(x_data, y_data)

 

print('Prediction: \n', predictions)

print('Cost: ', score)

 

 

[코드 분석]

 

코드는 간단합니다.

 

기존의, 머신러닝 학습모델 코드에서 min_max_scaler라는 이름으로 위와 같이 함수를 define해주고, 학습할 데이터를 선언한 이후, 한번 함수를 통과시켜주면 됩니다.

 

참고로 위의 데이터는 어떤 Feature는 100만단위이며, 나머지는 1000을 안넘습니다. 따라서, Weighting과 Bias들이 강하게 집중되는 문제점이 발생할 수 있습니다.

 

 

[결과값(min max scaler가 있는경우)]

[결과값(min max scaler가 없는경우)]

 

min max scaler가 있는경우는 cost 0.3정도로 정확도가 높게 나오는 모습을 확인할 수 있는데요

 

min max scaler없이 그냥 학습하는 경우는 Cost가 발산해버려서(NAN)학습이 정상적으로 진행되지 않는것을 확인할 수 있습니다.

 

따라서, 여러가지 특징들에 대해 균일한 portion을 주고 학습을 해보고 싶다고 하시면 scailing을 한번 거치는 코드를 짜주시면 됩니다.

 

댓글