본문 바로가기
AI/Machine-Learning

주성분 분석(Principal Component Analysis, PCA)

by Wikinist 2023. 9. 8.

주성분 분석(Principal Component Analysis, PCA)은 다차원 데이터를 저차원으로 축소하거나 주요 정보를 추출하는 데 사용되는 통계적 기법입니다. PCA는 데이터의 차원을 줄이면서 데이터의 구조와 분산을 최대한 보존하려는 목적을 가지고 있으며 주로 데이터 압축, 시각화, 패턴 인식 및 머신러닝 모델에서의 전처리 단계로 활용됩니다.

PCA를 주요 단계와 개념

데이터 준비: PCA를 적용할 다차원 데이터를 준비합니다. 이 데이터는 각 데이터 포인트(예: 관측값)가 여러 개의 특성(예: 변수)으로 구성되어 있어야 합니다.

데이터 표준화: 각 특성의 스케일을 맞춰야 합니다. 이는 데이터의 단위 차이를 해결하고 PCA가 모든 특성을 고르게 고려할 수 있게 해줍니다.

공분산 행렬 계산: 데이터의 특성 간 상관 관계를 나타내는 공분산 행렬을 계산합니다. 이 행렬은 주성분을 추출하는 데 필요한 정보를 제공합니다.

고유값과 고유벡터 계산: 공분산 행렬의 고유값과 고유벡터를 계산합니다. 고유값은 주성분의 중요도를 나타내며, 고유벡터는 주성분의 방향을 나타냅니다.

주성분 선택: 고유값을 내림차순으로 정렬하고, 주어진 설명된 분산 비율(주로 95% 정도)을 만족하는 주성분의 개수를 선택합니다.

주성분 계산: 선택한 주성분의 개수에 따라 고유벡터를 결합하여 주성분을 계산합니다.

주성분에 데이터 투영: 원본 데이터를 선택한 주성분으로 투영합니다. 이러한 투영은 데이터를 저차원 공간으로 변환하는 것이며, 주로 첫 번째 주성분으로 데이터를 투영하면 데이터의 분산이 가장 크게 보존됩니다.

차원 축소: 원하는 차원 수에 따라 주성분 중 일부만 선택하여 데이터를 저차원으로 축소합니다. 이로써 데이터의 크기를 줄이고, 불필요한 잡음을 제거할 수 있습니다.

scikit-learn PCA

scikit-learn (sklearn) 라이브러리에서 PCA (Principal Component Analysis)를 수행하는 함수는 PCA 클래스를 사용합니다. PCA 클래스의 주요 매개변수와 시그니처를 설명하겠습니다.

from sklearn.decomposition import PCA

pca = PCA(n_components=None, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)

여기서 각 매개변수에 대한 설명은 다음과 같습니다:

n_components: PCA에서 유지할 주성분의 개수를 지정하는 매개변수입니다. 기본값은 None으로, 이 경우 원본 데이터의 차원 수만큼 주성분이 유지됩니다. 정수값으로 설정하거나 [0.0, 1.0] 범위의 부동 소수점 값을 지정하여 유지할 주성분의 개수를 설정할 수 있습니다. 예를 들어, n_components=2는 주성분을 2개로 제한합니다.

copy: 원본 데이터를 변경하지 않고 PCA를 적용할지 여부를 나타내는 부울 매개변수입니다. 기본값은 True이며, True로 설정하면 원본 데이터는 변경되지 않고 PCA가 적용됩니다.

whiten: 주성분을 정규화할지 여부를 나타내는 부울 매개변수입니다. 기본값은 False이며, True로 설정하면 주성분이 서로 상관 없도록 정규화됩니다.

svd_solver: PCA에 사용할 특이값 분해(Singular Value Decomposition, SVD) 알고리즘을 선택하는 문자열 매개변수입니다. 가능한 값으로는 'auto', 'full', 'arpack', 'randomized' 등이 있습니다. 기본값은 'auto'로, scikit-learn이 자동으로 알고리즘을 선택합니다.

tol: 종료 기준으로 사용할 수치 정확도를 지정하는 부동 소수점 매개변수입니다. 기본값은 0.0입니다.

iterated_power: SVD 알고리즘에서 반복할 횟수를 나타내는 정수 또는 문자열 매개변수입니다. 기본값은 'auto'로, scikit-learn이 알고리즘에 따라 적절한 값을 선택합니다.

random_state: 무작위성이 포함된 알고리즘(예: 'randomized' SVD)을 사용할 때 재현 가능한 결과를 얻기 위해 사용되는 난수 시드입니다. 기본값은 None으로, 시드를 지정하지 않습니다.

PCA 객체를 생성한 후, .fit() 메서드를 사용하여 PCA를 실제 데이터에 적합시키고, .transform() 메서드를 사용하여 데이터를 주성분으로 변환할 수 있습니다. PCA 객체는 주성분, 주성분의 설명된 분산 비율 등의 정보를 포함하고 있습니다.

예제

PCA를 scikit-learn을 사용하여 적용하는 간단한 예제를 제공하겠습니다. 이 예제에서는 scikit-learn의 내장 데이터셋 중 하나인 Iris 데이터셋을 사용하여 PCA를 적용합니다. Iris 데이터셋은 꽃의 종류를 분류하는 문제에 사용되는 데이터셋으로, 다차원 데이터를 시각화하기 위해 PCA를 사용할 수 있습니다.

먼저, 필요한 라이브러리를 가져옵니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
# 다음으로, Iris 데이터셋을 로드합니다:

# Iris 데이터셋 로드
iris = datasets.load_iris()
X = iris.data  # 특성 데이터
y = iris.target  # 타겟 (꽃의 종류)

# PCA 객체를 생성하고, 주성분을 계산합니다. 이 예제에서는 주성분을 2개로 설정합니다.
# PCA 객체 생성
pca = PCA(n_components=2)

# 주성분 계산
X_pca = pca.fit_transform(X)


PCA를 적용한 후, 주성분을 사용하여 데이터를 2차원으로 변환한 결과를 시각화할 수 있습니다.

# 시각화
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k')
plt.xlabel('첫 번째 주성분')
plt.ylabel('두 번째 주성분')
plt.title('Iris 데이터셋의 PCA 시각화')
plt.colorbar(label='꽃의 종류', ticks=np.arange(3))
plt.show()

이 코드는 Iris 데이터셋을 PCA를 사용하여 2차원으로 축소하고, 주성분을 시각화하는 간단한 예제입니다. 결과적으로 꽃의 종류에 따라 데이터가 어떻게 분포되는지 시각적으로 확인할 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

KFold  (0) 2023.09.21
Recursive Feature Elimination (RFE)  (0) 2023.09.12
[NumPy] bincount  (0) 2023.09.08
[NumPy] where  (0) 2023.09.08
Density clustering  (0) 2023.09.08