비지도 학습: 차원 축소
비지도 학습 unsupervised learning
- 라벨이 없는 데이터로부터 학습
- 데이터의 구조나 패턴 발견
- 종류
- 클러스터링(clustering): 비슷한 특성을 가지는 군집으로 묶음
- 차원 축소(dimensionality reduction): 데이터를 더 낮은 차원으로 표현
- 예시
- 고객 세분화: 비슷한 특성을 가진 고객 그룹으로 분류
- 문서 군집화: 유사한 내용의 문서를 자동으로 묶음
- 차원 축소: 데이터의 중요 정보를 유지하면서 차원 축소
- 장바구니 분석: 고객의 구매 패턴을 분석하여 연관 상품 추천
차원 축소 Dimensionality Reduction
- 고차원(많은 특성) 데이터를 중요한 정보는 최대한 유지하면서 더 낮은 차원으로 변환하는 기법
- 목표 및 장점:
- 과적합 방지: 모델 복잡도를 줄여 일반화 성능 향상.
- 계산 효율성 증대: 학습 속도 향상, 메모리 및 저장 공간 절약.
- 시각화 용이: 2D 또는 3D로 데이터를 시각화하여 패턴 파악에 도움.
- '차원의 저주' 완화: 고차원 공간에서 발생하는 데이터 희소성 및 거리 계산 문제 완화.
- (경우에 따라) 성능 향상: 불필요하거나 노이즈가 많은 특성 제거.
- 고려사항:
- 차원 축소 과정에서 일부 정보 손실이 발생할 수 있음.
- 특성 추출로 생성된 새로운 특성은 원래 특성의 의미를 직관적으로 해석하기 어려울 수 있음.
- 성격: 사람의 다양한 특성을 외향적/내향적 등 몇 가지 차원으로 표현하는 일상에서 차원 축소의 예
여러 가지 차원 축소 기법
- 주성분 분석(Principal Component Analysis, PCA)
고차원 데이터를 저차원으로 변환하여 데이터의 분산을 최대한 보존하는 기법 - 독립성분 분석(Independent Component Analysis, ICA)
관측된 데이터가 여러 독립적인 신호의 혼합물로 구성되어 있다고 가정 - 비음행렬 분해(Non-Negative Matrix Factorization, NMF)
행렬을 두 개의 비음수 행렬의 곱으로 분해하는 기법
t-SNE t-Distributed Stochastic Neighbor Embedding
- 고차원 데이터를 저차원 공간(일반적으로 2차원 또는 3차원)으로 변환하여 데이터의 구조적 특징을 시각적으로 이해할 수 있게 하는 차원 축소 기법
- 방법
- 고차원 공간에서 다변량 정규분포를 기반으로 유사성을 확률로 계산
- 저차원 공간에서의 다변량 t 분포를 기반으로 유사성을 확률로 계산
- 고차원 공간에서의 확률 분포와 저차원 공간에서의 확률 분포의 차이를 KL 발산으로 측정
- KL 발산을 최소화하도록 저차원 공간의 좌표를 결정
- 단점 및 해석상 주의점
- 계산 비용이 높음
- 같은 데이터셋에서도 실행할 때마다 다른 결과
- 저차원 공간에서 거리가 반드시 고차원 공간에서 거리와 비례하지 않음
- 비선형 차원 축소 기법
PCA 실습
- 데이터
cc = pd.read_excel('cancer.xlsx')
X = cc.iloc[:, 1:] - PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
시각화
import matplotlib.pyplot as plt
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=cc.iloc[:, 0].map({'M': 1, 'B': 0}))
결정 경계의 시각화
- 랜덤 포레스트
from sklearn.ensemble import RandomForestClassifier
y = cc.iloc[:, 0].map({'M': 1, 'B': 0})
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)
y_pred = rf.predict(X) - 시각화
pc0_min, pc0_max = X_pca[:, 0].min() - 1, X_pca[:, 0].max() + 1 # 가로축 범위
pc1_min, pc1_max = X_pca[:, 1].min() - 1, X_pca[:, 1].max() + 1 # 세로축 범위
pc0, pc1 = np.meshgrid(np.linspace(pc0_min, pc0_max, 200), np.linspace(pc1_min, pc1_max, 200))
X_range = pca.inverse_transform(np.c_[pc0.ravel(), pc1.ravel()]) # 역변환
y_pred = rf.predict_proba(X_range)[:, 1]
y_pred = y_pred.reshape(pc0.shape)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, edgecolor='k')
plt.contourf(pc0, pc1, y_pred, alpha=0.3, levels=np.linspace(y_pred.min(), y_pred.max(), 3))