데이터 과학과 머신러닝에서는 고차원의 데이터가 문제 해결의 중요한 요소이다. 그러나 차원이 클수록 계산 비용이 증가하고, 과적합(overfitting)의 위험이 커질 수 있다. 이를 해결하기 위해 주성분 분석(PCA, Principal Component Analysis)은 널리 사용되는 차원 축소 기법이다. 이번 포스트에서는 주성분 분석이 무엇인지, 어떻게 작동하는지 그리고 Python으로 구현하는 방법과 데이터 검증 방법에 대해 알아보도록 하자.
주성분 분석(PCA)란?
주성분 분석(PCA, Principal Component Analysis)은 고차원 데이터를 저차원 공간으로 변환하여 데이터의 중요한 정보를 최대한 보존하면서 차원을 축소하는 알고리즘이다. 데이터의 분산을 최대화하는 새로운 축(주성분)을 찾아 데이터를 투영하여 변환한다.
주성분 분석(PCA)의 주요 목적
- 차원 축소: 데이터의 복잡성을 줄여 모델의 효율성을 높인다.
- 데이터 시각화: 2차원 또는 3차원으로 변환하여 시각적으로 이해하기 쉽게 한다.
- 노이즈 제거: 중요하지 않은 정보를 제거하여 분석 성능을 향상시킨다.
주성분 분석(PCA)의 작동 원리
PCA는 다음과 같은 단계를 거쳐 데이터를 축소하게 된다.
- 데이터 정규화: 각 변수의 평균이 0, 분산이 1이 되도록 정규화한다.
- 공분산 행렬 계산: 데이터의 공분산 행렬을 계산하여 변수들 간의 분산 관계를 파악한다.
- 고유값 분해: 공분산 행렬을 고유값 분해(Eigenvalue Decomposition)하여 고유값과 고유벡터를 구한다.
- 주성분 선택: 가장 큰 고유값에 해당하는 고유벡터를 선택해 주성분으로 사용한다.
- 데이터 변환: 데이터를 선택된 주성분으로 투영하여 차원을 축소한다.
Python 코드 구현
Python을 사용하여 3차원 데이터를 2차원으로 축소시키는 주성분 분석(PCA)을 구현하는 코드를 알아보자.
import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA # 예제 데이터 생성 X1 = np.random.multivariate_normal([3, 5, 2], [[0.1, 0, 0], [0, 0.1, 0], [0, 0, 0.1]], 50) X2 = np.random.multivariate_normal([6, 2, 6], [[0.1, 0, 0], [0, 0.1, 0], [0, 0, 0.1]], 50) X3 = np.random.multivariate_normal([7, 2, 7], [[0.1, 0, 0], [0, 0.1, 0], [0, 0, 0.1]], 50) X = np.vstack((X1, X2, X3)) y = np.array([0] * 50 + [1] * 50 + [2] * 50) # 예제 데이터 시각화 fig = plt.figure(figsize=(12, 6)) ax = fig.add_subplot(121, projection='3d') sc = ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='viridis', edgecolor='k') ax.set_title('Original 3D Data') ax.set_xlabel('Feature 1') ax.set_ylabel('Feature 2') ax.set_zlabel('Feature 3') # PCA 모델 적용 pca = PCA(n_components=2) # 2차원으로 축소 X_pca = pca.fit_transform(X) # 결과 시각화 ax2 = fig.add_subplot(122) scatter = ax2.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k') ax2.set_title('PCA Result (2D Projection)') ax2.set_xlabel('Principal Component 1') ax2.set_ylabel('Principal Component 2') plt.tight_layout() plt.show()
코드 해설
PCA(n_components=2)
: 데이터를 2차원으로 축소한다.fit_transform
: PCA 모델을 학습하고 데이터를 변환한다.
주성분 분석(PCA)을 통한 차원 축소 후 데이터 검증 방법
주성분 분석을 통해 데이터의 차원을 축소한 후, 모델의 성능이나 데이터의 품질을 검증하는 것은 중요하다. 차원 축소 과정에서 정보 손실이 발생할 수 있기 때문에, 축소된 데이터가 분석에 충분한 정보를 제공하는지 확인해야 한다.
분산 비율을 통한 검증
주성분 분석은 각 주성분이 데이터의 분산을 얼마나 설명하는지를 나타내는 분산 비율(Explained Variance Ratio)를 제공한다. 이를 통해 각 주성분이 데이터의 전체 변동성 중 얼마나 기여하는지 파악할 수 있다.
확인 방법
pca.explained_variance_ratio_
를 사용하여 각 주성분의 설명된 분산 비율을 확인한다. 일반적으로 누적 설명된 분산 비율이 80% 이상이면 충분하다고 판단할 수 있다.
import numpy as np from sklearn.decomposition import PCA # 분산 비율 출력 print("Explained variance ratio:", pca.explained_variance_ratio_) print("Cumulative explained variance:", np.cumsum(pca.explained_variance_ratio_))
결과
Explained variance ratio: [0.97363557 0.01696163] Cumulative explained variance: [0.97363557 0.9905972 ]
Explained variance ratio: [0.97363557, 0.01696163]
- 첫 번째 주성분이 전체 데이터의 약 97.36%의 분산을 설명한다.
- 두 번째 주성분은 약 1.70%의 분산을 추가로 설명한다.
- 첫 번째 주성분이 대부분의 정보를 설명하고 있다는 것을 알 수 있다.
Cumulative explained variance: [0.97363557, 0.9905972]
- 두 주성분을 합치면 전체 데이터의 약 99.06%의 분산을 설명할 수 있다.
- 따라서 차원 축소 후에도충분한 정보 보존이 이루어졌음을 알 수 있고, 분석이나 모델링에 적합하다고 할 수 있다.
재구성 오류를 통한 검증 방법
차원 축소된 데이터를 원래 차원으로 복원한 후, 원래 데이터와 비교하여 재구성 오류(Reconstruction Error)를 계산할 수 있다. 오류가 낮을수록 차원 축소 후 정보 손실이 적다는 것을 의미한다.
확인 방법
축소된 데이터를 inverse_transform()
으로 복원한 뒤 원본 데이터와의 차이를 계산한다.
X_reconstructed = pca.inverse_transform(X_pca) reconstruction_error = np.mean((X - X_reconstructed) ** 2) print("Reconstruction error:", reconstruction_error)
결과
Reconstruction error: 0.03157252491785683
재구성 오류 (Reconstruction error): 0.03157252491785683
- 이 값은 주성분 분석으로 차원을 축소한 후 다시 원래 차원으로 복원했을 때 원본 데이터와의 평균 제곱 오차를 나타낸다.
- 오류 값이 낮다는 것은 차원 축소 과정에서 데이터의 정보 손실이 적다는 것을 의미한다. 즉, 원본 데이터의 중요한 특성이 대부분 유지되었다고 볼 수 있다.
- 0.031이라는 오류 값은 상당히 작은 값으로, 차원 축소 후에도 데이터가 거의 원래 형태를 유지한다는 것을 보여준다.
시각화
차원 축소된 데이터를 2D 또는 3D로 시각화하여 데이터의 구조나 클러스터링 특성을 시각적으로 확인할 수 있다.
확인 방법
2D 플롯이나 3D 플롯을 사용하여 데이터가 잘 구분되는지 확인한다.
PCA의 장단점
장점
- 데이터의 주요 정보 보존
- 차원 축소로 인한 계산 비용 감소
- 시각화를 통해 데이터의 구조 파악 용이
단점
- 선형적인 방법이기 때문에 비선형 데이터의 경우 한계가 있다.
- 데이터 해석이 어려울 수 있다.(주성분이 원래 특징과 관련이 없는 경우)
결론
주성분 분석(PCA)은 데이터 축소 및 시각화에 매우 유용한 알고리즘이다. 이를 통해 데이터의 주요 정보를 유지하면서 복잡성을 줄이고, 분석 및 모델링의 효율성을 높일 수 있다. 위 코드를 사용해 직접 구현해 보고, 다양한 데이터 세트에 적용해 보시기 바란다.