워로디스

scikit-learn. Feature Scaling과 데이터 변환 본문

Data Science/scikit-learn

scikit-learn. Feature Scaling과 데이터 변환

워로디스 2026. 8. 18. 22:38

1. 먼저 알아야 할 것

1.1 Feature Scaling이란?

머신러닝 데이터에는 서로 단위가 다른 Feature가 함께 들어가는 경우가 많다.

예를 들어:

age         : 18 ~ 80
income      : 30,000,000 ~ 500,000,000
experience  : 0 ~ 40

ageexperience는 수십 단위인데 income은 수억 단위다.

숫자가 크다고 해서 더 중요한 Feature라는 뜻은 아니다.

하지만 어떤 머신러닝 알고리즘은 실제로 숫자의 크기 차이에 영향을 받는다.

Feature Scaling은 이런 문제를 줄이기 위해 Feature들의 크기나 범위를 조정하는 과정이다.

1.2 왜 필요한가?

거리 기반 알고리즘

예를 들어 두 사람의 차이가 다음과 같다고 하자.

나이 차이    : 10
연봉 차이    : 50,000,000

KNN이나 K-Means처럼 거리를 계산하는 알고리즘에서는 50,000,000이라는 숫자가 10보다 압도적으로 크다.

그 결과 연봉 Feature가 실제 중요도와 관계없이 거리 계산을 거의 지배하게 된다.

따라서 다음과 같은 모델은 Scaling이 중요하다.

KNN
K-Means
거리 기반 Clustering
SVM
PCA
Ridge
Lasso
ElasticNet
Regularized LogisticRegression
Gradient 기반 모델

1.3 모든 모델에 Scaling이 필요한가?

아니다.

Decision Tree는 주로 다음과 같은 방식으로 데이터를 나눈다.

income < 100,000,000

income을 1,000,000으로 나눠도 조건은 단순히:

income_scaled < 100

으로 바뀐다.

값의 순서는 동일하다.

따라서 다음과 같은 Tree 기반 모델에서는 일반적으로 Scaling의 중요도가 낮다.

DecisionTree
RandomForest
ExtraTrees
Tree 기반 Gradient Boosting

즉 다음처럼 생각해서는 안 된다.

머신러닝
→ 무조건 StandardScaler
→ 모델 학습

Scaler를 고르기 전에 먼저 물어야 한다.

내 모델은 Feature Scale에 민감한가?

2. scikit-learn 전처리 도구의 전체 구조

Scaler들을 개별적으로 외우기 전에 전체 관계를 이해하는 것이 중요하다.

Preprocessing Transformation
|
+-- Feature-wise Transformation
|   |
|   +-- Scale / Location Transformation
|   |   |
|   |   +-- StandardScaler
|   |   +-- RobustScaler
|   |   +-- MinMaxScaler
|   |   +-- MaxAbsScaler
|   |
|   +-- Distribution Transformation
|       |
|       +-- PowerTransformer
|       +-- QuantileTransformer
|
+-- Sample-wise Transformation
    |
    +-- Normalizer

가장 큰 차이는 무엇을 기준으로 변환하느냐다.

2.1 Feature-wise Transformation

각 Column을 독립적으로 변환한다.

예를 들어:

       age    income
A       20       300
B       40       500
C       60       900

ageincome에 각각 별도의 변환을 적용한다.

여기에 속하는 것이:

StandardScaler
RobustScaler
MinMaxScaler
MaxAbsScaler
PowerTransformer
QuantileTransformer

이다.

2.2 Sample-wise Transformation

각 Row를 하나의 Vector로 보고 변환한다.

대표적인 것이:

Normalizer

이다.

즉:

Scaler / Transformer
→ 주로 Column 기준

Normalizer
→ Row 기준

이라는 차이가 있다.

3. Feature의 크기와 범위를 조정하는 Scaler

이 범주의 Scaler들은 분포 자체를 다른 모양으로 만드는 것이 주된 목적이 아니다.

각 Feature의 중심, 크기, 범위를 조정한다.

3.1 StandardScaler

무엇을 하는가?

각 Feature에서 평균을 빼고 표준편차로 나눈다.

변환된 값 =
(원래 값 - 평균) / 표준편차

사용법:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

실제로 값이 어떻게 바뀌는가?

다음 데이터가 있다고 하자.

원본

10
20
30

평균은 20이다.

scikit-learn의 StandardScaler를 적용하면 대략:

원본      변환 후

10   →   -1.225
20   →    0.000
30   →    1.225

가 된다.

20은 정확히 평균이므로 0이 된다.

평균보다 작은 값은 음수, 큰 값은 양수가 된다.

정규분포를 만드는 것은 아니다

다음 데이터가 있다고 하자.

1
1
2
3
100

100 때문에 오른쪽으로 긴 꼬리를 가진 데이터다.

StandardScaler를 적용해도:

비대칭 분포
→ 비대칭 분포

라는 기본 형태는 유지된다.

즉:

StandardScaler
= 중심과 Scale을 변경

StandardScaler
≠ 정규분포 생성

Outlier에는 민감하다

다음 데이터를 비교해보자.

10
11
12
13
1000

StandardScaler를 적용하면 대략:

10    → -0.504
11    → -0.501
12    → -0.499
13    → -0.496
1000  →  2.000

가 된다.

1000 때문에 평균과 표준편차가 크게 변하면서 정상적인 값 10 ~ 13이 거의 같은 곳에 몰렸다.

언제 사용하는가?

다음과 같은 경우 좋은 기본 선택이다.

Scale에 민감한 모델 사용
+
심한 Outlier 문제가 없음

대표적으로:

SVM
KNN
PCA
Ridge
Lasso
LogisticRegression

등에서 우선 고려할 수 있다.

3.2 RobustScaler

무엇을 하는가?

StandardScaler가 평균과 표준편차를 사용한다면 RobustScaler는 주로 Median과 IQR을 사용한다.

변환된 값 =
(원래 값 - Median) / IQR

여기서:

IQR =
75% Quantile - 25% Quantile

이다.

사용법:

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
X_scaled = scaler.fit_transform(X)

왜 Outlier에 더 강한가?

다시 다음 데이터를 사용해보자.

10
11
12
13
1000

StandardScaler 결과는:

10    → -0.504
11    → -0.501
12    → -0.499
13    → -0.496
1000  →  2.000

이었다.

RobustScaler를 적용하면:

10    →  -1.0
11    →  -0.5
12    →   0.0
13    →   0.5
1000  → 494.0

정상적인 10 ~ 13 사이의 차이가 훨씬 잘 유지된다.

여기서 중요한 사실이 하나 있다.

1000은 여전히 매우 큰 값이다.

즉 RobustScaler는:

Outlier를 제거한다

가 아니라:

Outlier가 Scaling 기준을 망가뜨리지 못하게 한다

에 가깝다.

언제 사용하는가?

Scale에 민감한 모델
+
실제 의미가 있는 Outlier 존재
+
Outlier 때문에 Mean / Std가 크게 왜곡됨

이라면 좋은 후보가 된다.

3.3 MinMaxScaler

무엇을 하는가?

Training Data의 Min과 Max를 기준으로 지정한 범위로 값을 옮긴다.

기본 범위는:

0 ~ 1

이다.

계산 방식은:

변환된 값 =
(원래 값 - 최솟값)
/
(최댓값 - 최솟값)

이다.

사용법:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

실제 변환

원본

100
150
200

을 변환하면:

100  → 0.0
150  → 0.5
200  → 1.0

가 된다.

음수가 있어도 기본은 0~1

원본

-10
0
10

기본 MinMaxScaler 결과:

-10  → 0.0
  0  → 0.5
 10  → 1.0

이다.

음수가 있다고 자동으로 -1 ~ 1이 되지는 않는다.

-1 ~ 1이 필요하다면:

MinMaxScaler(feature_range=(-1, 1))

처럼 직접 지정한다.

Outlier에는 매우 민감하다

다음 데이터가 있다고 하자.

1
2
3
4
1000

MinMaxScaler를 적용하면 대략:

1     → 0.000
2     → 0.001
3     → 0.002
4     → 0.003
1000  → 1.000

이 된다.

1000 하나 때문에 정상적인 1 ~ 4가 0 근처에 심하게 압축되었다.

따라서 Outlier가 심한 데이터에서는 MinMaxScaler를 주의해서 사용해야 한다.

Test Data가 0~1을 벗어날 수도 있다

Training Data가:

0 ~ 100

이었다고 하자.

그러면:

0    → 0.0
50   → 0.5
100  → 1.0

이다.

그런데 Test Data에 120이 들어오면:

120 → 1.2

가 될 수 있다.

0 ~ 1은 Training Data를 기준으로 정해진 범위다.

언제 사용하는가?

핵심 기준은:

Feature를 특정 Range로 표현해야 하는가?

이다.

예를 들어 반드시 0 ~ 1 또는 -1 ~ 1 같은 범위를 사용하고 싶은 경우에 고려한다.

분류인지 회귀인지는 MinMaxScaler를 선택하는 기준이 아니다.

3.4 MaxAbsScaler

무엇을 하는가?

각 Feature의 최대 절댓값으로 모든 값을 나눈다.

변환된 값 =
원래 값 / 최대 절댓값

사용법:

from sklearn.preprocessing import MaxAbsScaler

scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(X)

실제 변환

원본

-10
0
5

최대 절댓값은 10이다.

따라서:

-10  → -1.0
  0  →  0.0
  5  →  0.5

가 된다.

중요한 특징: 0이 그대로 유지된다

0 → 0

Mean이나 Median을 빼는 Centering을 하지 않기 때문이다.

이 특징 때문에 Sparse Matrix에서 유용하다.

예를 들어:

[0, 0, 3, 0, 5, 0]

같이 대부분의 값이 0인 데이터에서는 0을 그대로 유지하는 것이 중요할 수 있다.

언제 사용하는가?

Sparse Data
+
0을 유지하고 싶음
+
Feature Scaling 필요

이라면 좋은 후보가 된다.

Sparse Data에서 StandardScaler를 사용한다면

StandardScaler는 기본적으로 평균을 빼기 때문에 Sparse 구조를 깨뜨릴 수 있다.

필요하다면:

StandardScaler(with_mean=False)

처럼 Centering을 끈다.

4. Feature의 분포 자체를 바꾸는 Transformer

지금까지 본:

StandardScaler
RobustScaler
MinMaxScaler
MaxAbsScaler

는 주로 위치, Scale, Range를 바꾼다.

반면:

PowerTransformer
QuantileTransformer

분포 자체를 비선형적으로 변화시킨다.

이 차이는 매우 중요하다.

4.1 PowerTransformer

무엇을 하는가?

강하게 한쪽으로 치우친 분포를 보다 대칭적인 형태로 만들거나 Variance를 안정화하는 데 사용한다.

사용법:

from sklearn.preprocessing import PowerTransformer

transformer = PowerTransformer()
X_transformed = transformer.fit_transform(X)

기본 Method는 Yeo-Johnson이다.

실제 변환

다음처럼 값이 빠르게 증가하는 데이터가 있다고 하자.

원본

1
2
4
8
16

기본 PowerTransformer()를 적용하면 데이터에 따라 값이 달라지지만 이 예에서는 대략:

1   → -1.369
2   → -0.748
4   → -0.030
8   →  0.715
16  →  1.433

처럼 변한다.

원래 값의 간격은:

1 → 2 → 4 → 8 → 16

처럼 갈수록 커졌다.

Transformation 이후에는 극단적인 간격 차이가 완화된다.

StandardScaler와 무엇이 다른가?

StandardScaler
→ 분포 모양은 유지
→ Center와 Scale만 조정
PowerTransformer
→ 비선형적으로 분포 자체를 변경

따라서:

단위만 문제
→ StandardScaler

심한 Skewness도 문제
→ PowerTransformer 고려

Yeo-Johnson과 Box-Cox

PowerTransformer는 두 방법을 지원한다.

Yeo-Johnson
→ 음수, 0, 양수 사용 가능

Box-Cox
→ 0보다 큰 값만 사용 가능

기본값은:

PowerTransformer(method="yeo-johnson")

이다.

또한 기본적으로 Transformation 후 Standardization도 수행한다.

4.2 QuantileTransformer

무엇을 하는가?

QuantileTransformer는 값의 절대적인 크기보다 데이터 안에서의 순위와 Quantile을 중요하게 사용한다.

사용법:

from sklearn.preprocessing import QuantileTransformer

transformer = QuantileTransformer(
    output_distribution="uniform"
)

Normal 형태를 원하면:

QuantileTransformer(
    output_distribution="normal"
)

을 사용할 수 있다.

실제 변환

다음 데이터가 있다고 하자.

1
2
3
4
100

마지막 100이 매우 크다.

5개의 값을 그대로 Quantile 기준 Uniform Distribution으로 변환하면:

1    → 0.00
2    → 0.25
3    → 0.50
4    → 0.75
100  → 1.00

처럼 된다.

원래는:

4와 100의 차이 = 96

으로 엄청난 차이가 있었다.

하지만 변환 후에는:

0.75와 1.00의 차이 = 0.25

가 된다.

즉 극단값의 절대적인 크기가 강하게 압축된다.

이것이 장점이자 단점이다

장점:

강한 Skewness 완화
Heavy Tail 완화
극단값의 영향 압축

단점:

원래 값 사이의 거리 정보가 크게 바뀜

따라서 원래의 수치적 거리 관계가 중요하다면 신중하게 사용해야 한다.

RobustScaler와 차이

이 둘은 자주 혼동된다.

RobustScaler
→ Outlier는 그대로 둠
→ Scaling 기준만 Median / IQR로 Robust하게 만듦
QuantileTransformer
→ 분포 자체를 바꿈
→ Outlier의 거리도 강하게 압축할 수 있음

따라서:

원래 분포를 최대한 유지
+ Outlier 때문에 Scaling 기준만 망가지지 않게

→ RobustScaler
분포를 바꾸어서라도
극단값의 영향 자체를 크게 줄이고 싶음

→ QuantileTransformer

5. Sample의 크기를 조정하는 Normalizer

5.1 Normalizer

Normalizer는 앞의 Scaler들과 목적이 다르다.

Scaler들은 일반적으로 Column을 기준으로 계산하지만 Normalizer는 각 Row를 하나의 Vector로 본다.

사용법:

from sklearn.preprocessing import Normalizer

normalizer = Normalizer(norm="l2")
X_normalized = normalizer.fit_transform(X)

실제 변환

첫 번째 Sample이:

[3, 4]

라고 하자.

이 Vector의 길이는:

sqrt(3 * 3 + 4 * 4)
= sqrt(25)
= 5

이다.

따라서 각 값을 5로 나눈다.

[3, 4]
→
[0.6, 0.8]

이번에는:

[6, 8]

을 생각해보자.

Vector의 길이는 10이므로:

[6, 8]
→
[0.6, 0.8]

이 된다.

결국:

[3, 4] → [0.6, 0.8]
[6, 8] → [0.6, 0.8]

이다.

두 Vector의 크기는 달랐지만 방향이 같았기 때문에 Normalization 후에는 같은 Vector가 되었다.

5.2 Feature Scaling과 Normalization의 차이

이 차이는 반드시 기억해야 한다.

StandardScaler
RobustScaler
MinMaxScaler
등

→ Column을 기준으로 변환

반면:

Normalizer

→ Row를 기준으로 변환

Normalizer는 특히 다음과 같은 Vector 기반 데이터에서 유용하다.

TF-IDF
Text Vector
Cosine Similarity 기반 문제

6. 무엇을 선택해야 할까?

Scaler의 이름부터 고르지 말고 질문을 순서대로 따라가면 쉽다.

6.1 선택 순서

1단계: 모델이 Scale에 민감한가?

아니오
→ Scaling이 꼭 필요하지 않을 수 있음

대표적 예:

DecisionTree
RandomForest
Tree 기반 Boosting

민감하다면 다음 단계로 넘어간다.

2단계: Column인가 Row인가?

Feature(Column)의 Scale을 조정
→ Scaler / Transformer

각 Sample(Row)의 Vector 크기를 조정
→ Normalizer

3단계: 분포 자체도 바꿀 것인가?

아니오
→ StandardScaler
→ RobustScaler
→ MinMaxScaler
→ MaxAbsScaler
예
→ PowerTransformer
→ QuantileTransformer

4단계: Outlier가 심한가?

특별한 문제 없음
→ StandardScaler를 우선 고려
Outlier 때문에 Mean / Std가 왜곡
→ RobustScaler 고려
Outlier 영향 자체를 강하게 압축
+ 분포 변경 허용
→ QuantileTransformer 고려

5단계: 특정 Range가 필요한가?

예
→ MinMaxScaler

6단계: Sparse Data인가?

예
→ MaxAbsScaler
→ 또는 StandardScaler(with_mean=False)

6.2 전체 의사결정 흐름

모델이 Feature Scale에 민감한가?
|
+-- 아니오
|   |
|   +-- Tree 계열 등
|       → Scaling 우선순위 낮음
|
+-- 예
    |
    +-- Row Vector의 크기를 맞추려는가?
    |   |
    |   +-- 예
    |       → Normalizer
    |
    +-- 아니오
        |
        +-- Feature-wise Transformation
            |
            +-- 분포 자체를 바꿀 필요가 있는가?
                |
                +-- 예
                |   |
                |   +-- Skewness / Variance 문제
                |   |   → PowerTransformer
                |   |
                |   +-- Heavy Tail / 극단값 영향 압축
                |       → QuantileTransformer
                |
                +-- 아니오
                    |
                    +-- Sparse Data인가?
                    |   → MaxAbsScaler
                    |   → StandardScaler(with_mean=False)
                    |
                    +-- 특정 Range가 필요한가?
                    |   → MinMaxScaler
                    |
                    +-- Outlier가 통계량을 왜곡하는가?
                    |   → RobustScaler
                    |
                    +-- 일반적인 경우
                        → StandardScaler

6.3 모델별 기본 판단

모델 Scaling 중요도 일반적인 출발점
KNN 높음 StandardScaler / RobustScaler
K-Means 높음 StandardScaler / RobustScaler
거리 기반 Clustering 높음 StandardScaler / RobustScaler
SVM 높음 StandardScaler / RobustScaler
PCA 높음 StandardScaler
Ridge 높음 StandardScaler
Lasso 높음 StandardScaler
ElasticNet 높음 StandardScaler
LogisticRegression + Regularization 높음 StandardScaler
DecisionTree 낮음 대체로 불필요
RandomForest 낮음 대체로 불필요
Tree 기반 Boosting 낮음 대체로 불필요

이 표는 절대적인 규칙이 아니라 좋은 출발점이다.

6.4 전체 비교표

방법 기준 무엇을 바꾸나 Outlier 대표적인 선택 이유
StandardScaler Feature Center + Scale 민감 일반적인 기본 선택
RobustScaler Feature Center + Scale 상대적으로 강함 Outlier 때문에 통계량이 왜곡될 때
MinMaxScaler Feature Range 민감 특정 범위가 필요할 때
MaxAbsScaler Feature Scale 민감 Sparse Data의 0을 유지할 때
PowerTransformer Feature 분포 + Scale 목적이 다름 Skewness와 Variance 문제
QuantileTransformer Feature 분포를 크게 변경 강함 Heavy Tail과 극단값 영향 압축
Normalizer Sample Vector Magnitude 다른 개념 Row Vector의 크기를 제거할 때

7. 실무에서 반드시 지켜야 할 원칙

7.1 Training Data에만 Fit한다

Scaler도 데이터를 보고 필요한 값을 학습한다.

예를 들어:

StandardScaler
→ Mean, Standard Deviation 학습

MinMaxScaler
→ Min, Max 학습

RobustScaler
→ Median, Quantile 학습

따라서 Test Data까지 포함하여 fit()하면 Test Data의 정보가 Training 과정에 들어간다.

이를 Data Leakage라고 한다.

잘못된 방법

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

X_train, X_test = train_test_split(X_scaled)

전체 데이터의 통계량을 먼저 사용했기 때문에 잘못된 방법이다.

올바른 방법

먼저 데이터를 나눈다.

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

그 다음:

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

처럼 사용한다.

기억할 것은 이것뿐이다.

Training Data
→ fit + transform

Validation / Test Data
→ transform only

7.2 실무에서는 Pipeline을 사용한다

직접 관리하는 것보다 Scaler와 Model을 하나의 Pipeline으로 묶는 것이 안전하다.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

model = Pipeline([
    ("scaler", StandardScaler()),
    ("classifier", LogisticRegression())
])

model.fit(X_train, y_train)

pred = model.predict(X_test)

구조는 단순하다.

Input
↓
StandardScaler
↓
LogisticRegression
↓
Prediction

Pipeline을 사용하면 Cross Validation에서도 각 Training Fold에 대해서만 Scaler가 Fit되므로 Data Leakage를 예방하기 쉬워진다.

7.3 모든 Column에 같은 전처리를 할 필요는 없다

실제 데이터는 보통 다음처럼 섞여 있다.

age        → Numeric
income     → Numeric
city       → Categorical
gender     → Categorical

Numeric Feature에는 Scaling을 하고 Categorical Feature에는 One-Hot Encoding을 하고 싶다면 ColumnTransformer를 사용한다.

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

preprocessor = ColumnTransformer([
    (
        "numeric",
        StandardScaler(),
        ["age", "income"]
    ),
    (
        "categorical",
        OneHotEncoder(handle_unknown="ignore"),
        ["city", "gender"]
    )
])

개념적으로는:

age, income
→ StandardScaler
        |
        +----+
             |
city, gender |
→ OneHotEncoder
             |
        +----+
        |
        ↓
       Model

이다.

7.4 Outlier 처리와 Scaling은 같은 문제가 아니다

예를 들어:

나이 = 350

이라는 데이터가 있다면 이것은 Scaler 선택보다 먼저 데이터 오류인지 확인해야 할 문제다.

반면:

일반적인 연봉 = 3천만 ~ 1억
CEO 연봉      = 30억

은 실제로 가능한 극단값일 수 있다.

이 경우 단순히 삭제할 수는 없다.

따라서:

RobustScaler를 사용했다
=
Outlier 문제를 해결했다

라고 생각해서는 안 된다.

Outlier와 관련해서는 상황에 따라:

데이터 정정 또는 제거
RobustScaler
Log Transformation
PowerTransformer
QuantileTransformer
Winsorization
Robust Model

등 서로 다른 방법을 검토한다.

8. 가장 중요하게 기억할 것

StandardScaler

(값 - 평균) / 표준편차
10
20
30

↓

-1.225
 0.000
 1.225

일반적인 Scaling의 기본 선택.

정규분포를 만드는 도구는 아니다.

RobustScaler

(값 - Median) / IQR
10
11
12
13
1000

↓

-1.0
-0.5
 0.0
 0.5
494.0

Outlier가 Scaling 기준을 망가뜨리는 것을 줄인다.

Outlier 자체를 없애지는 않는다.

MinMaxScaler

100
150
200

↓

0.0
0.5
1.0

특정 범위로 값을 옮기고 싶을 때 사용한다.

Outlier에 민감하다.

MaxAbsScaler

-10
0
5

↓

-1.0
0.0
0.5

0을 유지한다.

Sparse Data에 유용하다.

PowerTransformer

1
2
4
8
16

↓

약

-1.369
-0.748
-0.030
 0.715
 1.433

Scale뿐 아니라 Skewness와 분포 형태까지 바꾸고 싶을 때 사용한다.

실제 변환값은 Training Data의 분포에 따라 달라진다.

QuantileTransformer

1
2
3
4
100

↓

Uniform 기준

0.00
0.25
0.50
0.75
1.00

극단적인 거리의 영향을 강하게 압축할 수 있다.

그 대신 원래 값 사이의 거리 관계도 크게 바뀔 수 있다.

Normalizer

[3, 4] → [0.6, 0.8]
[6, 8] → [0.6, 0.8]

Column이 아니라 각 Row Vector의 크기를 조정한다.

Scaler와 목적 자체가 다르다.

결론

scikit-learn의 Scaling과 Transformation을 이해할 때는 클래스 이름을 외우기보다 다음 순서를 기억하는 것이 훨씬 중요하다.

1. 내 모델은 Scaling에 민감한가?

2. Column을 변환하는가, Row를 변환하는가?

3. 단순히 Scale만 바꾸려는가,
   분포 자체도 바꾸려는가?

4. Outlier가 문제가 되는가?

5. 특정 Range가 필요한가?

6. Sparse Data인가?

이를 가장 짧게 정리하면:

일반적인 Scaling
→ StandardScaler

Outlier 때문에 Scaling 기준이 왜곡
→ RobustScaler

특정 범위가 필요
→ MinMaxScaler

Sparse 구조와 0을 유지
→ MaxAbsScaler

Skewness와 분포 형태까지 변경
→ PowerTransformer

극단값과 Heavy Tail의 영향을 강하게 압축
→ QuantileTransformer

Sample Vector의 크기를 제거
→ Normalizer

그리고 어떤 방법을 선택하더라도 실무에서는 다음 원칙을 지켜야 한다.

Training Data
→ fit + transform

Validation / Test Data
→ transform only

가능하면 Scaler와 Model을 Pipeline으로 묶고, 최종적인 전처리 방법은 Cross Validation을 통해 실제 모델 성능으로 비교하여 선택한다.

반응형