- 데이터의 범위를 조정하는 과정
- 다양한 특성들이 서로 다른 범위와 단계를 가질 때 이를 일관된 범위로 조정하여 모델이 효율적으로 학습할 수 있도록 함
Scikit-learn의 전처리 기능은 크게 4가지로 나눌 수 있음
- 스케일링(scaling): 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 것
- 이진화(binarization): 연속적인 값을 0 또는 1로 나누는 것, 연속형 변수 → 이진형 변수
- 인코딩(encodig): 범주형 값을 적절한 숫자형으로 변환하는 작업, 범주형 변수 → 수치형 변수
- 변환(transformation): 데이터의 분포를 변환하여 정규성을 확보하는 것
- 모델 성능개선 및 안정적 데이터 분석 결과를 위해
1. 표준화(Standardization)
2. 정규화(Normalization) → 규격화(특정 범위(주로 [0,1]) 로 스케일링)
3. 변환(Transformation) (특정한 분포나 모양을 따르도록 스케일링)
서로 다른 통계 데이터들을 비교하기 용이함
알고리즘의 성능향상에 도움
이상치에 민감함
분류보다는 회귀에 유용함
기저함수와 커널
(1) 기저함수
- 기저함수(basis function, ϕ) 혹은 feature map 이라고 함
- 원래의 데이터 공간(입력 공간)의 데이터를 더 높은 차원의 특징 공간(특성 공간)으로 변환하는 함수
- 비선형 특징을 가지는 Input space를 선형 특징을 가지는 Feature space로 변환해주는 함수
- 작동원리: 데이터의 각 차원을 변환하여 새로운 특징을 생성
- 예를 들어, 2차원 데이터를 3차원 혹은 그 이상의 차원으로 변환
- 비선형 문제를 해결할 때 유용함
(2) 커널
- 알맹이, 핵심이라는 뜻
- 운영체제 및 수학에서의 의미 및 활용
- 운영체제(Operation System)에서는 컴퓨터 자원을 관리하는 핵심 부분을 의미
- 수학에서는 기저함수의 내적을 계산하는 함수
- 커널함수는 두 벡터를 입력받아서 하나의 스칼라 값을 계산하는 함수
- 일종의 변환함수라고 생각하면 됨
- 데이터 사이언스분야에서...
- 두 벡터(데이터 포인트) 간의 유사도를 측정하는 함수
- 고차원 공간에서의 복잡한 계산을 간소화하여, 비선형 문제를 효율적으로 해결
- 많이 사용되는 커널
- 선형 서포트 벡터 머신
- 다항 커널 (Polynomial Kernal)
- RBF(Radial Basis Function) 또는 가우시안 커널(Gaussian Kernal)
- 시그모이드 커널
-MinMaxScaler(): 범위가 [0,1]이 되도록 스케일링
-MaxAbsScaler()
- 모든 값이 양수이면, 범위가 [0,1]이 되도록 스케일링, MinMaxScaler()와 유사
- 모든 값이 음수이면, 범위가 [-1,0]이 되도록 스케일링
- 양수와 음수가 혼재하면, 범위가 [-1,1]이 되도록 스케일링
import pandas as pd
from sklearn.datasets import load_diabetes
# 당뇨병 데이터셋 불러오기
diabetes = load_diabetes()
# 데이터를 DataFrame으로 변환하고 컬럼 이름 지정
diabetes = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
# 데이터셋의 처음 몇 개 행 출력
print(diabetes.head())
# 기술통계량을 확인
diabetes.describe()
# bmi와 bp의 jointplot을 그림
sns.jointplot(data=diabetes, x='bmi', y='bp', kind='scatter')
plt.show()
# 'bmi', 'bp', 's1', 's2' 열만 선택
selected_features = ['bmi', 'bp', 's3', 's6']
my_df = diabetes[selected_features]
# my_df 출력
print(my_df.head())
bmi bp s3 s6
0 0.0617 0.0219 -0.0434 -0.0176
1 -0.0515 -0.0263 0.0744 -0.0922
2 0.0445 -0.0057 -0.0324 -0.0259
3 -0.0116 -0.0367 -0.0360 -0.0094
4 -0.0364 0.0219 0.0081 -0.0466
from sklearn.preprocessing import StandardScaler, RobustScaler
# Scaler 객체 생성
standard_scaler = StandardScaler()
robust_scaler = RobustScaler()
# 데이터 변환
my_df_standard = pd.DataFrame(standard_scaler.fit_transform(my_df), columns=my_df.columns)
my_df_robust = pd.DataFrame(robust_scaler.fit_transform(my_df), columns=my_df.columns)
# 결과 출력
print('Standard Scaled: \n', my_df_standard.describe()) # mean = 0, std = 1
print()
print('Robust Scaled: \n', my_df_robust.describe()) # median = 0, IQR = 1
import seaborn as sns
import patchworklib as pw
pw.overwrite_axisgrid()
# 첫번째 그래프
g1 = sns.jointplot(data=my_df, x='bmi', y='bp', kind='reg')
g1 = pw.load_seaborngrid(g1)
g1.set_suptitle("Standard Scaled")
# 두번째 그래프
g2 = sns.jointplot(data=my_df, x='bmi', y='bp', kind='reg')
g2 = pw.load_seaborngrid(g2)
g2.set_suptitle("Robust Scaled")
# 그래프 합치기
g12 = (g1 | g2)
g12
from sklearn.preprocessing import MinMaxScaler, MaxAbsScaler
minmax_scaler = MinMaxScaler()
maxabs_scaler = MaxAbsScaler()
# 데이터 변환
my_df_minmax = pd.DataFrame(minmax_scaler.fit_transform(my_df), columns=my_df.columns)
my_df_maxabs = pd.DataFrame(maxabs_scaler.fit_transform(my_df), columns=my_df.columns)
# 결과 출력
print('MinMax Scaled (my_df): \n', my_df_minmax.describe()) # min = 0, max = 1
print()
print('MaxAbs Scaled (my_df): \n', my_df_maxabs.describe()) # min ~ 0, max = 1
# 세번째 그래프
g3 = sns.jointplot(data=my_df_minmax, x='bmi', y='bp', kind='reg')
g3 = pw.load_seaborngrid(g3)
g3.set_suptitle("MinMax Scaled")
# 네번째 그래프
g4 = sns.jointplot(data=my_df_maxabs, x='bmi', y='bp', 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()
# 데이터 변환
my_df_power = pd.DataFrame(power_scaler.fit_transform(my_df), columns=my_df.columns)
my_df_normal = pd.DataFrame(normal_scaler.fit_transform(my_df), columns=my_df.columns)
# 결과 출력
print('PowerTransformer Scaled (my_df): \n', my_df_power.describe())
print()
print('Normalizer Scaled (my_df): \n', my_df_normal.describe())
print('Euclidean Distance from 0 (my_df): \n', np.linalg.norm(my_df_normal, axis=1))
# 다섯번째 그래프
g5 = sns.jointplot(data=my_df_power, x='bmi', y='bp', kind='reg')
g5 = pw.load_seaborngrid(g5)
g5.set_suptitle("PowerTransformer Scaled")
# 여섯번째 그래프
g6 = sns.jointplot(data=my_df_normal, x='bmi', y='bp', 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')
# 데이터 변환
my_df_gaussian = pd.DataFrame(gaussian_scaler.fit_transform(my_df), columns=my_df.columns)
my_df_uniform = pd.DataFrame(uniform_scaler.fit_transform(my_df), columns=my_df.columns)
# 결과 출력
print('QuantileTranformer_Gaussian Scaled (my_df): \n', my_df_gaussian.describe())
print()
print('QuantileTranformer_Uniform Scaled (my_df): \n', my_df_uniform.describe())
# 일곱번째 그래프
g7 = sns.jointplot(data=my_df_gaussian, x='bmi', y='bp', kind='reg')
g7 = pw.load_seaborngrid(g7)
g7.set_suptitle("QuantileTranformer_Gaussian Scaled")
# 여덟번째 그래프
g8 = sns.jointplot(data=my_df_uniform, x='bmi', y='bp', 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)
from sklearn.datasets import load_diabetes
# 당뇨병 데이터셋 불러오기
diabetes = load_diabetes()
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 데이터 준비
X = diabetes.data
y = diabetes.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 회귀 모델 학습 (스케일링하지 않은 데이터)
model_unscaled = LinearRegression()
model_unscaled.fit(X_train, y_train)
# 테스트 데이터에 대한 예측
y_pred_unscaled = model_unscaled.predict(X_test)
# 평가 (스케일링하지 않은 데이터)
mse_unscaled = mean_squared_error(y_test, y_pred_unscaled)
print(f'Mean Squared Error (Unscaled): {mse_unscaled}')
Mean Squared Error (Unscaled): 2900.193628493482
# Power Transformer 스케일링 적용
power_scaler = PowerTransformer()
X_train_power = power_scaler.fit_transform(X_train)
X_test_power = power_scaler.transform(X_test)
# 회귀 모델 학습 (Power Transformer 스케일링)
model_power = LinearRegression()
model_power.fit(X_train_power, y_train)
# 테스트 데이터에 대한 예측
y_pred_power = model_power.predict(X_test_power)
# 평가 (Power Transformer 스케일링)
mse_power = mean_squared_error(y_test, y_pred_power)
print(f'Mean Squared Error (Power Transformer Scaled): {mse_power}')
Mean Squared Error (Power Transformer Scaled): 2982.383365720045
normal_scaler = Normalizer()
X_train_normal = normal_scaler.fit_transform(X_train)
X_test_normal = normal_scaler.transform(X_test)
# 회귀 모델 학습 (Normalizer 스케일링)
model_normal = LinearRegression()
model_normal.fit(X_train_normal, y_train)
# 테스트 데이터에 대한 예측
y_pred_normal = model_normal.predict(X_test_normal)
# 평가 (Normalizer 스케일링)
mse_normal = mean_squared_error(y_test, y_pred_normal)
print(f'Mean Squared Error (Normalizer Scaled): {mse_normal}')
Mean Squared Error (Normalizer Scaled): 2871.268277996966