Home 개굴캐글개굴 주성분 분석(PCA)
Post
Cancel

개굴캐글개굴 주성분 분석(PCA)

Tab study에서 공부한 주성분 분석에 대해서 정리해보려 한다.

주성분 분석 (PCA)

PCA는 대표적인 차원 축소 알고리즘이다. 차원 축소를 통해 데이터를 가장 잘 나타내는 일부 특성을 선택하여 데이터 크기를 줄이고 지도학습 모델의 성능을 향상시킬 수 있다.

PCA는 데이터에 있는 분산이 큰 방향을 찾는 것으로 이해할 수 있다. 위의 사진에서 분산이 큰 방향을 선택하여 선을 그려보면

위의 사진처럼 길게 늘어진 대각선 방향이 분산이 가장 크다고 알 수 있다. 화살표의 위치는 큰 의미가 없다. 중요한 것은 분산이 큰 방향을 찾는 것이다.

예를 들어, (2,1)의 벡터를 보자. 이 벡터를 주성분이라 부르는데, 원본 데이터에 있는 어떤 방향을 나타낸다.

  • 주성분은 원본 차원과 같고 주성분으로 바꾼 데이터는 차원이 줄어든다.

PCA를 코드로 이해해보기

데이터 셋 준비

1
2
3
4
!wget https://bit.ly/fruits_300_data -O fruits_300.npy
import numpy as np
fruits = np.load('fruits_300.npy')
fruits_2d = fruits.reshape(-1, 100*100)

pca클래스 사용하기

1
2
3
from sklearn.decomposition import PCA
pca = PCA(n_components=50)
pca.fit(fruits_2d)

PCA클래스를 만들 때 n_componentes 매개변수에 주성분의 개수를 지정해야 한다. 이 PCA는 비지도 학습이기 때문에 fit()메서드에 타겟값을 제공하지 않는다.


1
print(fruits_2d.shape)
1
(300, 10000)
1
2
fruits_pca = pca.transform(fruits_2d)
print(fruits_pca.shape)
1
(300, 50)

위의 코드 결과를 보면 10000개의 픽셀(특성)을 가진 300개의 이미지가 50개의 주성분을 찾은 PCA모델을 사용해 (300,50)크기의 배열로 변환한 것을 볼 수 있다. PCA를 통해 데이터의 차원을 줄이는 것을 확인해 볼 수 있다.

원본 데이터로 복구하기

1
2
fruits_inverse = pca.inverse_transform(fruits_pca)
print(fruits_inverse.shape)
1
(300, 10000)

데이터를 차원 축소를 하면 어쩔 수 없이 데이터 손실이 발생할 수 밖에 없다. 하지만 최대한 분산이 큰 방향으로 데이터를 투영했기 때문에 원본 데이터를 상당 부분 재구성할 수 있다. PCA 클래스에서 inverse_transform() 메서드를 통해 위의 코드처럼 원본 데이터로 복원을 할 수 있다.

Explained variance구하기

주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지 기록한 값을 Explained variance이라고 한다. PCA 클래스의 Explained_variance_ratio를 통해 분산 비율을 확인해보자.

1
print(np.sum(pca.explained_variance_ratio_))
1
0.921517484011715

약 92%가 넘는 분산을 유지하고 있는 것을 확인할 수 있다.

1
2
plt.plot(pca.explained_variance_ratio_)
plt.show()

위의 그래프를 보면 처음 10개의 주성분이 대부분의 분산을 표현하고 있다는 것을 확인할 수 있다.

느낀점

PCA 즉 주성분 분석을 통해 일부 특성을 선택하여 데이터 크기를 줄이고 지도학습 모델의 성능을 향상시킬 수 있는 것에 신기함을 느꼈고, 불필요한 특성을 제거하는 것이 더 도움이 되는 것이구나라고 알게되었다.

This post is licensed under CC BY 4.0 by the author.