서로 다른 변수(feature)의 값 범위를 선형변환을 통하여 일정한 수준으로 맞추는 작업
표준화, 정규화, 변환이 있음
표준화(Standardization) → 표준분포화(평균을 0, 분산을 1 로 스케일링)
정규화(Normalization) → 규격화(특정 범위(주로 [0,1]) 로 스케일링)
변환(Transformation)(특정한 분포나 모양을 따르도록 스케일링)
표준화를 하면, 서로 다른 통계 데이터들을 비교하기 용이함
이상치에 민감하며, 분류보다는 회귀에 유용
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')
iris.select_dtypes(exclude='object')는 데이터프레임 iris에서 'object' 타입을 제외한 모든 열을 선택
데이터 분석 및 머신러닝 모델 학습에 있어서 특히 수치형 데이터에만 관심이 있는 경우에 유용
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
scikit-learn 라이브러리에서 제공하는 StandardScaler와 RobustScaler를 사용하여 데이터를 표준화(standardization) 및 로버스트 표준화(robust standardization)하는 과정
StandardScaler: 평균이 0이고 표준편차가 1이 되도록 데이터를 표준화하는 객체
RobustScaler: 중앙값(median)과 사분위수(quartiles)를 사용하여 이상치에 민감하지 않게 데이터를 표준화하는 객체
# 그래프로 확인
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
scikit-learn 라이브러리에서 제공하는 MinMaxScaler와 MaxAbsScaler를 사용하여 데이터를 최소-최대 스케일링(Min-Max Scaling)과 최대 절대값 스케일링(Maximum Absolute Scaling)하는 과정
스케일링은 데이터의 범위를 조절하여 특정 구간에 데이터를 매핑하거나, 데이터의 절대값을 최대 1로 만드는 등의 목적
MinMaxScaler: 데이터를 최소-최대 스케일링하여 최소값이 0, 최대값이 1이 되도록 만드는 객체
MaxAbsScaler: 최대 절대값을 1로 만들어 데이터를 스케일링하는 객체
fit_transform: 주어진 데이터에 대해 스케일러를 학습하고, 동시에 데이터를 변환
minmax_scaler.fit_transform(iris): MinMaxScaler를 사용하여 iris 데이터를 최소-최대 스케일링
maxabs_scaler.fit_transform(iris): MaxAbsScaler를 사용하여 iris 데이터를 최대 절대값 스케일링
pd.DataFrame(...): 변환된 데이터를 새로운 데이터프레임
columns=iris.columns: 원래 데이터프레임의 열 이름을 유지
# 세번째 그래프
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
seaborn 라이브러리를 사용하여 최소-최대 스케일링된(MinMax Scaled) 데이터와 최대 절대값 스케일링된(MaxAbs Scaled) 데이터에 대한 산점도와 회귀선을 시각화하고, 이를 patchwork 라이브러리를 사용하여 함께 표시
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이 되는지 확인
scikit-learn 라이브러리에서 제공하는 PowerTransformer와 Normalizer를 사용하여 데이터를 변환하는 작업을 수행
PowerTransformer는 데이터를 정규 분포에 가깝게 변환하고, Normalizer는 각 행의 벡터를 정규화하여 크기가 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())
scikit-learn 라이브러리에서 제공하는 QuantileTransformer를 사용하여 데이터를 변환하는 작업을 수행
QuantileTransformer는 데이터를 특정 분위수에 매핑하여 변환하는 스케일러 중 하나
정규 분포와 균일 분포 두 가지 타입의 출력 분포를 지정하여 사용
# 일곱번째 그래프
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 matplotlib.pyplot as plt
# Original Data
plt.figure(figsize=(15, 5))
plt.subplot(2, 5, 1)
sns.scatterplot(data=iris, x='petal_length', y='petal_width')
plt.title('Original Data')
# Standard Scaled
plt.subplot(2, 5, 2)
sns.scatterplot(data=iris_standard, x='petal_length', y='petal_width')
plt.title('Standard Scaled')
# Robust Scaled
plt.subplot(2, 5, 3)
sns.scatterplot(data=iris_robust, x='petal_length', y='petal_width')
plt.title('Robust Scaled')
# MinMax Scaled
plt.subplot(2, 5, 4)
sns.scatterplot(data=iris_minmax, x='petal_length', y='petal_width')
plt.title('MinMax Scaled')
# MaxAbs Scaled
plt.subplot(2, 5, 5)
sns.scatterplot(data=iris_maxabs, x='petal_length', y='petal_width')
plt.title('MaxAbs Scaled')
# PowerTransformer Scaled
plt.subplot(2, 5, 6)
sns.scatterplot(data=iris_power, x='petal_length', y='petal_width')
plt.title('PowerTransformer Scaled')
# Normalizer Scaled
plt.subplot(2, 5, 7)
sns.scatterplot(data=iris_normal, x='petal_length', y='petal_width')
plt.title('Normalizer Scaled')
# QuantileTranformer_Gaussian Scaled
plt.subplot(2, 5, 8)
sns.scatterplot(data=iris_gaussian, x='petal_length', y='petal_width')
plt.title('QuantileTranformer_Gaussian Scaled')
# QuantileTranformer_Uniform Scaled
plt.subplot(2, 5, 9)
sns.scatterplot(data=iris_uniform, x='petal_length', y='petal_width')
plt.title('QuantileTranformer_Uniform Scaled')
plt.tight_layout()
plt.show()