비지도학습과 차원 축소: 데이터의 핵심만 남기기
데이터가 많으면 많을수록 좋을까? 정답은 "아니요"다. 변수(Feature)가 너무 많아지면 오히려 모델이 길을 잃는 '차원의 저주'에 빠지게 된다. 오늘은 이 저주를 풀기 위한 차원 축소 기법과 정답 없이 학습하는 비지도학습의 정수를 정리해 본다.
1. 비지도 학습: 정답 없이 묶어보기 (Clustering)
정답(y)이 없을 때 데이터끼리의 유사성만으로 그룹을 묶는 방법이다.
1) K-평균 (K-Means)
- 데이터를 K개의 군집으로 묶는다.
- 최적의 K 찾기: * 엘보우(Elbow) 방법: 군집 내 오차가 급격히 줄어들다가 완만해지는 '팔꿈치' 지점을 찾는다.
- 실루엣 점수 (Silhouette Score): 군집 안에서는 얼마나 가깝고, 다른 군집과는 얼마나 먼지를 수치화(0~1)한다. 1에 가까울수록 잘 묶인 것!
- 주의: 비지도 학습은 정답이 없어서 수치적인 점수도 중요하지만, 실제 비즈니스 도메인 지식(정성 평가)이 매우 중요하다.
2) DBSCAN
- K-Means처럼 원형으로만 묶는 게 아니라, 데이터의 밀도를 보고 복잡한 모양의 군집도 찾아낸다. 이상치(Noise) 제거에 강력하다.
2. 특징 공학 (Feature Engineering): 새로운 변수의 창조
기존 변수를 조합해 모델이 이해하기 쉬운 새로운 정보를 만드는 예술이다.
- 시간 데이터: 타임스탬프에서 '요일', '시간대(출근/퇴근)', '주말 여부' 추출.
- 범주 데이터: 원-핫 인코딩 시 컬럼 하나를 줄여($N-1$) 다중공선성을 방지하는 센스!
3. 차원의 저주 (Curse of Dimensionality)
데이터의 특성(컬럼) 수가 늘어날수록, 데이터가 존재하는 공간의 부피가 기하급수적으로 커진다.
- 현상: 데이터 사이의 거리가 너무 멀어져서 **희소(Sparse)**해진다.
- 문제: 계산량이 폭증하고, 모델이 의미 없는 노이즈까지 학습하여 성능이 오히려 나빠진다.
- 해결책: 1. 변수 선택: 릿지/라쏘 규제를 써서 불필요한 가중치를 0으로 만들거나 제거한다.3. 차원 축소 (PCA): 여러 변수를 조합해 핵심 정보만 담은 새로운 축으로 압축한다.
- 2. 트리 중요도: 결정 트리의 feature_importances_를 보고 상위 변수만 남긴다.
4. PCA (주성분 분석): 정보의 손실을 최소화하는 압축
PCA는 단순히 변수를 버리는 것이 아니라, 데이터를 가장 잘 설명하는 새로운 방향(주성분)을 찾아내는 과정이다.
🔍 PCA의 4단계 작동 원리
- 표준화(Standardization) 필수: PCA는 거리를 기반으로 하므로, 단위에 민감하다. 반드시 평균 0, 표준편차 1로 맞춰야 한다.
- 공분산 행렬 계산: 변수들끼리 얼마나 같이 움직이는지(선형 관계)를 파악한다.
- 고유값(Eigenvalue) & 고유벡터(Eigenvector) 추출: 데이터의 분산(정보량)이 가장 큰 '축'의 방향과 크기를 찾는다.
- 투영(Projection): 정보량이 가장 큰 상위 N개의 축으로 데이터를 쏟아붓는다.
⚠️ PCA의 트레이드 오프
- 장점: 데이터 용량이 줄고 학습 속도가 빨라지며, 시각화가 가능하다.
- 단점: 원래 변수가 가졌던 의미가 사라진다. (예: '키'와 '몸무게'를 합친 축은 해석하기 어렵다.)
4. 통계적 기법들
질문자님이 언급하신 흥미로운 개념들을 머신러닝 맥락으로 연결해 보자.
- 다중 대치법 (Multiple Imputation): 결측치를 채울 때 한 번만 채우는 게 아니라 여러 번 시뮬레이션해서 통계적 불확실성을 줄이는 고급 기법이다.
- 몬테카를로 (Monte Carlo): 무작위 추출을 통해 수없이 반복 실험하며 확률적으로 정답을 근사하는 방법이다. "다 해보는 것"의 끝판왕이라 할 수 있다.
- 비선형 구조와 딥러닝: PCA는 선형적인 관계만 찾을 수 있다. 반면 딥러닝은 비선형 구조를 파악하는 데 탁월하며, 스케일러가 필요 없는 일부 모델(트리 계열 등)과 달리 신경망 계열은 전처리가 매우 중요하다.
5. 실전 코드: 시각화로 확인하는 차원 축소
아이리스(Iris) 데이터를 이용해 차원 축소 전후의 분포를 확인하는 코드다.
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
import pandas as pd
# 데이터 로드
iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target
# 시각화 (두 개의 피처만 사용했을 때)
for i, marker in enumerate(['^', 's', 'o']):
x_axis = iris_df[iris_df['target'] == i]['sepal length (cm)']
y_axis = iris_df[iris_df['target'] == i]['sepal width (cm)']
plt.scatter(x_axis, y_axis, marker=marker, label=iris.target_names[i])
plt.legend()
plt.title("Iris Data Distribution (Original)")
plt.xlabel("sepal length")
plt.ylabel("sepal width")
plt.show()
✍️ 공부를 마치며
차원 축소는 결국 '정보의 효율적인 압축'이다. 무작위로 데이터를 버리는 것이 아니라, 분산이 가장 큰 축을 찾아 데이터를 투영함으로써 데이터의 신호(Signal)는 남기고 소음(Noise)은 제거하는 예술적인 과정이다. 이제 우리는 방대한 데이터를 다룰 준비가 되었다.
'AI > Machine Learning' 카테고리의 다른 글
| 앙상블 학습 (Ensemble) (0) | 2025.06.24 |
|---|---|
| 과적합과 규제 (L1/L2) (0) | 2025.06.23 |
| 평가지표와 통계적 판단 (0) | 2025.06.22 |
| 전처리와 분석 (0) | 2025.06.21 |
| 경사하강법 (최적화) (0) | 2025.06.20 |