고차원 데이터의 차원 축소
고차원 데이터는 많은 특성을 포함하고 있어, 분석과 학습이 복잡하고 시간이 많이 소요될 수 있습니다. 차원 축소는 이러한 고차원 데이터를 더 낮은 차원으로 변환하여 데이터를 더 간결하게 표현하고, 분석 및 모델 학습을 더 효율적으로 수행할 수 있게 도와줍니다. 이번 글에서는 차원 축소 기법 중에서 가장 널리 사용되는 PCA(주성분 분석)와 선형판별 분석법에 대해 알아보겠습니다.
1. PCA 알고리즘의 이해
PCA(주성분 분석, Principal Component Analysis)는 데이터의 변동성을 최대한 보존하면서 고차원 데이터를 저차원으로 변환하는 통계 기법입니다. PCA는 데이터의 주요 변동 방향(주성분)을 찾고, 이를 새로운 축으로 삼아 데이터를 변환합니다.
PCA의 주요 개념
- 주성분(Principal Components) : 데이터의 분산을 최대화하는 방향을 나타내는 축입니다. 첫 번째 주성분은 데이터의 가장 큰 분산 방향을 나타내고, 두 번째 주성분은 첫 번째 주성분과 직교하면서 다음으로 큰 분산 방향을 나타냅니다.
- 특잇값 분해(SVD, Singular Value Decomposition) : PCA에서 주성분을 찾기 위해 사용하는 방법 중 하나로, 데이터 행렬을 세 개의 행렬(특잇값과 특이벡터)로 분해하여 주성분을 추출합니다.
- 분산 보존 : PCA는 가능한 많은 분산을 유지하면서 차원을 축소합니다. 축소된 차원은 원래 데이터의 변동성을 최대한 보존하게 됩니다.
PCA의 작동 원리
- 데이터 표준화 : 모든 특성을 평균 0, 분산 1로 정규화하여, 특성 간의 스케일 차이를 제거합니다.
- 공분산 행렬 계산 : 정규화된 데이터의 공분산 행렬을 계산합니다.
- 고유값 분해 : 공분산 행렬의 고유값과 고유벡터를 계산합니다. 고유값은 각 주성분의 설명력을 나타내며, 고유벡터는 주성분의 방향을 나타냅니다.
- 주성분 선택 : 고유값이 큰 순서대로 주성분을 선택하여, 변동성이 큰 방향을 우선적으로 보존합니다.
- 데이터 변환 : 원본 데이터를 선택한 주성분 축으로 투영하여 차원을 축소합니다.
예제 코드
Python을 사용하여 PCA를 적용하는 예제 코드는 다음과 같습니다.
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target
# PCA 모델 생성 (2개의 주성분으로 축소)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 변환된 데이터 시각화
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=100)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of Iris Dataset')
plt.colorbar()
plt.show()
위 코드는 Iris 데이터셋을 두 개의 주성분으로 축소하고, 이를 시각화하여 군집의 분포를 확인하는 예제입니다.
PCA의 장점과 단점
장점
- 효율성 : 고차원 데이터를 저차원으로 변환하여 분석 및 모델 학습을 효율적으로 수행할 수 있습니다.
- 노이즈 제거 : 데이터의 주요 패턴을 유지하면서 노이즈를 줄일 수 있습니다.
- 시각화 : 데이터를 2차원 또는 3차원으로 변환하여 시각적으로 분석할 수 있습니다.
단점
- 선형성 가정 : PCA는 선형적으로 분산을 최대화하는 방향만 찾기 때문에 비선형 데이터에서는 효과적이지 않을 수 있습니다.
- 해석의 어려움 : 변환된 주성분은 원래 특성과 직접적인 연관이 없기 때문에, 해석이 어려울 수 있습니다.
2. 선형판별 분석법 (LDA)
선형판별 분석법(LDA, Linear Discriminant Analysis)는 차원 축소와 분류를 동시에 수행하는 기법으로, 클래스 간의 분산을 최대화하고 클래스 내의 분산을 최소화하여 데이터를 저차원으로 변환합니다. LDA는 주로 지도 학습의 상황에서 사용되며, 각 클래스 간의 분리를 최대화하는 방향을 찾는 데 중점을 둡니다.
LDA의 주요 개념
- 판별 함수(Discriminant Function) : 데이터 포인트를 분리하는 초평면을 정의하는 함수입니다.
- 클래스 간 분산(Between-class Variance) : 서로 다른 클래스 간의 평균 차이를 나타내는 분산입니다.
- 클래스 내 분산(Within-class Variance) : 같은 클래스 내에서 데이터 포인트들의 흩어짐 정도를 나타내는 분산입니다.
LDA의 작동 원리
- 클래스 평균 계산 : 각 클래스의 평균 벡터를 계산합니다.
- 클래스 내 분산과 클래스 간 분산 행렬 계산
- 클래스 내 분산 행렬은 각 클래스의 데이터가 자신의 평균에서 얼마나 떨어져 있는지를 나타냅니다.
- 클래스 간 분산 행렬은 각 클래스의 평균이 전체 평균에서 얼마나 떨어져 있는지를 나타냅니다.
- 고유값 분해 : 클래스 간 분산과 클래스 내 분산의 비율을 최대화하는 고유벡터를 계산하여, 데이터의 변환 방향을 결정합니다.
- 데이터 변환 : 원본 데이터를 선택한 판별 축으로 투영하여 차원을 축소합니다.
수식
- 클래스 간 분산 행렬
여기서 는 클래스의 평균, 는 전체 평균, 는 클래스의 샘플 수입니다.
- 클래스 내 분산 행렬
여기서 는 클래스 에 속한 데이터 포인트입니다.
- 최적의 판별 축은 다음과 같이 정의됩니다
예제 코드
Python을 사용하여 LDA를 적용하는 예제 코드는 다음과 같습니다.
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target
# LDA 모델 생성 (2개의 판별 축으로 축소)
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X, y)
# 변환된 데이터 시각화
plt.figure(figsize=(8, 6))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, cmap='viridis', edgecolor='k', s=100)
plt.xlabel('Linear Discriminant 1')
plt.ylabel('Linear Discriminant 2')
plt.title('LDA of Iris Dataset')
plt.colorbar()
plt.show()
위 코드는 Iris 데이터셋을 두 개의 판별 축으로 축소하고, 이를 시각화하여 클래스 간의 분리를 확인하는 예제입니다.
LDA의 장점과 단점
장점
- 분류 성능 향상 : 클래스 간 분리를 최대화하여 분류 모델의 성능을 향상시킬 수 있습니다.
- 저차원 변환 : 높은 차원의 데이터를 저차원으로 변환하여 시각화할 수 있습니다.
- 빠른 계산 속도 : 상대적으로 계산이 빠르고, 적용이 쉽습니다.
단점
- 선형성 가정 : LDA는 클래스 간의 분리가 선형적으로 가능하다는 가정 하에 동작하므로, 비선형 데이터에서는 효과적이지 않을 수 있습니다.
- 클래스 간 분포 동일 가정 : LDA는 각 클래스가 동일한 공분산 구조를 가진다는 가정을 합니다.
이 글에서는 고차원 데이터의 차원 축소를 위한 PCA와 선형판별 분석법에 대해 알아보았습니다. 두 방법 모두 데이터를 간결하게 표현하고, 분석과 예측 성능을 향상시키는 데 중요한 도구입니다. 각 기법의 특성과 적용 상황을 잘 이해하고 활용하면, 다양한 데이터 분석 및 기계 학습 문제를 효과적으로 해결할 수 있습니다.
'인공지능학 > 기계학습' 카테고리의 다른 글
[기계학습] 9. 앙상블 학습의 이해, 랜덤 포레스트 모델의 이해 (2) | 2024.08.20 |
---|---|
[기계학습] 8. 의사결정트리의 이해 (1) | 2024.08.07 |
[기계학습] 7. 서포트벡터머신의 이해 (0) | 2024.08.07 |
[기계학습] 6. 군집화의 이해 (0) | 2024.08.06 |
[기계학습] 5. KNN 알고리즘과 로지스틱 회귀모델 (0) | 2024.08.05 |