함께하는 데이터 분석

[Scikit Learn] PCA 본문

데이터분석 공부/ML | DL

[Scikit Learn] PCA

JEONGHEON 2022. 8. 28. 20:06

주성분 분석(Principal Component Analysis)

  • 차원을 축소하는 알고리즘 중 가장 인기 있는 알고리즘

 

사이킷런

import numpy as np

np.random.seed(4)
m = 60
w1, w2 = 0.1, 0.3
noise = 0.1

angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5
X = np.empty((m, 3))
X[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2
X[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2
X[:, 2] = X[:, 0] * w1 + X[:, 1] * w2 + noise * np.random.randn(m)

차원을 축소시킬 3D 데이터 셋인 X를 생성

 

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X2D = pca.fit_transform(X)

사이킷런의 PCA 모델을 사용하면 SVD 분해 방법을 사용하여 구현됨

 

PCA 모델을 사용하여 데이터셋의 차원을 2로 줄이는 코드

 

이때 센터링(변량 - 평균)은 자동으로 진행되고 훨씬 간편

 

 

주성분 참조

pca.components_

>>> array([[-0.93636116, -0.29854881, -0.18465208],
           [ 0.34027485, -0.90119108, -0.2684542 ]])

components_를 활용하여 주성분을 확인 가능

 

pca.components_[:, 0]

>>> array([-0.93636116,  0.34027485])

첫 번째 주성분을 나타냄

 

 

설명된 분산의 비율

pca.explained_variance_ratio_

>>> array([0.84248607, 0.14631839])

explained_variance_ratio_ 변수에 주성분의 설명된 분산의 비율이 저장됨

 

위의 세 개의 주성분 중 처음 주성분에 대한 설명된 분산의 비율은 84.2%

 

두 번째 주성분에 대한 설명된 분산의 비율은 14.6%

 

1 - pca.explained_variance_ratio_.sum()

>>> 0.011195535570688975

세 번째 주성분에 대한 설명된 분산은 1.1% 정도로 아주 적은 양의 정보가 들어있음

 

따라서 3차원의 데이터 셋을 2차원으로 축소해도 기존 3차원 데이터 셋의 98%가 넘는 정보를 설명을 할 수 있음

 

그렇다면 축소할 차원의 수를 어떻게 선택할까?

 

 

적절한 차원 수 선택하기

보통 축소할 차원의 수를 임의로 정하기보다는 충분한 분산이 될 때까지 더해야 할 차원의 수를 선택

pca = PCA()
pca.fit(X)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
print(d)

>>> 2

위의 코드는 차원을 축소하지 않고 PCA를 계산한 뒤 분산을 95%로 유지하는 데 필요한 최소한의 차원 수를 계산한 것

 

cumsum에 설명된 분산의 누적합을 할당하고 python의 특성으로 인해 +1을 해준 것

 

위에서 확인한 것을 다시보면 첫 번째 주성분으로 84%가량의 정보를 설명할 수 있고

 

첫 번째와 두 번째 주성분을 합쳐 98%가량 설명하므로

 

필요한 최소의 차원의 수는 95%를 기준으로 하면 2인 것을 확인할 수 있음

 

pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)
print(pca.n_components_)

>>> 2

또 다른 방법은 이렇게 n_components를 0 ~ 1 사이로 설정하여 훈련시킨 다음

 

n_components_를 이용하여 구하는 것이 훨씬 쉽고 간단함


https://www.hanbit.co.kr/store/books/look.php?p_code=B9267655530 

 

핸즈온 머신러닝

최근의 눈부신 혁신들로 딥러닝은 머신러닝 분야 전체를 뒤흔들고 있습니다. 이제 이 기술을 거의 모르는 프로그래머도 데이터로부터 학습하는 프로그램을 어렵지 않게 작성할 수 있습니다. 이

www.hanbit.co.kr