HwangHub

[MLOPS] Data Scaling 본문

workspace/mlops

[MLOPS] Data Scaling

HwangJerry 2025. 3. 20. 00:00

데이터 스케일링은 머신러닝 모델의 성능을 최적화하기 위한 중요한 전처리 단계입니다. 서로 다른 범위를 가진 특성들이 모델에 미치는 영향을 균등하게 만들어 더 나은 결과를 얻을 수 있습니다. 이 포스트에서는 데이터 스케일링의 중요성, 주요 기법, 그리고 파이썬을 이용한 구현 방법에 대해 알아보겠습니다.

Data Scaling이란?

데이터 스케일링은 데이터셋의 특성(feature)들을 특정 범위로 변환하는 과정입니다. 간단히 말해, 서로 다른 단위와 범위를 가진 특성들을 비슷한 스케일로 조정하여 데이터 포인트 간의 거리를 줄이는 작업입니다.

왜 하는가?

스케일링을 거친 데이터를 기반으로 학습을 하면 머신러닝/딥러닝 알고리즘의 성능이 향상되니 사용합니다. 자 그러면, 왜 성능이 향상되는지를 고민해봐야 합니다.

사실 이유는 단순합니다. 기계는 숫자의 의미를 사람 만큼이나 입체적으로 이해하지 못하기 때문입니다. 예를 들어, 토익 점수는 990점 만점이고, iBT Toefl 점수는 120점이 만점입니다. 그런데 기계의 입장에서는 토플 120점과 토익 500점을 딱 두고 보았을 때 어떤 점수가 더 좋은 점수인지 알 수 있는 방법이 없습니다. 각 시험의 최대 점수 대비 해당 점수가 어느 정도의 레벨이라는 '개념'을 알 수 없기 때문이죠.

위와 같은 이유로, scaling을 거치지 않은 데이터는 ML/DL 학습 과정에서 절대값이 높은 feature가 절대값이 작은 feature보다 target을 판단함에 있어 더 큰 영향도를 가지도록 학습될 수 있는 위험성을 가집니다. 따라서, 모든 특성이 동일한 스케일 내에서 비교되게 하여 각 특성마다 학습에 미치는 영향도가 균일해지도록 데이터를 전처리하는 것이 필요합니다. (물론 이러한 특징 외에도 절대적인 값의 크기의 감소로 학습 비용이 감소하는 등의 다른 장점들 또한 존재합니다.)

Min-Max Scaling

스케일링 기법 중에서는 그 원리가 매우 단순하면서도, 값의 분포에 영향이 없는데 숫자는 작게 만들 수 있는 Min-Max 스케일링이 가장 많이 사용됩니다.

Min-Max Scaling은 어떤 값이 갖는 범위 내의 최대값과 최소값을 이용하여 모든 값을 0과 1 사이의 범위로 변환하는 방법입니다.

X_scaled = (X - X_min) / (X_max - X_min)

  • 데이터를 고정된 범위로 변환
  • 이상치에 민감할 수 있음

Min-Max Scaling은 연산이 간단하면서도 그 효과가 강력하며, 숫자가 작게 표현되기 때문에 많이 사용됩니다. 다만, 일반적인 범주가 아닌 outlier 값(=이상치)이 포함되어 있는 경우에는 min-max scaling이라는 말에서도 알 수 있듯 이상치 유무에 따라 스케일링 성능이 크게 영향받을 수 있습니다. 따라서 data cleansing 단계에서 해당 값들을 적절하게 replace하는 등의 처리가 필요합니다.

Min-Max 스케일링 구현

위 공식을 참고하여 numpy와 pandas를 이용한 min-max scaling함수를 구현하면 아래와 같이 구현할 수 있습니다. 데이터프레임을 입력받아서 column별로 최대최소값을 구하여 아래와 같이 벡터 연산을 통해 간단하게 scaling된 데이터프레임으로 반환받을 수 있습니다.

import numpy as np
import pandas as pd

def minmax_scale(data: pd.DataFrame) -> pd.DataFrame:
    min_val = np.min(data, axis=0)
    max_val = np.max(data, axis=0)
    scaled_data = (data - min_val) / (max_val - min_val)
    return scaled_data

data = np.array([1, 2, 3, 4, 5])
scaled_data = minmax_scale(data)
print(scaled_data) # [0. 0.25 0.5 0.75 1.]

주의할 점

데이터 스케일링은 훈련 데이터에만 적용하는 것이 아니라, 테스트 데이터와 실제 예측에 사용되는 새로운 데이터에도 동일한 스케일링을 적용해야 합니다. 만약 그렇지 않으면 입력되는 feature의 성격이 달라지는 것이므로 추론 결과에도 영향이 가게 됩니다.

스케일링은 언제나 필요할까?

그렇다면 실제로도 항상 스케일링이 좋은 성능으로 이어지는지 실험해 보겠습니다. 비교에 사용된 모델은 머신러닝 알고리즘 중에서 가장 성능이 좋다고 알려진 XGBoost 모델과, 거리 기반 알고리즘 모델인 SVM을 사용해 보았습니다. 성능 비교는 f1 score를 기준으로 진행하였습니다. 데이터셋은 german_credit_risk_data.csv를 사용하였습니다.

먼저, SVM에 대하여 알아보겠습니다.

# SVM + 스케일링 X
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

clf = SVC(random_state=42)
clf.fit(X_train, y_train)

predictions = clf.predict(X_test)
f1_without_scaling = f1_score(y_test, predictions) # f1 score: 0.8193

위 과정에서 X, y는 별도 처리 없이 순수하게 7:3으로 split하여 사용하였습니다. target은 Creditability입니다. 보시다시피 0.82 정도의 스코어를 기록하였습니다.

# SVM + 스케일링 O
scaled_X = minmax_scale(X)

X_train_scaled, X_test_scaled, y_train_scaled, y_test_scaled = train_test_split(
    scaled_X, y, test_size=0.3, random_state=42)

clf = SVC(random_state=42)
clf.fit(X_train_scaled, y_train_scaled)

predictions = clf.predict(X_test_scaled)
f1_with_scaling = f1_score(y_test_scaled, predictions) # f1 score: 0.8472

scaling을 거치면 스코어가 0.85까지 올라갑니다. 스케일링이 성능 개선 효과가 있음을 알려줍니다. 그렇다면 XGBoost는 어떨까요?

# XGBoost + 스케일링 X
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

clf = XGBClassifier(random_state=42)
clf.fit(X_train, y_train)

predictions = clf.predict(X_test)
f1_without_scaling = f1_score(y_test, predictions) # f1 score: 0.8389

xgboost 모델에서는 스케일링 전 f1 score가 0.84 정도 나옵니다. 그렇다면 스케일링을 하면 더 좋아질까요?

# XGBoost + 스케일링 O
scaled_X = minmax_scale(X)

X_train_scaled, X_test_scaled, y_train, y_test = train_test_split(
    scaled_X, y, test_size=0.2, random_state=42)

clf = XGBClassifier(random_state=42)
clf.fit(X_train_scaled, y_train)

predictions = clf.predict(X_test_scaled)
f1_with_scaling = f1_score(y_test, predictions) # f1 score: 0.8100

이상하게도 성능이 0.81로 더 낮아졌습니다. 왜 일까요?

사실 XGBoost 모델 등과 같은 Decision Tree 기법의 모델들은 데이터의 순서나 분포가 더 중요하고, 연산 과정에서 데이터의 크기 등이 성능에 큰 영향을 미치지 않아 이러한 전처리가 불필요하다고 합니다. (참고) 오히려 해당 알고리즘에서는 스케일링이 모델의 추론 성능을 떨어뜨릴 수도 있음을 보여주고 있습니다. (왜 떨어질 수 있는지는 Decision Tree 알고리즘을 더 공부해본 뒤 보완해보겠습니다.)

느낀점

처음 머신러닝을 배울 때에는 고민 없이 받아들였기에 "왜 스케일링을 해야 하지? 특성이 갖는 값 자체는 그대로 의미를 갖고 있지 않나? 스케일링을 통해 해당 특성이 갖는 값이 무의미해지는 것은 아닐까?" 라고 생각했던 적이 있습니다. 하지만 기계의 관점에서는 입력되는 값들이 의도와 다르게 연산될 수 있음을 이해했고, 실제로 코드를 바탕으로 실험해보면서 모든 알고리즘이 아닌 특정 알고리즘에서 그 중요성이 더욱 강조될 수 있음을 알 수 있게 되었습니다.

Comments