사용안내 및 노트

홈으로/사용안내 및 노트
제목022. Representation: Cleaning Data: Scaling 보충2020-11-15 17:19:28
작성자

☐ Representation: Cleaning Data: Scaling 보충

 ○ data cleaning은 전처리 과정에 해당하며 자료의 overflow나 underflow를 방지하고 최적화 과정에서 안정성과 수렴 속도를 향상시킨다.

 ○ Scaling: 특정 비율에 맞춰 범위를 확대하거나 축소한다는 뜻으로, Normalization과 Standardization을 포괄하는 개념으로 생각하자.

  - Scaling = Normalization + Standardization

 ○ Normalization: 정해진 범위 내로 데이터 변환

  - 보통 [0,1], [-1, 1] 범위가 많이 사용됨

  - 예) {1,2,3} → {0, 0.5, 1}

 ○ Standardization: 평균이 0이고 표준 편차가 1인 데이터로 변환

 ○ 예제) 서울의 일별 최저기온 (2009년 ~ 2018년) 데이터 세트

  - 데이터 세트의 첫 5행 (rows)

"관측일자","최저기온(℃)"

"2009-01-01",-9.5

"2009-01-02",-6.9

"2009-01-03",-5.6

"2009-01-04",-2.8

"2009-01-05",-3.4

  - 데이터 세트 그래프

 ○ Normalize Time Series Data

  - 타임시리즈 계열(시계열)의 데이터에 대해 normalization을 시도할 때는 추세 여부를 관찰해야 한다. 추세적으로 상승 또는 하락하고 있다면, 최대 또는 최소 값의 의미가 부족하거나 해당 값들을 구하기 어려울 수 있으므로 normalization이 문제를 해결하는데 가장 적합한 방법이 아닐 수 있다.

  - 서울의 일별 최저기온을 min-max scaling 방식으로 normalization 해보자.

   · min-max scaling은 support vector machines (SVM), k-nearest neighbors (KNN) 등 데이터간의 거리가 중요한 알고리즘에서 유용하다.

"min-max scaling"

y = (x - xmin) / (xmax - xmin)

   · xmax와 xmin은 데이터의 실제 최대 값과 최소 값일 필요가 없다. 최대 값보다 큰 값을 xmax로 정하고 최소 값보다 작은 값을 xmin으로 정할수도 있다.

   · xmax는 35, xmin은 –25로 설정하고, 랜덤으로 선택한 x = 19.5를 공식에 넣어보자.

"min-max scaling"

y = (x - xmin) / (xmax - xmin)

y = (19.5 - -25) / (35 - -25)

y = 44.5 / 60

y = 0.74

  - min-max scaling은 scikit-learn의 MinMaxScaler를 이용해 수행할 수 있다.

   · scikit-learn은 python의 ML 라이브러리로 데이터 마이닝과 분석에 유용하다.

   · scikit-learn의 scaling classes 종류

① StandardScaler(): 평균은 0, 표준편차는 1이 되도록 변환

② RobustScaler(): median은 0, IQR(interquartile range)은 1이 되도록 변환

③ MinMaxScaler(): 최대 값은 1, 최소 값은 0이 되도록 변환

④ MaxAbsScaler(): 0을 기준으로 절대 값이 가장 큰 수가 1 또는 -1이 되도록 변환

   · scikit-learn의 scaling classes 사용법

① 학습용 데이터에 fit() function을 이용해서 scale 생성 및 최대·최소 값 추정

② 학습용 데이터에 transform() function을 이용해서 scale 적용 및 학습

③ 검증용 데이터에 transform() function을 이용해서 scale 적용 및 예측

   · 변환한 데이터로 예측한 결과는 보고서나 그래프에 사용하기 위해서 원래의 형식으로 되돌릴 필요가 있는데, 이때 inverse_transform() 기능을 이용할 수 있다.

  - scikit-learn MinMaxScaler를 이용한 파이썬 코딩

① 데이터는 matrix 형태여야 한다.

② pandas Series로 모든 데이터를 불러온다.

③ 헤더를 제외한 모든 행(row)을 포함한 단일 열(column) matrix로 reshaping 한다.

④ reshaped 데이터 세트에 fit() 기능을 이용해서 normalize 한다.

⑤ 마지막으로 inverse_transform() 기능을 이용해서 원래 값을 표시한다.

from pandas import Series

from sklearn.preprocessing import MinMaxScaler

series = Series.from_csv('C:\tmp\Daily_Lowest_Temp_Seoul.csv', header=0)

print(series.head())

values = series.values

values = values.reshape((len(values), 1))

# fit()를 이용해서 normalization 학습 (normalization 전 단계)

scaler = MinMaxScaler(feature_range=(0, 1))

scaler = scaler.fit(values)

print('Min: %f, Max: %f' % (scaler.data_min_, scaler.data_max_))

# transform()을 이용해서 values를 normalize하고 5줄 출력

normalized = scaler.transform(values)

for i in range(5):

print(normalized[i])

# inverse_transform()을 이용해서 원래 값 5줄 표시

inversed = scaler.inverse_transform(normalized)

for i in range(5):

print(inversed[i])

   · series.head는 기본 값으로 헤더 외 5줄만 보여준다.

   · values = series.values : 모든 values 불러오기
values = [ -9.5 -6.9 -5.6 ... -10.5 -11.3 -10.5]

· values = values.reshape((len(values), 1)) : 단일 열(column) matrix로 reshaping
values = [[ -9.5]
[ -6.9]
[ -5.6]
...
[-10.5]
[-11.3]
[-10.5]]

   · 'for' indentation 블록 다음엔 반드시 빈 줄을 넣어 SyntaxError 방지

   · 위 코드를 실행하면 아래와 같이 프린트가 된다.

관측일자

2009-01-01 -9.5

2009-01-02 -6.9

2009-01-03 -5.6

2009-01-04 -2.8

2009-01-05 -3.4

Name: 최저기온(℃), dtype: float64

Min: -18.000000, Max: 30.300000

[0.17598344]

[0.22981366]

[0.25672878]

[0.31469979]

[0.30227743]

[-9.5]

[-6.9]

[-5.6]

[-2.8]

[-3.4]

  - normalization은 학습 데이터를 기준으로 최대 값과 최소 값을 미리 정하기 때문에, 예측을 위한 신규 데이터의 범위가 미리 정해 놓은 범위를 넘을 경우 문제가 발생한다. 이 취약점을 보완한 것이 Standardization이다.

 ○ Standardize Time Series Data

  - 평균이 0이고 표준 편차가 1인 데이터로 변환

  - 특히 입력 값들이 여러 종류의 scales을 가질 때 유용

  - Linear Regression, Logistic Regression, Support Vector Machines에 사용

  - Standardization 기본 공식

"Standardization"

y = (x - mean) / standard_deviation

mean = sum(x) / count(x)

standard_deviation = sqrt( sum( (x - mean)^2 ) / count(x))

  - 서울의 일별 최저기온 히스토그램

from pandas import Series

from matplotlib import pyplot

series = Series.from_csv('C:\tmp\Daily_Lowest_Temp_Seoul.csv', header=0)

series.hist()

pyplot.show()

  - Standardization은 scikit-learn의 StandardScaler를 이용해 수행한다.

# Standardize time series data

from pandas import Series

from sklearn.preprocessing import StandardScaler

from math import sqrt

# load the dataset and print the first 5 rows

series = Series.from_csv('C:\tmp\Daily_Lowest_Temp_Seoul.csv', header=0)

print(series.head())

# prepare data for standardization

values = series.values

values = values.reshape((len(values), 1))

# train the standardization

scaler = StandardScaler()

scaler = scaler.fit(values)

print('Mean: %f, StandardDeviation: %f' % (scaler.mean_, sqrt(scaler.var_)))

# standardization the dataset and print the first 5 rows

normalized = scaler.transform(values)

for i in range(5):

print(normalized[i])

# inverse transform and print the first 5 rows

inversed = scaler.inverse_transform(normalized)

for i in range(5):

print(inversed[i])

  - 위 코드를 실행하면 아래와 같이 프린트가 된다.

관측일자

2009-01-01 -9.5

2009-01-02 -6.9

2009-01-03 -5.6

2009-01-04 -2.8

2009-01-05 -3.4

Name: 최저기온(℃), dtype: float64from pandas import Series

Mean: 8.936911, StandardDeviation: 11.002547

[-1.6756948]

[-1.43938588]

[-1.32123143]

[-1.06674491]

[-1.12127773]

[-9.5]

[-6.9]

[-5.6]

[-2.8]

[-3.4]