| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- Vite
- DataFrameGroupBy
- Docker Compose
- scaler
- CSS
- io
- Webpack
- json schema
- podman
- curl
- Python
- scikit-learn
- FileChannel
- cli
- 정렬
- Typescript
- PowerShell
- Ollama
- json
- RandomAccessFile
- docker
- fit_transform
- tauri
- 이미지
- vim
- UV
- pandas
- vscode
- yaml
- Java
- Today
- Total
워로디스
scikit-learn. Feature Scaling과 데이터 변환 본문
1. 먼저 알아야 할 것
1.1 Feature Scaling이란?
머신러닝 데이터에는 서로 단위가 다른 Feature가 함께 들어가는 경우가 많다.
예를 들어:
age : 18 ~ 80
income : 30,000,000 ~ 500,000,000
experience : 0 ~ 40
age와 experience는 수십 단위인데 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
age와 income에 각각 별도의 변환을 적용한다.
여기에 속하는 것이:
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을 통해 실제 모델 성능으로 비교하여 선택한다.
'Data Science > scikit-learn' 카테고리의 다른 글
| scikit-learn. RobustScaler에서 `fit_transform()`과 `transform()`을 구분해서 사용하는 이유 (0) | 2026.08.18 |
|---|
