Feature Engineering: 데이터가 같은 언어를 말하게 만들기
여러분이 학생들을 평가하는 교사라고 상상해 보자. 평가 기준은 세 가지이다. 출석(200일 만점), 시험 점수(100점 만점), 그리고 수업 참여도(10점 만점)이다.
이제 이 점수들을 단순히 더한다고 가정해 보자.
출석을 완벽하게 한 학생은 200점, 시험 점수는 평범한 70점, 참여도는 평균 수준인 5점을 받아 총 275점을 얻는다.
반면 시험 점수는 만점(100점), 참여도도 만점(10점)이지만 출석이 좋지 않아 100일만 출석한 학생은 총점이 210점에 불과하다.
과연 이것이 공정한 평가일까?
머신러닝 모델에 서로 다른 규모(scale)를 가진 데이터를 입력할 때도 정확히 같은 문제가 발생한다.
모델은 값이 큰 변수에 더 많은 관심을 기울이고, 실제로는 더 중요한 의미를 담고 있을 수도 있는 작은 값의 변수는 무시해 버린다.
이것이 바로 피처 엔지니어링(Feature Engineering)의 세계이다.
그중에서도 오늘 다룰 주제는 스케일링(Scaling), 정규화(Normalization), 그리고 표준화(Standardization)이다.
처음 들으면 다소 어렵고 복잡하게 느껴질 수 있지만, 이 글을 끝까지 읽고 나면 아침에 커피를 주문하는 것만큼 자연스럽게 이해할 수 있게 될 것이다.
피처 엔지니어링(Feature Engineering)이란?
본격적으로 들어가기 전에 먼저 기초 개념부터 이해해 보자.
피처 엔지니어링은 원시 데이터(raw data)를 예측 모델이 문제를 더 잘 이해할 수 있는 형태의 피처(feature)로 변환하는 과정이다. 이를 통해 모델의 성능과 예측 정확도를 향상시킬 수 있다.
요리에 비유해 보자.
수프를 만들 때 토마토를 통째로 냄비에 넣지는 않는다. 토마토를 잘게 썰고, 필요하다면 씨를 제거하며, 적절한 양으로 조절한다. 마찬가지로 머신러닝 모델을 만들기 위해서는 원시 데이터도 적절한 가공과 준비 과정을 거쳐야 한다.
즉, 좋은 머신러닝 모델은 좋은 데이터 준비 과정에서 시작된다.
“실전 머신러닝은 결국 피처 엔지니어링이다.”
— 앤드류 응(Andrew Ng), Google Brain 공동 창립자
문제점: 피처들이 서로 다른 언어를 사용할 때
실제 사례를 살펴보자. 여러분이 다음과 같은 정보를 이용해 주택 가격을 예측하는 모델을 만든다고 가정해 보자.
- 주택 면적(Square Footage): 500 ~ 5,000
- 침실 수(Number of Bedrooms): 1 ~ 6
- 주택 연식(Age of House): 0 ~ 100년
- 도심까지의 거리(Distance from City Center): 0.5 ~ 50km
문제가 보이는가?
주택 면적은 수천 단위의 값을 가지는 반면, 침실 수는 한 자릿수 수준에 머문다.
머신러닝 알고리즘이 이러한 데이터를 바라볼 때는 마치 드럼 소리가 바이올린보다 100배 크게 울리는 오케스트라를 듣는 것과 같다. 중요한 미세한 음들을 놓치게 되는 것이다.
결과적으로 모델은 값의 크기가 큰 변수에 과도하게 영향을 받게 되고, 상대적으로 작은 범위를 가진 변수들의 중요성은 제대로 반영하지 못할 수 있다.
바로 이 문제를 해결하기 위해 스케일링(Scaling), 정규화(Normalization), 그리고 표준화(Standardization)가 등장한다.
삼총사 이해하기
1. 피처 스케일링(Feature Scaling): 가장 큰 개념
피처 스케일링은 변수(피처)의 값 범위를 조정하는 모든 과정을 의미하는 포괄적인 용어이다.
정규화(Normalization)와 표준화(Standardization) 모두 피처 스케일링에 포함된다.
쉽게 말해 데이터의 크기를 다시 맞추는 작업이라고 생각하면 된다.
각 피처의 스케일을 조정하여 특정 변수 하나가 지나치게 큰 영향력을 갖지 않도록 만들고, 모든 피처가 모델 학습에 보다 균형 있게 기여하도록 하는 것이 목적이다.
즉, 피처 스케일링은 데이터의 크기를 재조정(resizing)하는 전체 과정이며, 정규화와 표준화는 이를 수행하는 대표적인 방법들이다.
2. 정규화(Normalization): 모든 값을 같은 상자 안에 넣기
정규화(Normalization)는 데이터를 특정 범위 안으로 변환하는 방법이다. 가장 일반적으로는 모든 값을 0과 1 사이로 변환한다.
The Formula:
Normalized Value = (X - X_min) / (X_max - X_min)
실생활 예제
서로 다른 만점 기준을 가진 시험 점수를 비교한다고 가정해 보자.
- 수학 시험: 50점 만점
- 영어 시험: 100점 만점
- 과학 시험: 200점 만점
한 학생의 점수는 다음과 같다.
- 수학: 40/50
- 영어: 70/100
- 과학: 140/200
정규화를 하지 않고 점수만 보면 과학 점수인 140점이 가장 높아 보인다.
하지만 정규화를 적용해 보자.
- 수학: (40 − 0) / (50 − 0) = 0.80 (80%)
- 영어: (70 − 0) / (100 − 0) = 0.70 (70%)
- 과학: (140 − 0) / (200 − 0) = 0.70 (70%)
이제 학생이 실제로 가장 좋은 성과를 낸 과목은 과학이 아니라 수학이라는 사실을 알 수 있다.
정규화는 서로 다른 척도를 가진 데이터를 동일한 기준으로 비교할 수 있게 만들어 준다.
정규화는 언제 사용할까?
정규화는 데이터 값을 0과 1 사이의 범위로 제한해야 할 때 유용하다.
또한 데이터에 극단적인 이상치(outlier)가 거의 없을 때 적합하다.
- 신경망(Neural Networks)을 사용할 때도 자주 사용된다. 대부분의 신경망은 0~1 범위의 값을 선호하기 때문이다.
- 이미지 처리(Image Processing)를 수행할 때도 널리 활용된다.
- K-최근접 이웃(K-Nearest Neighbors, KNN)과 같이 거리 계산에 기반한 알고리즘을 사용할 때 역시 효과적이다.
정규화의 가장 큰 장점은 모든 피처를 동일한 범위 안에 배치하여 공정한 비교가 가능하도록 만든다는 점이다.
3. 표준화(Standardization): 표준편차의 언어로 말하기
표준화(Standardization)는 데이터를 평균이 0이고 표준편차가 1인 형태로 변환하는 방법이다.
Z-점수 정규화(Z-score Normalization)라고도 부른다.
공식
Standardized Value = (X - μ) / σ
- 여기서 μ는 평균이고 σ는 표준편차이다.
표준화는 각 데이터가 평균으로부터 몇 개의 표준편차만큼 떨어져 있는지를 나타낸다.
실생활 예제
농구 선수와 체조 선수의 키를 비교한다고 가정해 보자.
농구 선수
- 평균 키: 200cm
- 표준편차: 10cm
- 선수 A의 키: 210cm
체조 선수
- 평균 키: 160cm
- 표준편차: 8cm
- 선수 B의 키: 176cm
원래 키만 비교하면 선수 A(210cm)가 더 커 보인다.
하지만 각 종목 내에서 얼마나 특별한 키인지를 확인해 보자.
표준화를 적용하면 다음과 같다.
- 선수 A: (210 − 200) / 10 = 1.0
- 선수 B: (176 − 160) / 8 = 2.0
즉, 선수 A는 농구 선수 평균보다 1 표준편차 높은 키를 가졌고, 선수 B는 체조 선수 평균보다 2 표준편차 높은 키를 가졌다.
결과적으로 선수 B가 체조 선수 집단 내에서는 훨씬 더 이례적으로 큰 키를 가진 셈이다.
표준화는 이렇게 서로 다른 집단의 데이터를 공정하게 비교할 수 있도록 도와준다.
표준화는 언제 사용할까?
다음과 같은 상황에서는 표준화가 정규화보다 더 적합한 경우가 많다.
- 데이터에 이상치(outlier)가 존재할 때이다.
- 데이터가 정규분포(종 모양 분포)를 따를 때도 적합하다.
로지스틱 회귀(Logistic Regression), 선형 회귀(Linear Regression), 서포트 벡터 머신(SVM)과 같이 정규분포를 가정하는 알고리즘을 사용할 때도 자주 사용된다.
서로 다른 데이터셋을 비교해야 할 때도 유용하다.
또한 거리 기반 알고리즘을 사용하지만 이상치가 포함되어 있는 경우에도 효과적이다.
표준화의 핵심은 데이터를 일정한 범위로 제한하는 것이 아니라, 데이터가 평균으로부터 얼마나 떨어져 있는지를 측정하는 데 있다.
핵심 차이점: 정규화와 표준화
정규화와 표준화는 모두 스케일링의 한 형태이지만, 서로 다른 방식으로 작동하며 서로 다른 목적을 위해 사용된다.
스케일의 차이
정규화는 데이터를 일정한 범위 안으로 제한한다.
일반적으로 모든 값을 0과 1 사이로 변환하며, 필요에 따라 -1에서 1과 같은 다른 범위를 지정할 수도 있다. 최소값과 최대값을 기준으로 계산하기 때문에 이상치(outlier)에 민감하다.
반면 표준화는 데이터를 특정 범위 안에 가두지 않는다.
데이터의 중심을 0에 맞추며, 데이터가 정규분포를 따른다면 대부분의 값은 -3에서 +3 사이에 위치하게 된다. 또한 최소값과 최대값 대신 평균과 표준편차를 사용하기 때문에 정규화보다 이상치의 영향을 덜 받는다.
레스토랑 비유
음식의 품질, 서비스, 분위기라는 세 가지 기준으로 음식점을 평가한다고 가정해 보자.
정규화를 사용하는 경우에는 각 기준에 대해 0점에서 10점 사이의 점수를 부여하는 방식이 된다. 모든 음식점이 동일한 척도 위에서 평가되므로 비교가 쉽다. 하지만 한 음식점의 서비스 품질이 유난히 낮은 경우, 즉 이상치가 존재하면 나머지 음식점들의 점수가 압축되어 차이가 작아 보일 수 있다.
표준화를 사용하는 경우에는 각 음식점이 평균적인 음식점과 얼마나 차이가 나는지를 기준으로 평가하게 된다. 점수 0은 정확히 평균 수준을 의미하며, +1은 평균보다 표준편차 1만큼 우수함을 의미한다. 반대로 -2는 평균보다 표준편차 2만큼 낮은 수준임을 의미한다. 이러한 방식에서는 이상치가 존재하더라도 다른 음식점들의 점수가 지나치게 압축되지 않는다.
따라서 이상치가 많은 데이터에서는 표준화가 더 안정적으로 작동하는 경우가 많다.
스케일링 기법의 종류
기본적인 정규화와 표준화 외에도 다양한 스케일링 기법이 존재하며, 각각은 특정 상황에서 강점을 가진다.
1. Min-Max 스케일링 (정규화)
무엇을 하는가? - 피처의 값을 고정된 범위인 0과 1 사이로 변환한다.
언제 사용하는가? - 신경망(Neural Networks)이나 경사하강법(Gradient Descent)을 사용하는 최적화 문제에 적합하다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
2. Standard Scaling (Z-점수 표준화)
무엇을 하는가? - 데이터의 평균을 0, 표준편차를 1로 변환한다.
언제 사용하는가? - 선형 회귀(Linear Regression), 로지스틱 회귀(Logistic Regression), 서포트 벡터 머신(SVM), K-Means와 같은 알고리즘에 적합하다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
3. Robust Scaling
무엇을 하는가? - 평균과 표준편차 대신 중앙값(Median)과 사분위 범위(IQR, Interquartile Range)를 사용한다.
언제 사용하는가? - 이상치가 많은 데이터에 적합하다.
예시
한 동네의 평균 소득을 측정한다고 가정해 보자. 대부분의 주민은 연간 5만 달러를 벌지만, 한 명은 억만장자이다.
표준화를 적용하면 이 억만장자의 소득이 전체 결과에 큰 영향을 미치게 된다. 반면 Robust Scaling은 중앙값과 사분위 범위를 사용하기 때문에 이러한 극단적인 값의 영향을 훨씬 덜 받는다.
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
4. Max Abs Scaling
무엇을 하는가? - 각 피처를 해당 피처의 최대 절대값으로 나누어 스케일링한다. 결과 값은 일반적으로 -1에서 1 사이에 위치한다.
언제 사용하는가? - 0이 많은 희소 데이터(Sparse Data)에 적합하다.
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
5. 로그 변환(Log Transformation)
무엇을 하는가? - 로그 함수를 적용하여 오른쪽으로 길게 늘어진 분포(Right Skewness)를 완화한다.
언제 사용하는가? - 소득, 인구수와 같이 지수적으로 분포하는 데이터에 적합하다.
예시
웹사이트 트래픽은 종종 멱법칙(Power Law)을 따른다. 소수의 페이지는 수백만 회의 조회수를 기록하지만, 대부분의 페이지는 수백 회 수준의 조회수만 기록한다.
로그 변환을 적용하면 이러한 극단적인 차이가 완화되어 데이터를 분석하거나 모델링하기 쉬워진다.
import numpy as np
scaled_data = np.log(data + 1) # 0 처리용 +1
6. 파워 변환(Power Transformation)
(Box-Cox, Yeo-Johnson)
무엇을 하는가? - 데이터에 가장 적합한 수학적 변환을 자동으로 찾아 적용한다.
언제 사용하는가? - 정규분포를 따르지 않는 데이터를 보다 정규분포에 가깝게 만들고 싶을 때 사용한다.
from sklearn.preprocessing import PowerTransformer
scaler = PowerTransformer(method='yeo-johnson')
언제 무엇을 사용해야 할까? 의사결정 가이드
적절한 스케일링 기법을 선택하는 일은 처음에는 다소 어렵게 느껴질 수 있다. 하지만 다음과 같은 간단한 의사결정 과정을 따르면 훨씬 수월해진다.
다음 질문들을 스스로에게 해보자
1. 데이터에 이상치(outlier)가 존재하는가?
그렇다면 Robust Scaling 또는 로그 변환(Log Transformation)을 사용하는 것이 좋다.
그렇지 않다면 다음 질문으로 넘어간다.
2. 사용하는 알고리즘이 값의 범위를 제한된 구간으로 요구하는가?
그렇다면 Min-Max Scaling을 사용하는 것이 좋다.
대표적인 예로 신경망(Neural Networks)과 이미지 처리(Image Processing) 모델이 있다.
그렇지 않다면 다음 질문으로 넘어간다.
3. 데이터가 정규분포를 따르는가?
그렇다면 Standard Scaling을 사용하는 것이 좋다.
그렇지 않다면 Min-Max Scaling 또는 Power Transformation을 고려해 볼 수 있다.
4. 데이터가 희소한가?
즉, 0이 매우 많이 포함되어 있는 데이터인가?
그렇다면 Max Abs Scaling이 적합하다.
그렇지 않다면 Standard Scaling 또는 Min-Max Scaling을 사용하는 것이 일반적이다.
5. 데이터가 지수적 분포를 따르는가?
그렇다면 로그 변환(Log Transformation)을 사용하는 것이 좋다.
그렇지 않다면 Standard Scaling이 좋은 출발점이 될 수 있다.
알고리즘별 선택 가이드
알고리즘마다 선호하는 스케일링 방식은 다르다.
거리 기반 알고리즘(KNN, K-Means, SVM)
반드시 스케일링을 적용하는 것이 좋다. 이러한 알고리즘은 거리 계산에 의존하기 때문에 피처 간 스케일 차이에 매우 민감하다. 일반적으로 Standard Scaling 또는 Min-Max Scaling이 사용된다.
트리 기반 알고리즘(Decision Tree, Random Forest, XGBoost)
스케일링이 필수는 아니다. 이러한 알고리즘은 데이터 간 거리를 계산하지 않고 피처 값을 기준으로 분할(splitting)을 수행하기 때문에 스케일의 영향을 거의 받지 않는다.
선형 모델(Linear Regression, Logistic Regression)
Standard Scaling을 사용하는 것이 일반적이다. 스케일링은 최적화 과정의 수렴 속도를 개선하고 계수(coefficient)의 해석을 더 안정적으로 만들어 준다.
신경망(Neural Networks)
Min-Max Scaling이 자주 사용된다. 신경망의 뉴런은 일반적으로 0~1 또는 -1~1 범위의 입력값에서 더 안정적으로 학습하는 경향이 있다.
경사하강법(Gradient Descent)을 사용하는 최적화 알고리즘
스케일링을 적용하는 것이 사실상 필수적이다. 스케일 차이가 큰 피처가 존재하면 최적화 과정이 비효율적이거나 불안정해질 수 있다. Standard Scaling 또는 Min-Max Scaling이 일반적으로 사용된다.
"피처 스케일링은 단순히 있으면 좋은 선택 사항이 아니다. 많은 알고리즘에서 스케일링은 모델이 제대로 작동하느냐, 아니면 전혀 작동하지 않느냐를 결정하는 차이를 만든다."
— Sebastian Raschka, 머신러닝 연구자
실무 팁: 해야 할 것과 하지 말아야 할 것
해야 할 것(Do's)
스케일러는 반드시 학습 데이터에 대해서만 학습(fit)시키고, 이후 학습 데이터와 테스트 데이터 모두에 동일하게 적용해야 한다.
scaler.fit(X_train) # 학습 데이터로만 학습
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) # 동일한 변환을 테스트 데이터에 적용
스케일링은 반드시 학습 데이터와 테스트 데이터를 분리한 이후에 수행해야 한다. 데이터를 분리하기 전에 스케일링을 적용해서는 안 된다.
실제 운영 환경(Production)에서 사용할 수 있도록 학습된 스케일러를 저장해 두는 것이 좋다.
스케일링 전후의 데이터를 시각화하여 어떤 변화가 발생했는지 확인하는 것이 도움이 된다.
한 가지 방법만 고집하지 말고 여러 스케일링 기법을 적용해 본 뒤 모델 성능을 비교해 보는 것이 좋다.
하지 말아야 할 것(Don'ts)
전체 데이터셋을 사용해 스케일러를 학습시키지 말아야 한다. 이는 데이터 누수(Data Leakage)를 발생시켜 모델 평가 결과를 왜곡할 수 있다.
일반적으로 회귀 문제에서는 타깃 변수(Target Variable)를 스케일링하지 않는다.
범주형 변수(Categorical Variables)에 직접 스케일링을 적용해서는 안 된다. 먼저 적절한 인코딩 과정을 거쳐야 한다.
모든 피처에 동일한 스케일링 기법이 적합할 것이라고 가정해서는 안 된다.
예측 결과를 원래 단위로 되돌려야 하는 경우 inverse transform을 수행하는 것을 잊지 말아야 한다.
실제 사례: 직원 이직 예측
스케일링이 실제로 어떤 차이를 만드는지 구체적인 사례를 통해 살펴보자.
한 기업이 다음과 같은 정보를 활용하여 어떤 직원이 회사를 떠날 가능성이 있는지를 예측하려고 한다고 가정해 보자.
급여는 3만 달러에서 20만 달러 사이에 분포한다.
경력은 0년에서 40년 사이에 분포한다.
회사까지의 거리는 1km에서 100km 사이이다.
직원 만족도 점수는 1점에서 5점 사이이다.
스케일링을 적용하지 않은 경우, K-최근접 이웃(K-Nearest Neighbors, KNN) 알고리즘은 서로 다른 직원 간의 거리를 계산할 때 급여 변수에 지나치게 큰 영향을 받게 된다.
예를 들어 한 직원의 급여가 다른 직원보다 5만 달러 높다면, 알고리즘은 이를 경력이 50년 더 많거나(현실적으로 불가능한 수치이다), 집이 회사에서 50km 더 멀리 떨어진 것과 비슷한 수준의 차이로 인식할 수 있다.
결국 급여라는 변수 하나가 다른 모든 변수들을 압도하게 된다.
반면 표준화를 적용하면 모든 피처가 동일한 기준 위에서 비교된다.
이제 알고리즘은 다음과 같은 변화들을 동일한 수준의 변화로 해석할 수 있다.
급여가 평균보다 표준편차 1만큼 높은 경우(약 3만 달러 증가)
경력이 평균보다 표준편차 1만큼 높은 경우(약 8년 증가)
만족도가 평균보다 표준편차 1만큼 낮은 경우(약 0.8점 감소)
즉, 각 변수의 절대적인 크기가 아니라 해당 변수 내에서 얼마나 큰 변화인지를 기준으로 판단하게 된다.
그 결과 모델은 훨씬 의미 있는 패턴을 학습할 수 있게 된다.
실제로 적절한 스케일링을 적용한 후 모델의 정확도가 62%에서 84%까지 향상되었다.
결론: 작은 변화가 만드는 큰 차이
피처 스케일링은 언뜻 보면 사소한 기술적 세부 사항처럼 보일 수 있다. 마치 "진짜" 머신러닝이 시작되기 전에 수행하는 단순한 수학적 변환 정도로 여겨질 수도 있다. 하지만 지금까지 살펴본 것처럼, 스케일링은 겨우 작동하는 모델과 뛰어난 성능을 내는 모델을 가르는 결정적인 차이가 되기도 한다.
이렇게 생각해 보자. 노래 경연대회에서 한 참가자는 마이크를 사용하고 다른 참가자는 마이크 없이 노래를 부르는데, 그 둘을 공정하게 평가해 달라고 한다면 어떨까?
스케일링되지 않은 데이터가 머신러닝 모델에 미치는 영향이 바로 이와 같다. 어떤 피처는 소리를 지르듯 크게 들리고, 어떤 피처는 속삭이듯 작게 들리게 만든다.
스케일링의 아름다움은 단순함에 있다.
단 몇 줄의 코드만으로도 모델의 성능을 크게 향상시킬 수 있으며, 학습 시간을 단축할 수 있고, 모델을 더욱 안정적으로 만들 수 있다. 또한 스케일링이 없었다면 제대로 동작하지 못했을 알고리즘들을 사용할 수 있게 된다.
다음의 몇 가지 원칙은 기억해 두는 것이 좋다.
거리 기반 알고리즘과 경사하강법 기반 알고리즘에서는 항상 스케일링을 고려해야 한다.
이상치가 존재하거나 데이터가 정규분포를 따른다면 표준화가 좋은 선택이 된다.
값의 범위를 제한해야 하거나 신경망을 사용하는 경우에는 정규화가 적합하다.
테스트 데이터로 스케일러를 학습시키면 안 된다. 이는 시험 답안을 미리 보고 공부하는 것과 다를 바 없다.
그리고 무엇보다 다양한 방법을 직접 시도해 보는 것이 중요하다. 여러 스케일링 기법을 적용해 보고, 자신의 문제에서 어떤 방법이 가장 좋은 성능을 보이는지 확인해 보아야 한다.
머신러닝 경험이 쌓일수록 어떤 상황에서 어떤 스케일링 기법을 사용해야 하는지 자연스럽게 감이 생기게 된다. 하지만 아직 확신이 없다면 대부분의 상황에서 표준화(Standardization)는 비교적 안전한 출발점이 되어 준다.
이제 자신 있게 데이터를 스케일링해 보자. 여러분의 머신러닝 모델이 분명 그 차이를 느끼게 될 것이다.
'데이터 사이언스 & 데이터 엔지니어링' 카테고리의 다른 글
| 데이터를 이동, 변환, 신뢰하는 방법에 대한 완전 가이드 (0) | 2026.05.27 |
|---|---|
| 데이터 과학자에서 AI 아키텍트로(From Data Scientist to AI Architect) (0) | 2026.05.19 |
| 데이터 아키텍쳐의 과거, 현재, 미래 (0) | 2026.05.15 |
| 마케팅 분석에서의 대수(Logarithms)의 실용 가이드 - part 2 (0) | 2026.05.14 |
| 마케팅 분석에서의 대수(Logarithms)의 실용 가이드 - part 1 (0) | 2026.05.14 |
댓글