PCA (Principal Component Analysis)

2018. 7. 18. 03:17Machine Learning/Basic

PCA (Principal Component Analysis)






PCA는 데이터 분석을 위한 전처리 과정에서 차원을 축소(dimension reduction)하기 위해 사용되는 기법입니다. 상관관계가 있는 변수끼리 가중선형결합(weighted linear combination)해서 변수를 축소시킵니다. 데이터를 시각화 할 때 3차원까지는 그렇다 쳐도 4차원을 넘어가는 순간 곤란해지곤 하는데, PCA를 통해 2차원으로 축소시키면 평면상에 나이스하게 그래프를 그려낼 수 있죠PCA 적용하면 noisy한 차원을 제거해주고, 밀접하게 연관된 차원끼리 합쳐주기 때문에 noise를 감소시켜 줍니다. 또한 데이터를 적은 공간에 저장함으로써 메모리 사용량을 줄여주고, 용량이 적어지면 퍼포먼스가 좋아지는 것은 당연하겠죠? (차원이 너무 크면 표현해야 하는 데이터의 양이 기하급수적으로 늘어나는데 우리는 그것을 '차원의 저주(Curse of dimensinality)'라고 합니다.) 오늘은 PCA 실습을 해보도록 하겠습니다. 데이터는 iris 데이터를 사용합니다.



우선 필요한 패키지들을 import 해줍니다.



다음은 데이터를 불러옵니다. 우리의 target은 위에 보이는 target column이 되겠네요. dimension reduction을 하기 전 현재 feature는 4차원입니다. 그런데 문제가 생겼습니다. feature가 될 컬럼들의 value가 굉장히 뒤죽박죽이네요. 스케일링이 필요해 보입니다.



우선 features, 즉 우리가 dimension reduction 해 줄 features를 변수로 선언합니다. target을 제외한 나머지 컬럼들이 features입니다. 그 다음 모델링을 위한 독립변수와 종속변수를 선언해줍니다. 스케일링은 sklearn에서 제공해주는 StandardScaler를 사용했습니다. StandardScaler로 x를 스케일링해주고, 다시 x로 대입해주면 features 스케일링이 완료됩니다. 참 쉽죵? :) 확인하기 위해 데이터프레임을 불러왔는데, 역시나 스케일링이 잘 되었네요. 스케일링의 목적은 values의 범위를 맞춰주기 위함이라고 보시면 됩니다.


자, 이제 본격적인 PCA에 들어가게 됩니다. 우선 PCA를 이해하기 위해서 공분산행렬(Covariance Matrix)과 고유벡터(Eigen vector), 고유값(Eigen value)를 이해하셔야 되는데요! 우리는 numpy에서 제공하는 공분산행렬, 고유벡터, 고유값 함수를 이용할겁니다. 



앞서 스케일링 한 features들(x)를 Transformation해줍니다. 그런 다음 numpy에서 제공하는 cov() 함수를 사용하면? 짜잔, 공분산 행렬이 예쁘게 그려집니다. 너무 친절하죠? 이제 이 공분산행렬로부터 고유벡터, 고유값을 추출한 뒤 제 1 주성분을 만날거예요.



넘파이를 사용해서 고유값과 고유벡터를 뽑아냈습니다. 가장 큰 고유값을 보이는 노오란 녀석이 우리의 PC1, 즉 제1 주성분이 됩니다. 고유값이 높을수록 분산이 크다고 보시면 됩니다. 앞서 설명 드렸듯이, PC2는 PC1과 직교를 이루는 축( = PC1으로 생성 될 수 없는 축) 중에서 가장 큰 분산을 가진 축으로 선택됩니다.



자, 이제 우리는 몇차원으로 축소할지 정해야됩니다. 이번 실습에서는 2차원으로 dimension reduction을 진행할거예요. pca를 선언해주고, 모델링과 transformation을 동시에 해주는 fit_transform을 적용합니다. 여기까지 하면 우리는 2개의 PC로 차원이 축소된 새로운 데이터를 얻게되죠. 결과물을 데이터프레임으로 불러와서 확인해보니 지금까지 잘 해온 것 같습니다 ㅎㅎ 덧붙이자면, PCA로 줄이게 되는 차원과 PC의 갯수는 비례합니다. 다시 말해 2차원으로 줄이면 2개의 Principal Component가 필요하고, 3차원으로 줄이면 3개의 Principal Component가 필요하고, 이런 식이죠.



지금까지 열심히 스케일링하고, 차원축소한 결과물에 target을 붙여주면 전처리가 완성됩니다.



matplotlib을 이용해서 결과물을 시각화 한 그래프입니다. PC1이 x-axis로 들어가고 PC2가 y-axis로 예쁘게 잘 들어갔네요^^ 결국 우리는 PCA를 통해 4차원 데이터를 2차원으로 만들어 시각화까지 해버렸어요. 멋지죠?




마지막으로 우리의 PCA모델이 유의미한지 물어봅시다. explained_variance_ratio_ 에게 물어보니 PC1은 이 데이터를 72%정도 설명할 수 있다고 하고, PC2는 23%정도 설명할 수 있다고 하네요. 보통 이 둘의 합이 80%가 넘으면 유의미하다고 판단합니다.



오늘은 최대한 이해가 쉽게 포스팅해봤습니다. 수학적인 내용은 아예 빼버렸어요. 저도 이해하기 어려운 부분이라 공부가 좀 더 필요한 것 같아서요ㅎㅎ PCA를 처음 배울 때는 굉장히 힘들었던 기억이 있는데 공부를 통해 이렇게 포스팅을 하게 되어서 기쁘네요 :) 한분이라도 제 포스팅이 도움이 되셨길 바라며 이만 줄이겠습니다. 감사합니다!


그림출처: https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues

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

SVM (Support Vector Machine)_개념편  (0) 2018.07.20