반응형
Data Scaling¶
학습에 사용될 데이터를 단위 통일화시키는 작업
서로 다른 단위나 값의 크기를 가지는 컬럼별 데이터들의 분포나 단위를 일정하게 통일하는 작업
- Standard Scaling
- Min-Max Scaling
- Max-Abs Scaling
- Robust Scailing
In [8]:
# 1. Standard Scaling
# 평균 0, 표준편차 1로 데이터를 변화 (표준정규화)
# (X-μ) / σ
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set()
# 데이터들은 2D-Array로 변환 (sklearn에 fit을 시키기 위해서는 반드시 2D Array로 변환 필요)
data = np.arange(10).reshape(10, 1)
z_scale = StandardScaler()
z_scale.fit(data)
# 데이터들의 평균은 4.5, 분산은 8.25
print(z_scale.mean_, z_scale.var_)
#변환된 데이터값
print(z_scale.transform(data))
df = pd.DataFrame({
'data1' : np.random.normal(5, 5, 1000), # 평균 5, 표준편차 5인 데이터 1000개 생성
'data2' : np.random.normal(10, 10, 1000), # 평균이 10, 표준편차 10인 데이터 1000개 생성
'data3' : np.random.normal(-5, 2, 1000) # 평균이 -5, 표준편차 2인 데이터 1000개
})
z_scale = z_scale.fit_transform(df)
z_scale = pd.DataFrame(z_scale, columns = df.columns)
sns.set()
fig = plt.figure()
fig.set_size_inches(15, 7)
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('Original Data Distribution', fontsize=15)
ax1.set_xlabel('Data')
sns.kdeplot(df['data1'], ax = ax1, label='data1')
sns.kdeplot(df['data2'], ax = ax1, label='data2')
sns.kdeplot(df['data3'], ax = ax1, label='data3')
ax1.legend()
ax2 = fig.add_subplot(122)
ax2.set_xlabel('Data')
ax2.set_title('StandardScale Data Distribution', fontsize=15)
sns.kdeplot(z_scale['data1'], ax = ax2, label='data1')
sns.kdeplot(z_scale['data2'], ax = ax2, label='data2')
sns.kdeplot(z_scale['data3'], ax = ax2, label='data3')
ax2.legend()
[4.5] [8.25]
[[-1.5666989 ]
[-1.21854359]
[-0.87038828]
[-0.52223297]
[-0.17407766]
[ 0.17407766]
[ 0.52223297]
[ 0.87038828]
[ 1.21854359]
[ 1.5666989 ]]
Out[8]:
<matplotlib.legend.Legend at 0x24de77f7490>
In [6]:
# 2. Min-Max Scaling
# (x - x.min()) /(x.max() - x.min())
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import seaborn as sns
# 데이터들은 2D-Array로 변환 (sklearn에 fit을 시키기 위해서는 반드시 2D Array로 변환 필요)
data = np.arange(10).reshape(10, 1)
# 원본 데이터
print('Original Data : ', data)
min_Scale = MinMaxScaler()
min_Scale.fit(data)
# Min-Max scale 데이터
print()
print('Min-Max Scale Data : ', min_Scale.transform(data))
# 0~9 의 min = 0, max = 9
# ( x - 0 ) / ( 9 - 0 )
df = pd.DataFrame({
'data1' : np.random.normal(5, 5, 1000), # 평균 5, 표준편차 5인 데이터 1000개 생성
'data2' : np.random.normal(10, 10, 1000), # 평균이 10, 표준편차 10인 데이터 1000개 생성
'data3' : np.random.normal(-5, 2, 1000) # 평균이 -5, 표준편차 2인 데이터 1000개
})
df_minmax = min_Scale.fit_transform(df)
df_minmax = pd.DataFrame(df_minmax, columns = df.columns)
sns.set()
fig = plt.figure()
fig.set_size_inches(15, 7)
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('Original Data Distribution', fontsize=15)
ax1.set_xlabel('Data')
sns.kdeplot(df['data1'], ax = ax1, label='data1')
sns.kdeplot(df['data2'], ax = ax1, label='data2')
sns.kdeplot(df['data3'], ax = ax1, label='data3')
ax1.legend()
ax2 = fig.add_subplot(122)
ax2.set_xlabel('Data')
ax2.set_title('Min-Max Scale Data Distribution', fontsize=15)
sns.kdeplot(df_minmax['data1'], ax = ax2, label='data1')
sns.kdeplot(df_minmax['data2'], ax = ax2, label='data2')
sns.kdeplot(df_minmax['data3'], ax = ax2, label='data3')
ax2.legend()
Original Data : [[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]]
Min-Max Scale Data : [[0. ]
[0.11111111]
[0.22222222]
[0.33333333]
[0.44444444]
[0.55555556]
[0.66666667]
[0.77777778]
[0.88888889]
[1. ]]
Out[6]:
<matplotlib.legend.Legend at 0x24de72d6430>
In [4]:
# 3. Max - abs scaling
# x / abs(x.max) : 데이터가 -1 ~ + 1의 분포로 변함
from sklearn.preprocessing import MaxAbsScaler
Maxabs_scale = MaxAbsScaler()
df = pd.DataFrame({
'data1' : np.random.normal(5, 5, 1000), # 평균 5, 표준편차 5인 데이터 1000개 생성
'data2' : np.random.normal(10, 10, 1000), # 평균이 10, 표준편차 10인 데이터 1000개 생성
'data3' : np.random.normal(-5, 2, 1000) # 평균이 -5, 표준편차 2인 데이터 1000개
})
Maxabs_scale = Maxabs_scale.fit_transform(df)
Maxabs_scale = pd.DataFrame(Maxabs_scale, columns = df.columns)
sns.set()
fig = plt.figure()
fig.set_size_inches(15, 7)
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('Original Data Distribution', fontsize=15)
ax1.set_xlabel('Data')
sns.kdeplot(df['data1'], ax = ax1, label='data1')
sns.kdeplot(df['data2'], ax = ax1, label='data2')
sns.kdeplot(df['data3'], ax = ax1, label='data3')
ax1.legend()
ax2 = fig.add_subplot(122)
ax2.set_xlabel('Data')
ax2.set_title('Max-Abs Scale Data Distribution', fontsize=15)
sns.kdeplot(Maxabs_scale['data1'], ax = ax2, label='data1')
sns.kdeplot(Maxabs_scale['data2'], ax = ax2, label='data2')
sns.kdeplot(Maxabs_scale['data3'], ax = ax2, label='data3')
ax2.legend()
Out[4]:
<matplotlib.legend.Legend at 0x24de6cb6130>
In [7]:
# 4. Robust Scaling
# ( x - Q2) / ( IQR = Q3 - Q1 )
df = pd.DataFrame({
# data1 : 평균이 0, 표준편차 1인 데이터 50개 (np.random.randn)
# : 평균 20, 표준편차 3인 데이터 1000개
# : 평균 40, 표준편차 1인 데이터 50개
'data1' : np.concatenate([np.random.randn(50), np.random.normal(20, 3, 1000), np.random.normal(40, 1, 50)], axis=0),
# data2 :평균이 10, 표준편차 1 인 데이터 50
# : 평균이 30, 표준편차 3 인 데이터 1000
# : 평균이 70, 표준편차 1 인 데이터 50
'data2' : np.concatenate([np.random.normal(10, 1, 50), np.random.normal(30, 3, 1000), np.random.normal(70, 1, 50)], axis=0)
})
from sklearn.preprocessing import RobustScaler
robust_scale = RobustScaler()
df_robust = robust_scale.fit_transform(df)
df_robust = pd.DataFrame(df_robust, columns = df.columns)
sns.set()
fig = plt.figure()
fig.set_size_inches(15, 7)
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('Original Data Distribution', fontsize=15)
ax1.set_xlabel('Data')
sns.kdeplot(df['data1'], ax = ax1, label='data1')
sns.kdeplot(df['data2'], ax = ax1, label='data2')
ax1.legend()
ax2 = fig.add_subplot(122)
ax2.set_xlabel('Data')
ax2.set_title('Robust Data Distribution', fontsize=15)
sns.kdeplot(df_robust['data1'], ax = ax2, label='data1')
sns.kdeplot(df_robust['data2'], ax = ax2, label='data2')
ax2.legend()
Out[7]:
<matplotlib.legend.Legend at 0x24de73930a0>
반응형
댓글