데이터 차원 축소를 위한 PCA, LDA, K-PCA
2024. 8. 7. 22:33ㆍML
차원 축소란 데이터프레임의 여러 변수들 중에 가장 설명력이 높은 것을 찾는 과정을 뜻합니다. 데이터 압축은 머신 러닝에서 중요한 과제인데, 막대한 양의 데이터를 저장하고 분석하는 데 자원을 아껴 줄 것이기 때문입니다.
와인의 성분(특성)와 와인의 종류(정답)를 가지고 있는 와인 데이터셋에 비유하여 설명하겠습니다.
PCA(Principal Component Analysis / 주성분분석)
와인의 종류를 모르는 상태에서 데이터의 분산을 최대화하는 와인의 성분을 찾는 것입니다.
- 데이터의 전체 분산을 최대화하는 새로운 축을 찾습니다.
- 공분산 행렬을 계산한 후, 이 행렬의 방향을 나타내는 고유벡터(eigenvector)와 방향에 대한 크기를 나타내는 고유값(eigenvalue) 구합니다.
- 가장 큰 고유값에 해당하는 고유벡터들이 데이터의 주성분이 됩니다.
- 이 주성분들을 이용해 데이터를 새로운 저차원 공간으로 투영합니다.
LDA(Linear Discriminant Analysis / 선형판별분석)
와인의 종류를 아는 상태에서 와인의 종류 간 분산을 최대화하면서 같은 종류 내의 분산을 최소화하는 와인 성분을 찾는 것입니다.
- 클래스 간 분산(between-class scatter)과 클래스 내 분산(within-class scatter)을 계산합니다.
- 이 두 가지 분산을 모두 고려하여 가장 잘 분리되는 축을 찾습니다.
- 클래스 간 분산을 최대화하고 클래스 내 분산을 최소화하는 선형 판별 벡터를 구합니다.
- 이를 통해 데이터를 새로운 저차원 공간으로 투영합니다.
Kernel PCA
PCA의 확장판으로, 선형으로 분류되지 않는 데이터를 3차원 공간으로 잠시 다녀오게 해 PCA로 분류되게 하는 것입니다.
커널 트릭을 사용하여 선형적으로 분리되지 않는 데이터를 더 높은 차원 공간으로 매핑한 뒤, 그 공간에서 PCA를 적용하는 방법입니다. 이를 통해 비선형 데이터도 효과적으로 차원을 축소하고 주요 특징을 파악할 수 있습니다.
아이리스를 분류한 결과는 다음과 같습니다
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.decomposition import KernelPCA
import numpy as np
# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# LDA
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X, y)
# Kernel PCA
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
X_kpca = kpca.fit_transform(X)
# Plotting
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(18, 6))
# Colors and labels for the classes
colors = ['red', 'green', 'blue']
labels = iris.target_names
# PCA Plot
for i, color, label in zip([0, 1, 2], colors, labels):
ax[0].scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, label=label, alpha=0.5)
ax[0].set_title('PCA')
ax[0].set_xlabel('Principal Component 1')
ax[0].set_ylabel('Principal Component 2')
ax[0].legend()
# LDA Plot
for i, color, label in zip([0, 1, 2], colors, labels):
ax[1].scatter(X_lda[y == i, 0], X_lda[y == i, 1], color=color, label=label, alpha=0.5)
ax[1].set_title('LDA')
ax[1].set_xlabel('LD1')
ax[1].set_ylabel('LD2')
ax[1].legend()
# KPCA Plot
for i, color, label in zip([0, 1, 2], colors, labels):
ax[2].scatter(X_kpca[y == i, 0], X_kpca[y == i, 1], color=color, label=label, alpha=0.5)
ax[2].set_title('Kernel PCA')
ax[2].set_xlabel('Principal Component 1')
ax[2].set_ylabel('Principal Component 2')
ax[2].legend()
plt.show()
'ML' 카테고리의 다른 글
그리드 서치로 하이퍼파라미터 튜닝 (0) | 2024.08.12 |
---|---|
모델 복잡도 제한을 위한 L1 / L2 규제 (1) | 2024.08.03 |
이진분류 모델들에 대한 간단한 정리 (0) | 2024.08.01 |