[데이터 전처리] 수치형 변수 전처리
Y
Yerim
- ML
- DataAnalysis
표준화 | 정규화 | |
목적 | 평균 0, 표준편차 1이 되도록 변환 2개 이상 피처에서 단위가 다를 때 표준화를 통해 같은 기준으로 비교 가능 | 피처 범위를 [0, 1] 혹은 특정 범위 [a, b]로 변환 |
표현 & 용어 | 표준화 (Standardization) 표준화를 Unit variano라고 표현 | 정규화 (Normalization) |
파이썬 패키지 | StandardScaler: 평균, 표준편차 사용 RoboustScaler: 중앙값, IQR 사용 | MinMaxScaler: 최대/최솟값 MaxAbsScaler: 최대 절댓값 |
주요사항 | 기존 변수가 정규분포를 가질 때 더 적합 평균 0, 표준편차 1을 가진다고 해서 분포 자체가 표준 정규분포가 되지는 않음 | 분포가 바뀌지 않음 이상치에 민감 변환 후 표준편차가 줄어들 수 있음 |
from sklearn.datasets import load_iris
import pandas as pd
# 붓꽃 데이터 세트를 로딩, 데이터프레임으로 변환
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
print('feature들의 평균 값')
print(iris_df.mean())
print('\nfeature들의 분산 값')
print(iris_df.var())from sklearn.preprocessing import StandardScaler
# StandardScaler
scaler = StandardScaler() # 객체생성
scaler.fit(iris_df) # fit
iris_scaled = scaler.transform(iris_df) # transform
# 데이터프레임으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature들의 분산 값')
print(iris_df_scaled.var())import matplotlib.pyplot as plt
iris_df_standarded= (iris_df - iris_df.mean()) / iris_df.std()
# 기존 데이터셋 시각화
plt.title('Origin Dataset')
plt.hist(iris_df)
plt.legend(iris_df.columns)# 표준화한 데이터셋 시각
plt.title('Standarded Dataset')
plt.hist(iris_df_standarded)
plt.legend(iris_df_scaled.columns)from sklearn.preprocessing import RobustScaler
# RobustScaler
robust_scaler = RobustScaler()
robust_scaler.fit(iris_df)
iris_scaled = robust_scaler.transform(iris_df)
# 데이터프레임으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())from sklearn.preprocessing import Normalizer
# 변형 객체 생성
normal_scaler = Normalizer()
normal_scaler.fit(iris_df)
# 훈련 데이터 스케일링
X_train_scaled = normal_scaler.transform(iris_df)
# 데이터프레임 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# 데이터프레임으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())import matplotlib.pyplot as plt
iris_df_standarded= (iris_df - iris_df.max()) / (iris_df.max() - iris_df.min())
# 기존 데이터셋 시각화
plt.title('Origin Dataset')
plt.plot(iris_df)
plt.legend(iris_df.columns)# 정규화한 데이터셋 시각
plt.title('Standarded Dataset')
plt.plot(iris_df_standarded)
plt.legend(iris_df_scaled.columns)df = pd.DataFrame([[166, 18],
[172, 25],
[158, 30],
[182, 21],
[161, 26],
[155, 15]])
df.columns = ['height', 'age']
df_new = (df - df.min())/(df.max() - df.min())
# 시각화
plt.title('Origin Dataset')
plt.plot(df)
plt.legend(df.columns)plt.title('Scaled Dataset')
plt.plot(df_new)
plt.legend(df_new.columns)from sklearn.preprocessing import MaxAbsScaler
# MaxAbsScaler
maxabs_scaler = MaxAbsScaler()
maxabs_scaler.fit(iris_df)
iris_scaled = maxabs_scaler.transform(iris_df)
# 데이터프레임으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())import matplotlib.pyplot as plt
iris_df_standarded= (iris_df) / (iris_df.abs().max())
# 기존 데이터셋 시각화
plt.title('Origin Dataset')
plt.plot(iris_df)
plt.legend(iris_df.columns)# 정규화한 데이터셋 시각
plt.title('Standarded Dataset')
plt.plot(iris_df_standarded)
plt.legend(iris_df_scaled.columns)df = pd.DataFrame([[1.0, 18],
[0.8, 25],
[-0.5, 30],
[-1.8, 21],
[1.2, 26],
[0.6, 15]])
df.columns = ['sight', 'age']
df_new = df/df.abs().max()
# 시각화
plt.title('Origin Dataset')
plt.plot(df)
plt.legend(df.columns)plt.title('Scaled Dataset')
plt.plot(df_new)
plt.legend(df_new.columns)