본문 바로가기
ADP로ML정리

2-4. 데이터 전처리 - 데이터 분할 및 스케일링

by hits_gold 2024. 2. 14.
반응형

1. 데이터 분할

 데이터는 보통 train : val : test = 6 : 2 : 2 로 분할해 사용하는데, 데이터의 양을 고려해 조정하기도 한다.

  •  train : 학습을 위한 데이터셋
  •  val : 학습한 모델의 검증하는 셋으로, val 데이터셋으로 평가한 결과를 통해 모델링의 하이퍼파라미터를 조정한다.(학습에 포함된다고 생각)
  •  test : test
from sklearn.datasets import load_iris
iris_load = load_iris()
iris = pd.DataFrame(iris_load.data, columns = iris_load.feature_names)
iris['Class'] = load_iris().target
iris['Class'] = iris['Class'].map({0:'Setosa', 1:'Versicolour', 2:'Virginica'})

from sklearn.model_selection import train_test_split

df = iris.drop(columns = 'Class')
target = iris['Class']
X_train, X_test, y_train, y_test = train_test_split(df, target, test_size = 0.2, random_state=42)

print('분할 데이터셋 별 개수')
print('X_train :', X_train.shape, 'y_train :', y_train.shape)
print('X_test :', X_test.shape, 'y_test :', y_test.shape)

print('\n')
print('분할 데이터셋 별 타겟 비율')
print('train')
print(y_train.value_counts()/y_train.shape[0])
print('test')
print(y_test.value_counts()/y_test.shape[0])

 

분류 시 target 변수 각 범주별 비율을 동일하게 설정할 수 있다

# stratify 적용 시
X_train, X_test, y_train, y_test = train_test_split(df, target, test_size = 0.2, random_state=42, stratify=target)

print('분할 데이터셋 별 개수')
print('X_train :', X_train.shape, 'y_train :', y_train.shape)
print('X_test :', X_test.shape, 'y_test :', y_test.shape)

print('\n')
print('분할 데이터셋 별 타겟 비율')
print('train')
print(y_train.value_counts()/y_train.shape[0])
print('test')
print(y_test.value_counts()/y_test.shape[0])

 

 

2. 데이터 스케일링

 학습에 사용되는 각 독립변수들의 스케일은 다양하다. 특정 변수의 스케일이 클 경우, 타깃 변수를 예측하는데 큰 영향을 준다고 모델이 판단할 수 있어 스케일링을 통해 모든 독립변수들의 스케일링을 같게 만들어 준다.

 

 스케일링을 위해 정규화나 표준화 등을 사용할 경우 평균과 분산 등의 값을 사용하는데, 이 값은 train 데이터셋에서 추출한 값이어야한다. val과 test set은 학습 시점에서 알지 못한다는 가정이기 때문에 train에서 추출한 해당 값들을 통해 val과 test set을 스케일링한다.

 

  • Standard Scaler : 표준화 방식으로 평균이 0, 분산이 1인 정규분포로 스케일링한다. 최소값과 최댓값을 제한하지 않아 이상치에 민감하므로 이상치를 미리 정제한 후 사용하며 회귀보다는 분류분석에 유용하다.
  • Min-max scaler : 정규화 방식으로 모든 값을 0과 1사이의 값으로 스케일링한다. 이상치에 민감하며 분류보다 회귀에 유용한 방식이다.
  • Max Abs Scaler : 최대절댓값과 0이 각각 1, 0이 되도록 스케일링하는 정규화 방식으로 모든 값은 -1과 1 사이로 표현되며 모든 데이터가 양수인 경우, Min-max Scaler와 동일하다. 이상치에 민감하며 분류보다 회귀에서 유용하다.
  • Robust Scaler : 평균과 분산 대신 중앙값과 사분위 값을 활용하는 방식으로, 중앙값을 0으로 설정하고 IQR을 사용하여 이상치의 영향을 최소화한다. IQR범위를 조정할 수 있다.
from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler, RobustScaler

SScaler = StandardScaler()
MMScaler = MinMaxScaler()
MAScaler = MaxAbsScaler()
RBScaler = RobustScaler()

SScaler.fit(X_train)
X_train_ss = SScaler.transform(X_train)
X_test_ss = SScaler.transform(X_test)

MMScaler.fit(X_train)
X_train_mm = MMScaler.transform(X_train)
X_test_m = MMScaler.transform(X_test)

MAScaler.fit(X_train)
X_train_ma = MAScaler.transform(X_train)
X_test_ma = MAScaler.transform(X_test)

RBScaler.fit(X_train)
X_train_rb = RBScaler.transform(X_train)
X_test_rba = RBScaler.transform(X_test)


print(f'StandardScaler 최소 : {X_train_ss.min():.2f}, 최대 : {X_train_ss.max():.2f}, 평균 : {X_train_ss.mean():.2f}, 분산 : {X_train_ss.var():.2f}')
print(f'MinMaxdScaler 최소 : {X_train_mm.min():.2f}, 최대 : {X_train_mm.max():.2f}, 평균 : {X_train_mm.mean():.2f}, 분산 : {X_train_mm.var():.2f}')
print(f'MaxAbsScaler 최소 : {X_train_ma.min():.2f}, 최대 : {X_train_ma.max():.2f}, 평균 : {X_train_ma.mean():.2f}, 분산 : {X_train_ma.var():.2f}')
print(f'RobustScaler 최소 : {X_train_rb.min():.2f}, 최대 : {X_train_rb.max():.2f}, 평균 : {X_train_rb.mean():.2f}, 분산 : {X_train_rb.var():.2f}')

반응형