Data Science/scikit-learn

scikit-learn. RobustScaler에서 `fit_transform()`과 `transform()`을 구분해서 사용하는 이유

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

1. 개요

머신러닝에서 데이터를 학습용 데이터와 검증용 데이터로 나눈 뒤 스케일링할 때 다음과 같은 코드를 자주 사용한다.

from sklearn.preprocessing import RobustScaler

rs = RobustScaler()

X_train = rs.fit_transform(X_train)
X_valid = rs.transform(X_valid)

이 코드의 핵심 목적은 학습 데이터에서 스케일링 기준을 계산하고, 그 기준을 검증 데이터에도 동일하게 적용하는 것이다.

2. fit()의 역할

fit()은 데이터를 실제로 변환하는 것이 아니라, 변환에 필요한 기준을 데이터로부터 계산하는 과정이다.

RobustScaler의 경우 각 feature에 대해 주로 다음 값을 계산한다.

  • 중앙값(Median)
  • 1사분위수(Q1)
  • 3사분위수(Q3)
  • 사분위 범위(IQR)

IQR은 다음과 같이 계산한다.

IQR = Q3 - Q1

예를 들어 학습 데이터가 다음과 같다고 하자.

10
20
30
40
50

이 데이터의 중앙값이 30, IQR이 20이라면 RobustScaler는 이 값을 스케일링 기준으로 저장한다.

3. transform()의 역할

transform()fit()을 통해 이미 계산된 기준을 이용하여 실제 데이터를 변환한다.

RobustScaler의 기본적인 변환 방식은 다음과 같다.

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

예를 들어 앞에서 계산한 값이 다음과 같다고 하자.

Median = 30
IQR = 20

학습 데이터는 다음처럼 변환된다.

10 → (10 - 30) / 20 = -1.0
20 → (20 - 30) / 20 = -0.5
30 → (30 - 30) / 20 =  0.0
40 → (40 - 30) / 20 =  0.5
50 → (50 - 30) / 20 =  1.0

4. fit_transform()의 의미

다음 코드는

X_train = rs.fit_transform(X_train)

사실상 아래 두 작업을 연속해서 수행하는 것이다.

rs.fit(X_train)
X_train = rs.transform(X_train)

즉,

  1. X_train에서 Median과 IQR을 계산하고
  2. 그 기준으로 X_train을 변환한다.

따라서 fit_transform()기준 계산과 데이터 변환을 한 번에 수행하는 메서드라고 볼 수 있다.

5. 검증 데이터에는 왜 transform()만 사용하는가?

검증 데이터에는 다음과 같이 사용한다.

X_valid = rs.transform(X_valid)

여기서는 새로운 Median이나 IQR을 계산하지 않는다.

대신 앞서 X_train에서 계산한 Median과 IQR을 그대로 사용한다.

예를 들어 학습 데이터에서 계산된 기준이 다음과 같다고 하자.

Median = 30
IQR = 20

그리고 검증 데이터가 다음과 같다면,

25
35
60

다음과 같이 변환된다.

25 → (25 - 30) / 20 = -0.25
35 → (35 - 30) / 20 =  0.25
60 → (60 - 30) / 20 =  1.50

즉, 검증 데이터 자체의 Median이나 IQR은 사용하지 않는다.

6. 검증 데이터에 fit_transform()을 사용하면 안 되는 이유

다음과 같이 작성하는 것은 적절하지 않다.

X_train = rs.fit_transform(X_train)
X_valid = rs.fit_transform(X_valid)  # 잘못된 방식

이렇게 하면 X_valid에서 다시 Median과 IQR을 계산하게 된다.

이 경우 크게 두 가지 문제가 발생한다.

6.1 Train과 Validation의 스케일 기준이 달라진다

예를 들어 각각의 데이터에서 다음과 같은 기준이 계산됐다고 하자.

Train
Median = 30
IQR = 20

Validation
Median = 100
IQR = 50

Train과 Validation에 각각 fit_transform()을 수행하면 서로 다른 기준으로 데이터가 변환된다.

하지만 모델은 Train 데이터의 스케일을 기준으로 학습되었다.

따라서 Validation과 Test 데이터 역시 Train과 동일한 기준으로 변환해야 한다.

6.2 Data Leakage를 방지해야 한다

검증 데이터와 테스트 데이터는 모델 학습 과정에서 알지 못하는 데이터라고 가정해야 한다.

따라서 전처리 과정에서 필요한 통계값도 Train 데이터만 사용하여 계산하는 것이 원칙이다.

검증 데이터나 테스트 데이터에서 별도로 전처리 기준을 계산하게 되면, 모델 평가 과정에 해당 데이터의 정보가 개입할 수 있다.

이를 Data Leakage(데이터 누수)라고 한다.

7. 올바른 사용 방법

일반적으로 다음과 같이 사용한다.

from sklearn.preprocessing import RobustScaler

rs = RobustScaler()

X_train = rs.fit_transform(X_train)
X_valid = rs.transform(X_valid)
X_test  = rs.transform(X_test)

각 코드의 의미를 정리하면 다음과 같다.

코드 의미
rs.fit(X_train) Train 데이터에서 Median, IQR 등의 기준 계산
rs.transform(X_train) 계산한 기준으로 Train 데이터 변환
rs.fit_transform(X_train) 기준 계산과 Train 데이터 변환을 한 번에 수행
rs.transform(X_valid) Train에서 계산한 기준으로 Validation 데이터 변환
rs.transform(X_test) Train에서 계산한 기준으로 Test 데이터 변환

8. 전체 흐름

전체적인 흐름은 다음과 같다.

X_train
   |
   | fit
   v
스케일링 기준 계산
Median, IQR
   |
   +--------------------+
   |                    |
   v                    v
X_train              X_valid
transform            transform
   |                    |
   v                    v
변환된 Train         변환된 Validation

Test 데이터도 같은 방식으로 Train에서 계산한 기준을 사용한다.

Train 데이터
    |
    | fit
    v
스케일링 기준
Median, IQR
    |
    +----------+----------+
    |          |          |
    v          v          v
  Train      Valid       Test
transform   transform   transform

9. RobustScaler를 사용하는 이유

RobustScaler는 평균과 표준편차 대신 중앙값(Median)과 IQR을 사용한다.

따라서 극단적으로 크거나 작은 값, 즉 이상치(Outlier)의 영향을 상대적으로 적게 받는다.

예를 들어 다음과 같은 데이터가 있다고 하자.

10, 11, 12, 13, 14

여기에 매우 큰 이상치 하나가 추가되면,

10, 11, 12, 13, 14, 10000

평균은 크게 변한다.

반면 중앙값이나 사분위수는 평균에 비해 상대적으로 영향을 적게 받는다.

따라서 이상치가 많은 데이터에서는 StandardScaler보다 RobustScaler가 적합한 경우가 있다.

10. 정리

다음 코드에서

rs = RobustScaler()

X_train = rs.fit_transform(X_train)
X_valid = rs.transform(X_valid)

각 코드의 역할은 다음과 같다.

fit
→ 스케일링 기준을 계산한다.

transform
→ 이미 계산된 기준으로 데이터를 변환한다.

fit_transform
→ 기준 계산 + 데이터 변환을 한 번에 수행한다.

그리고 머신러닝 전처리에서는 다음 원칙이 중요하다.

전처리 기준은 Train 데이터로만 계산하고, Validation과 Test 데이터에는 Train에서 계산한 기준을 그대로 적용한다.

즉, 위 코드의 핵심 의도는 Train과 Validation에 동일한 스케일링 기준을 적용하고, 올바른 모델 평가가 가능하도록 하는 것이다.

반응형