일반적인 데이터 정규화 방법
최소-최대 정규화(Min-Max Normalization)
- 데이터를 0과 1 사이의 값으로 변환하는 방법이다.
- 수식:
- 각 특성의 최소값을 0, 최대값을 1로 설정한다.
- 데이터의 분포가 명확한 경계를 가질 때 효과적이다.
Z-점수 정규화(Z-Score Normalization)
- 각 특성의 평균을 0, 표준편차를 1로 만드는 방법이다.
- 수식:
- 여기서 는 평균, 는 표준편차이다.
- 이 방법은 이상치에 덜 민감하고, 데이터의 분포가 정규 분포와 유사할 때 유용하다.
로버스트 정규화(Robust Scaling)
- 중앙값(median)과 사분위수(quartile)를 이용하여 정규화하는 방법이다.
- 수식:
- 여기서 는 상위 사분위수, 은 하위 사분위수이다.
- 이 방법은 이상치에 영향을 덜 받으며, 데이터에 이상치가 많을 때 효과적이다.
정규화 방법에 따른 차이를 차트로 확인하기
데이터 정규화의 이유
- 특성 간 스케일 조정: 서로 다른 스케일을 가진 데이터 특성(변수)들의 범위를 조정하여, 각 특성이 모델 학습에 미치는 영향을 동등하게 만든다.
- 학습 효율성 향상: 특성들이 같은 스케일을 가짐으로써, 최적화 알고리즘이 더 빠르고 효과적으로 수렴할 수 있다.
- 이상치 영향 최소화: 정규화를 통해 이상치의 영향을 줄일 수 있으며, 보다 안정적인 모델을 구축할 수 있다.
- 알고리즘 요구사항 충족: 일부 머신러닝 알고리즘, 특히 거리 기반 알고리즘(예: K-최근접 이웃, K-Means)과 선형 모델은 특성들이 비슷한 스케일을 가질 때 최적의 성능을 발휘한다.
정규화 샘플 코드
import seaborn as sns
# 가상의 산포 데이터 A와 B 생성
np.random.seed(0)
data_A = np.random.normal(10, 2, 100)
data_B = np.random.normal(14, 3, 100)
# 데이터 프레임 생성
df = pd.DataFrame({'A': data_A, 'B': data_B})
# 최소-최대 정규화
df_min_max = pd.DataFrame(min_max_scaler.fit_transform(df), columns=['A', 'B'])
# Z-점수 정규화
df_standard = pd.DataFrame(standard_scaler.fit_transform(df), columns=['A', 'B'])
# 로버스트 정규화
df_robust = pd.DataFrame(robust_scaler.fit_transform(df), columns=['A', 'B'])
# 시각화
fig, axs = plt.subplots(4, 1, figsize=(10, 20))
# 원본 데이터
sns.kdeplot(data=df, ax=axs[0])
axs[0].set_title('Original Data')
# 최소-최대 정규화 데이터
sns.kdeplot(data=df_min_max, ax=axs[1])
axs[1].set_title('Min-Max Normalization')
# Z-점수 정규화 데이터
sns.kdeplot(data=df_standard, ax=axs[2])
axs[2].set_title('Z-Score Normalization')
# 로버스트 정규화 데이터
sns.kdeplot(data=df_robust, ax=axs[3])
axs[3].set_title('Robust Scaling')
plt.tight_layout()
plt.show()
결론
데이터를 정규화하는 것은 머신러닝과 데이터 분석에서 중요한 전처리 단계이다. 각 방법은 특정 상황과 데이터의 특성에 따라 적합하며, 데이터의 분포와 모델의 종류를 고려하여 적절한 정규화 방법을 선택해야 한다. 정규화를 통해 데이터를 표준화하면 모델의 학습 과정이 더 안정적이고 효율적이 되며, 더 나은 성능을 달성할 수 있다.