데이터 스케일링 완전 정복: 개념부터 실전까지

발라·2025년 5월 20일

AI 이해의 첫걸음

목록 보기
5/21
post-thumbnail

스케일링이란?

스케일링은 머신러닝에서 특성 값들의 범위를 맞추는 전처리 작업입니다.
특히 여러 특성이 서로 다른 단위를 갖거나 값의 범위가 크게 다를 때 모델이 이를 공정하게 인식하지 못하게 됩니다.

예:

  • 면적 (㎡): 40 ~ 150
  • 건물 연식 (년): 1 ~ 70
  • 가격 (만원): 2000 ~ 120000

스케일링을 하지 않으면 '가격'이라는 특성이 다른 특성보다 모델 학습에 더 큰 영향을 미치게 됩니다.


왜 중요한가요?

스케일링은 다음 상황에서 중요합니다:

  • 경사하강법 기반 모델에서 수렴 속도 향상
  • 거리 기반 모델에서 특성 간 공정성 확보
  • PCA, SVD, 신경망에서 정상 작동을 위해 필수

스케일링은 모델 정확도 향상뿐만 아니라 학습 안정성과 효율성 측면에서도 매우 중요합니다.


대표적인 스케일링 기법 3종

1. StandardScaler (표준화)

x=xμσx' = \frac{x - \mu}{\sigma}
  • 평균을 0, 표준편차를 1로 맞춥니다.
  • 데이터의 정규 분포에 가까울수록 이상적
  • 이상치에 약간 민감할 수 있으나 대부분의 경우 좋은 성능을 냅니다.

사용 예:

  • 선형 회귀 / 로지스틱 회귀
  • SVM
  • PCA
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled = scaler.fit_transform(X)

2. MinMaxScaler (최소-최대 정규화)

x=xxminxmaxxminx' = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}}}
  • 데이터 전체를 0~1 사이로 압축
  • 데이터 분포의 형태를 그대로 유지
  • 이상치가 있으면 0~1 범위를 벗어나거나 왜곡될 수 있음

사용 예:

  • 딥러닝 신경망 입력값 (ReLU와 sigmoid 처리에 유리)
  • 이미지 처리 (픽셀값을 0~1 범위로 조정)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled = scaler.fit_transform(X)

예:
값이 150, 최소값이 100, 최대값이 200이라면:

x=150100200100=0.5x' = \frac{150 - 100}{200 - 100} = 0.5

3. RobustScaler (로버스트 스케일링)

x=xMedianIQRx' = \frac{x - \text{Median}}{IQR}
  • 중앙값 기준으로 스케일링
  • 이상치의 영향을 최소화
  • 데이터가 비대칭적이거나 분포가 치우친 경우 적합

사용 예:

  • 금융 데이터 (수입/지출의 이상치 많음)
  • 웹 트래픽 데이터 (특정 시간대에 치우침)
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaled = scaler.fit_transform(X)

스케일링 기법 비교 정리

항목StandardScalerMinMaxScalerRobustScaler
중심 기준평균최소값중앙값
범위표준편차 기준0~1IQR
이상치 영향있음거의 없음
정규 분포 전제필요함없음없음
사용 예시SVM, 회귀신경망, 이미지금융, 이상치 많은 데이터

스케일링 적용 실전 가이드

  • 항상 학습 데이터(train)에 fit(), 테스트/실제 데이터에는 transform()만 적용해야 함
  • Pipeline을 사용하면 스케일링 + 모델 학습을 깔끔하게 연결 가능
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])
pipe.fit(X_train, y_train)

심화 예제: 스케일링 없을 때와 있을 때 비교

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 데이터 준비
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# 스케일링 없이
model1 = LogisticRegression(max_iter=1000)
model1.fit(X_train, y_train)
print("정확도 (스케일링 없음):", accuracy_score(y_test, model1.predict(X_test)))

# 스케일링 적용
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model2 = LogisticRegression(max_iter=1000)
model2.fit(X_train_scaled, y_train)
print("정확도 (스케일링 있음):", accuracy_score(y_test, model2.predict(X_test_scaled)))

결론

스케일링은 모든 머신러닝 전처리의 기본 중의 기본입니다.
스케일러의 종류와 특성을 이해하고, 데이터셋의 특성에 맞는 방법을 선택하는 것이 중요합니다.
정확한 적용은 모델 성능의 핵심 열쇠입니다.


감사합니다.

데이터만 아니라 치아도 스케일링이 필요한 코딩 입문자 드림

profile
능숙한 바이브코딩을 할 수 있게 됨을 꿈꾸며

0개의 댓글