[데이터 전처리] min-MAX Scailing, Standard Scailing

Date:     Updated:

카테고리:

데이터 전처리 과정에서 스케일링(Scailing)이 필요한 이유?

여러 가지 변수들을 동시에 이용해 학습하는 경우가 있는데, 이 때 크기의 gap이 너무 크면 변수가 미치는 영향력이 제대로 표현되지 않을 수 있다. 따라서 모든 변수의 범위를 같게 해주는 스케일링(Scailing) 과정이 필요하다. 여기서 중요한 점은, 스케일링은 분포의 모양을 바꿔주지 않는다는 사실이다.

대표적인 스케일링 방식으로 min-Max ScailingStandard Scailing이 있다.

1. min-Max Scailing(Normalization)

1

  • 변수의 범위를 바꿔주는 정규화 스케일링 기법 [0, 1]
  • 이상 값 존재에 민감
  • 회귀(Regression)에 적합
  • 딥러닝에서 말하는 Normalization(정규화)이 보통 min-Max Scailing을 말한다.

1) Basis

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

plt.close("all")

np.random.seed(0)
mu = 0.0
sigma = 1.0

x = np.linspace(-8, 8, 1000)
y = 5*(1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))




## min-Max Rescaling

min_val = np.min(y)
max_val = np.max(y)
x_rescale = np.linspace(0,1,1000)
rescale_minMax = (y - min_val)*((1-0)/(max_val -min_val)) + 0.

f1 = plt.figure(1)
ax1 = f1.add_subplot(131)
ax1.plot(x,y,'r-', label = "Before", alpha = 0.8)
ax1.plot(x,rescale_minMax,'b-', label = "y only", alpha = 0.8)
ax1.legend(loc='upper right')
ax1.set_title("figure 1: origin VS y-only")
plt.show()

ax2 = f1.add_subplot(132)
ax2.plot(x,rescale_minMax,'b-', label = "y only", alpha = 0.8)
ax2.plot(x_rescale,rescale_minMax,'g-', label = "x & y", alpha = 0.8)
ax2.legend(loc='upper right')
ax2.set_title("figure 2: y-only VS Final(x & y)")
plt.show()

ax3 = f1.add_subplot(133)
ax3.plot(x_rescale, rescale_minMax, 'g-', label = "x & y", alpha = 0.8)
ax3.legend(loc='upper right')
ax3.set_title("figure3: Final(x & y)")
plt.show()

1


2) Scikit-learn 라이브러리 사용

  • Scikit-learn 패키지를 이용해서 만들 수 있다.
  • Scailing 값을 조정하는 과정이기 때문에 수치형 변수에만 적용
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

plt.close("all")

np.random.seed(0)
mu = 0.0
sigma = 1.0

x = np.linspace(-8, 8, 1000)
y = 5*(1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))

### Using sklearn

from sklearn.preprocessing import MinMaxScaler

X = np.vstack([x,y]).T

for i in range(len(y)):
    # MinMaxScaler 선언 및 Fitting
    mMscaler = MinMaxScaler()
    mMscaler.fit(X)
    
    # 데이터 변환
    mMscaled_data = mMscaler.transform(X).T
  
    
f2 = plt.figure(2)

ax4 = f2.add_subplot(121)
ax4.plot(x,y,'r-', label = "Before", alpha = 0.7)
ax4.plot(mMscaled_data[0],mMscaled_data[1], "g-", label = "after")
ax4.set_title("figure 4: Orgin VS Normalization")
ax4.legend(loc='upper right')
plt.show()

ax5 = f2.add_subplot(122)
ax5.plot(mMscaled_data[0],mMscaled_data[1], "g-", label = "after")
ax5.legend(loc='upper right')
ax5.set_title("figure 5: Normalization")
plt.show()

1

2. Standard Scaling, Standardization

  • 데이터를 표준 정규 분포화 시키는 z-score 정규화
  • 변수의 평균을 0으로, 표준 편차를 1로 만들어 주는 표준화 스케일링 기법
  • 이상 값 존재에 민감하며 여기서 이상 값이란 Outlier를 의미
  • 분류 모델에 보다 더 적합
  • 딥러닝에서 말하는 Standardization(표준화)이 보통 Standard Scaling을 말한다.

1

1) Basis

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

plt.close("all")

# 평균이 5 표준편차가 10인 가우시안 분포
np.random.seed(0)
mu = 5.0
sigma = 10.0

x = np.linspace(-25, 35, 10000)
y = 100*(1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))

# Standardization 시작
## y값 표준화
y_mean = np.mean(y)
y_var = np.var(y)
y_std = np.std(y)

y_standard = (y - y_mean)/y_std

## x값 표준화
x_standard = np.linspace(0,1,10000)

f1 = plt.figure(1)
ax1 = f1.add_subplot(131)
ax1.plot(x, y, 'r-', label = "origin", alpha = 0.8)
ax1.plot(x, y_standard, 'b-', label = "y-only", alpha = 0.8)
ax1.legend(loc="upper right")
ax1.set_title("figure 1: origin VS y-only")
plt.show()

ax2 = f1.add_subplot(132)
ax2.plot(x, y_standard, 'b-',label = "y-only", alpha = 0.8)
ax2.plot(x_standard, y_standard, 'g-', label = "Final", alpha = 0.8)
ax2.legend(loc="upper right")
ax2.set_title("figure 2: y-only VS Final(x & y)")
plt.show()

ax3 = f1.add_subplot(133)
ax3.plot(x_standard, y_standard, 'g-', label = "Final", alpha = 0.8)
ax3.legend(loc="upper right")
ax3.set_title("figure3: Final(x & y)")
plt.show()
## y와 y_standard 값 비
             y  y_standard
0     0.044318   -1.161807
1     0.044398   -1.161750
2     0.044478   -1.161693
3     0.044558   -1.161635
4     0.044639   -1.161577
       ...         ...
9995  0.044639   -1.161577
9996  0.044558   -1.161635
9997  0.044478   -1.161693
9998  0.044398   -1.161750
9999  0.044318   -1.161807

[10000 rows x 2 columns]

1


2) Scikit-learn 라이브러리 사용

  • Scikit-learn 패키지를 이용해서 만들 수 있다.
  • Scailing 값을 조정하는 과정이기 때문에 수치형 변수에만 적용
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.close("all")

# 평균이 5 표준편차가 10인 가우시안 분포
np.random.seed(0)
mu = 5.0
sigma = 10.0

x = np.linspace(-25, 35, 10000)
y = 100*(1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))

## Using sklearn

from sklearn.preprocessing import StandardScaler

X = np.vstack([x,y]).T

# StandardScaler 선언 및 Fitting
sdscaler = StandardScaler()
sdscaler.fit(X)

# 데이터 변환
sdscaled_data = sdscaler.transform(X).T # plot하기 쉽게 Transpost한 것
""
# 데이터 프레임으로 저장
sdscaled_data = pd.DataFrame(sdscaled_data.T)

f2 = plt.figure(2)

ax4 = f2.add_subplot(121)
ax4.plot(x,y,'r-', label = "Before", alpha = 0.7)
ax4.plot(sdscaled_data[0],sdscaled_data[1], "g-", label = "after")
ax4.set_title("figure 4: Orgin VS Standardization")
ax4.legend(loc='upper right')
plt.show()

ax5 = f2.add_subplot(122)
ax5.plot(sdscaled_data[0],sdscaled_data[1], "g-", label = "after")
ax5.legend(loc='upper right')
ax5.set_title("figure 5: Standardization")
plt.show()

1

DeepLearning 카테고리 내 다른 글 보러가기

댓글 남기기