✍ Scaler 객체를 이용
✍ 훈련 데이터와 평가 데이터의 스케일링 변환 시 유의점
✍ 데이터 로드
import pandas as pd
import seaborn as sns
# Pandas 소수점 4째자리 이하에서 반올림
pd.set_option('display.float_format', lambda x: f'{x:.4f}')
# iris 데이터 로드
iris = sns.load_dataset('iris')
# iris의 수치형 변수만 선택
iris = iris.select_dtypes(exclude='object')
# iris의 기술통계량을 확인
iris.describe()
# sepal_lengh와 petal_length의 jointplot을 그림
sns.jointplot(data=iris, x='petal_length', y='petal_width', kind='reg')
↳ 결과
✍ 표준화
from sklearn.preprocessing import StandardScaler, RobustScaler
# Scaler 객체 생성
standard_scaler = StandardScaler()
robust_scaler = RobustScaler()
# 데이터 변환
iris_standard = pd.DataFrame(standard_scaler.fit_transform(iris), columns=iris.columns)
iris_robust = pd.DataFrame(robust_scaler.fit_transform(iris), columns=iris.columns)
# 결과 출력
print('Standard Scaled: \n', iris_standard.describe()) # mean = 0, std = 1
print()
print('Robust Scaled: \n', iris_robust.describe()) # median = 0, IQR = 1
↳ 결과
pip install patchworklib
# 그래프로 확인
import seaborn as sns
import patchworklib as pw
pw.overwrite_axisgrid()
# 첫번째 그래프
g1 = sns.jointplot(data=iris_standard, x='petal_length', y='petal_width', kind='reg')
g1 = pw.load_seaborngrid(g1)
g1.set_suptitle("Standard Scaled")
# 두번째 그래프
g2 = sns.jointplot(data=iris_robust, x='petal_length', y='petal_width', kind='reg')
g2 = pw.load_seaborngrid(g2)
g2.set_suptitle("Robust Scaled")
# 그래프 합치기
g12 = (g1|g2)
g12
↳ 결과
from sklearn.preprocessing import MinMaxScaler, MaxAbsScaler
# Scaler 객체 생성
minmax_scaler = MinMaxScaler()
maxabs_scaler = MaxAbsScaler()
# 데이터 변환
iris_minmax = pd.DataFrame(minmax_scaler.fit_transform(iris), columns=iris.columns)
iris_maxabs = pd.DataFrame(maxabs_scaler.fit_transform(iris), columns=iris.columns)
# 결과 출력
print('MinMax Scaled: \n', iris_minmax.describe()) # min = 0, max = 1
print()
print('MaxAbs Scaled: \n', iris_maxabs.describe()) # min ~ 0, max = 1
↳ 결과
# 세번째 그래프
g3 = sns.jointplot(data=iris_minmax, x='petal_length', y='petal_width', kind='reg')
g3 = pw.load_seaborngrid(g3)
g3.set_suptitle("MinMax Scaled")
# 네번째 그래프
g4 = sns.jointplot(data=iris_maxabs, x='petal_length', y='petal_width', kind='reg')
g4 = pw.load_seaborngrid(g4)
g4.set_suptitle("MaxAbs Scaled")
# 그래프 합치기
g34 = (g3|g4)
g34
↳ 결과
import numpy as np
from sklearn.preprocessing import PowerTransformer, Normalizer
# Scaler 객체 생성
power_scaler = PowerTransformer()
normal_scaler = Normalizer()
# 데이터 변환
iris_power = pd.DataFrame(power_scaler.fit_transform(iris), columns=iris.columns)
iris_normal = pd.DataFrame(normal_scaler.fit_transform(iris), columns=iris.columns)
# 결과 출력
print('PowerTranformer Scaled: \n', iris_power.describe()) # mean = 0, std = 1
print()
print('Normalizer Scaled: \n', iris_normal.describe())
print('Euclidian Distance from 0: \n', np.linalg.norm(iris_normal, axis=1)) # 각 행의 벡터 크기가 1이 되는지 확인
↳ 결과
# 다섯번째 그래프
g5 = sns.jointplot(data=iris_power, x='petal_length', y='petal_width', kind='reg')
g5 = pw.load_seaborngrid(g5)
g5.set_suptitle("PowerTransformer Scaled")
# 여섯번째 그래프
g6 = sns.jointplot(data=iris_normal, x='petal_length', y='petal_width', kind='reg')
g6 = pw.load_seaborngrid(g6)
g6.set_suptitle("Normalizer Scaled")
# 그래프 합치기
g56 = (g5|g6)
g56
↳ 결과
from sklearn.preprocessing import QuantileTransformer
# Scaler 객체 생성
gaussian_scaler = QuantileTransformer(output_distribution='normal')
uniform_scaler = QuantileTransformer(output_distribution='uniform')
# 데이터 변환
iris_gaussian = pd.DataFrame(gaussian_scaler.fit_transform(iris), columns=iris.columns)
iris_uniform = pd.DataFrame(uniform_scaler.fit_transform(iris), columns=iris.columns)
# 결과 출력
print('QuantileTranformer_Gaussian Scaled: \n', iris_gaussian.describe())
print()
print('QuantileTranformer_Uniform Scaled: \n', iris_uniform.describe())
↳ 결과
# 일곱번째 그래프
g7 = sns.jointplot(data=iris_gaussian, x='petal_length', y='petal_width', kind='reg')
g7 = pw.load_seaborngrid(g7)
g7.set_suptitle("QuantileTranformer_Gaussian Scaled")
# 여덟번째 그래프
g8 = sns.jointplot(data=iris_uniform, x='petal_length', y='petal_width', kind='reg')
g8 = pw.load_seaborngrid(g8)
g8.set_suptitle("QuantileTranformer_Uniform Scaled")
# 그래프 합치기
g78 = (g7|g8)
g78
↳ 결과
# 모든 그래프 합치기
(g1|g2|g3|g4)/(g5|g6|g7|g8)
↳ 결과
# 판다스 불러오기
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 데이터 불러오기
df = pd.DataFrame([
[2, 1, 3],
[3, 2, 5],
[3, 4, 7],
[5, 5, 10],
[7, 5, 12],
[2, 5, 7],
[8, 9, 13],
[9, 10, 13],
[6, 12, 12],
[9, 2, 13],
[6, 10, 12],
[2, 4, 6]
], columns=['hour', 'attendance', 'score']) # hour, attendance, score 열로 할당
↳ 결과
# 데이터 전처리
x_data = df.drop(['score'], axis=1)
y_data = df['score']
x_data = df.drop(['score'], axis=1)
y_data = df['score']
transformer = MinMaxScaler() #transformer = MinMaxScaler 적용 (feature_range는 (0, 1))
transformer.fit(x_data) #MinMaxScaler 모델에 x_train_df 데이터 적용 (최소값, 최대값 계산)
print(transformer.data_min_)
print(transformer.data_max_)
x_data = transformer.transform(x_data)
print(x_data) # print해서 결과를 보면, 특성들의 범위가 0에서 1사이가 되도록 비례적으로 맞춰진것을 볼 수 있음
↳ 결과