☐ 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] |
|