주성분 분석
1. 차원과 차원 축소
차원의 개념
- 차원이란 데이터에서 각 특성(Feature)의 수를 의미합니다. 예를 들어, 사람의 키, 몸무게, 나이라는 3가지 특성을 가진 데이터는 3차원 데이터입니다.
차원 축소의 필요성
- 차원의 저주: 차원이 증가할수록, 각 차원에 걸쳐 데이터를 충분히 표현하기 위해 필요한 데이터 양이 기하급수적으로 증가합니다. 이로 인해 모델의 성능이 저하될 수 있습니다.
- 계산 효율성 및 시각화: 높은 차원의 데이터를 처리하는 것은 계산상의 비효율을 초래하며, 3차원 이상의 데이터는 직관적으로 이해하고 시각화하기 어렵습니다.
2. 주성분 분석 소개
PCA의 원리
- 주성분 분석은 데이터의 분산을 최대화하는 축을 찾아 데이터를 새로운 축에 투영함으로써 차원을 축소합니다. 이 때 새로운 축들은 서로 직교합니다.
주성분(Principal Components)
- 데이터의 분산이 최대인 방향을 찾아 그 방향으로 데이터를 투영한 것이 주성분입니다. 첫 번째 주성분은 데이터의 분산을 가장 많이 설명하고, 두 번째 주성분은 첫 번째 주성분에 직각이면서 다음으로 큰 분산을 설명하는 방향입니다.
# 필요한 라이브러리를 불러옵니다.
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# Iris 데이터셋을 로드합니다.
data = load_iris()
X = data.data
# 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=data.target, cmap='viridis')
plt.xlabel('First principal component')
plt.ylabel('Second principal component')
plt.title('PCA result of Iris Dataset')
plt.colorbar()
plt.show()
3. PCA 클래스 (scikit-learn
)
주요 매개변수
n_components
: 축소할 차원의 수를 지정합니다. 기본적으로는 None으로 설정되며, 이 경우 더 적은 수의 주성분으로 설정됩니다.
random_state
: 결과의 일관성을 위한 난수 시드를 설정합니다.
주요 속성
components_
: 추출된 주성분의 방향 벡터입니다.
explained_variance_
: 각 주성분에 의해 설명된 분산의 양입니다.
explained_variance_ratio_
: 전체 분산에 대한 각 주성분의 분산 비율입니다.
# PCA 객체의 주요 속성을 출력합니다.
print("Components (Principal axes):", pca.components_)
print("Explained variance:", pca.explained_variance_)
print("Explained variance ratio:", pca.explained_variance_ratio_)
4. 원본 데이터 재구성
- PCA 변환 후,
inverse_transform()
메서드를 사용하여 축소된 차원에서 원본 차원으로 데이터를 복원할 수 있습니다. 이 과정에서 일부 정보 손실이 발생하지만, 주요 특성은 유지됩니다.
# 차원 축소된 데이터를 원래의 차원으로 복원합니다.
X_inverse = pca.inverse_transform(X_pca)
# 원본 데이터와 복원된 데이터의 비교를 위해 시각화합니다.
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], alpha=0.2, label='Original')
plt.scatter(X_inverse[:, 0], X_inverse[:, 1], alpha=0.8, label='Recovered')
plt.legend()
plt.title('Comparison of Original and Recovered Data')
plt.show()
5. 설명된 분산
- 설명된 분산은 PCA에서 각 주성분이 데이터 전체 분산에서 얼마나 많은 부분을 차지하는지를 나타내는 지표입니다. 높은 설명된 분산 비율은 주성분이 데이터의 중요한 정보를 많이 포함하고 있음을 의미합니다.
6. 다른 알고리즘과 함께 사용하기
- PCA는 다른 기계학습 알고리즘 전에 데이터를 전처리하는 단계로 사용될 수 있습니다. 차원이 축소된 데이터는 학습 속도를 향상시키고, 과적합을 방지하는 효과가 있습니다. 예를 들어, 고차원 데이터에 대해 SVM, 로지스틱 회귀 등을 적용하기 전에 PCA로 차원을 축소하는 것이 일반적입니다.
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# PCA를 적용한 데이터로 로지스틱 회귀 모델을 학습합니다.
X_train, X_test, y_train, y_test = train_test_split(X_pca, data.target, test_size=0.2, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
# 모델의 정확도를 평가합니다.
print("Test accuracy:", model.score(X_test, y_test))
댓글남기기