스케일링 (Scaling)
Normalization (정규화)
ㄴ 특성들을 특정 범위(주로 [0,1]) 로 스케일링 하는 것
ㄴ 가장 작은 값은 0, 가장 큰 값은 1 로 변환되므로, 모든 특성들은 [0, 1] 범위를 갖게 됨
Standardization (표준화)
ㄴ 특성들의 평균을 0, 분산을 1 로 스케일링 하는 것
ㄴ 즉, 특성들을 정규분포로 만드는 것
주의사항
ㄴ 훈련 데이터에는 fit_transform() 메서드를 적용 --> fit() + transform()
ㄴ 테스트 데이터에는 transform() 메서드를 적용
scaler = MinMaxScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
MinMaxScaler()
ㄴ Min-Max Normalization 이라고도 불리며 특성들을 특정 범위([0,1]) 로 스케일링
ㄴ 이상치에 매우 민감하며, 분류보다 회귀에 유용함
StandardScaler()
ㄴ 특성들의 평균을 0, 분산을 1 로 스케일링 즉, 특성들을 정규분포로 만드는 것
ㄴ 이상치에 매우 민감하며, 회귀보다 분류에 유용함
MaxAbsScaler()
ㄴ 각 특성의 절대값이 0 과 1 사이가 되도록 스케일링
ㄴ 즉, 모든 값은 -1 과 1 사이로 표현되며, 데이터가 양수일 경우 MinMaxScaler 와 동일함
RobustScaler()
ㄴ 평균과 분산 대신에 중간 값과 사분위 값을 사용
ㄴ 이상치 영향을 최소화할 수 있음
ml03_scaler_iris.py
# 1. iris
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
# 1. 데이터
datasets = load_iris() # 다중분류
x = datasets['data']
y = datasets.target
# print(x.shape, y.shape) # (150, 4) (150,)
# print('y의 라벨 값 :', np.unique(y)) # y의 라벨 값 : [0 1 2]
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = MinMaxScaler()
# scaler = StandardScaler()
# scaler = MaxAbsScaler()
# scaler = RobustScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = SVC()
# model = LinearSVC()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# MinMaxScaler() 결과 acc : 0.9777777777777777
# StandardScaler() 결과 acc : 0.9777777777777777
# MaxAbsScaler() 결과 acc : 0.9555555555555556
# RobustScaler() 결과 acc : 0.9333333333333333
ml03_scaler_cancer.py
# 2. cancer
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) # weight 의 난수값 조정
# 1. 데이터
datasets = load_breast_cancer() # 이진분류
x = datasets['data']
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = MinMaxScaler()
# scaler = StandardScaler()
# scaler = MaxAbsScaler()
# scaler = RobustScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = SVC()
# model = LinearSVC()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# MinMaxScaler() 결과 acc : 0.9707602339181286
# StandardScaler() 결과 acc : 0.9766081871345029
# MaxAbsScaler() 결과 acc : 0.9649122807017544
# RobustScaler() 결과 acc : 0.9649122807017544
ml03_scaler_wine.py
# 3. wine
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) # weight 의 난수값 조정
# 1. 데이터
datasets = load_wine() # 다중분류
x = datasets['data']
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = MinMaxScaler()
# scaler = StandardScaler()
# scaler = MaxAbsScaler()
# scaler = RobustScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = SVC()
# model = LinearSVC()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# MinMaxScaler() 결과 acc : 0.9814814814814815
# StandardScaler() 결과 acc : 0.9814814814814815
# MaxAbsScaler() 결과 acc : 0.9814814814814815
# RobustScaler() 결과 acc : 0.9814814814814815
ml04_scaler_california.py
# 4. california (SVR, LinearSVR)
import numpy as np
from sklearn.svm import SVR, LinearSVR
from sklearn.metrics import accuracy_score
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) #weight의 난수값 조절
#1. 데이터
datasets = fetch_california_housing()
x = datasets.data
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size = 0.7, random_state=100, shuffle= True
)
# Scaler 적용
# scaler = MinMaxScaler()
scaler = StandardScaler()
# scaler = MaxAbsScaler()
# scaler = RobustScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = SVR()
# model = LinearSVR()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 r2 : ', result)
# MinMaxScaler 적용 후 결과 r2 : 0.6745809218230632
# StandardScaler 적용 후 결과 r2 : 0.7501108272937165
# MaxAbsScaler 적용 후 결과 r2 : 0.5901604818199736
# RobustScaler 적용 후 결과 r2 : 0.6873119065345796