[PCA (Pricipal Component Analysis, 주성분 분석)]
여러 차원으로 이루어진 '데이터를 가장 잘 표현하는 축'으로 사영(Projection)해서 차원을 축소
각 변수들의 공분산에 대한 주 성분(PC, Principal Component) 혹은 고유 벡터(Eigenvector) 중
가장 고유 값이 높은 주 성분(PC)에 데이터들을 사영(프로젝션, Projection) 한 것
[PC (Pricipal Component, 주성분)]
위에 있는 '데이터를 가장 잘 표현하는 축'은 데이터의 분산을 가장 잘 표현하는 축으로서
데이터 셋을 특이값 분해를 통해 추출된 고유 벡터(Eigenvector).
각 고유 벡터들은 서로 직교성을 띄기에 서로 독립적으로 데이터를 잘 표현 가능
데이터 불러오기
2차원 그려보기
임의로 2개의 컬럼을 이용해 산점도를 그려보았다.
문제 없이 그릴 수 있다.
3차원 그려보기
컬럼 3개를 이용해서 3차원까지 그릴 수 있다.
그러나, 컬럼 4개 이상을 이용해서 4차원 이상을 그리는 것은 가능할 수는 있겠지만
인간이 보고, 이해할 수 있는 영역을 넘어선다.
이때 이용하는 것이 차원 축소를 통한 주성분 분석이다.
[PCA를 하는 이유]
1. 차원을 3차원 이하로 축소해 시각화
2. 정보를 적은 차원에 저장함으로써 메모리 절약
3. 이미지의 잡음 제거
4. 필요없는 변수 제거, 과적합 방지
(차원 축소를 통해 모델의 학습을 용이하게 함)
등이 있다.
각 컬럼 정규화 - StandardScaling
feature와 label 정의
(1) PCA 불러온 뒤 정의
sklearn.decomposition 패키지의 PCA를 불러온 뒤
pca 변수명으로 정의한다.
n_components에 정수 1을 입력하면 주성분의 개수도 1로 정해진다.
(2) 주성분 찾기
(3) 주성분으로 데이터 사영(projection)
5차원의 데이터를 주성분으로 사영해서 1차원으로 만들어줬다.
(4) 결과 확인 및 시각화
리턴받은 데이터는 PC1 컬럼에 있고
시각화를 위한 y-axis 컬럼을 추가해줬다.
1. 한개의 차원으로도 3개의 클래스로 분류가 가능해보인다.
2. 5개의 컬럼(calory breakfast lunch dinner exercise) 중 어떤 컬럼이
Label 컬럼과 상관 관계가 있는지는 정확히 알 수 없다.
다만, 뽑혀진 주성분으로 표현된 데이터가 Label 컬럼과 높은 상관성을 가지는 것으로 보인다.
해당 주 성분의 고유값 (Eigenvalue, 분산값)
위 예시를 2차원으로 PCA 해보자
PC1과 PC2를 축으로 그려낸 결과이다.
1. 여전히 분류하기 용이하다.
2. 분류하기 용이해보이니, 차원 축소를 하지 않아도 모델의 성능이 좋을 수 있다.
3. 운이 좋게 쉬운 데이터셋이 주어져, 원본 데이터를 잘 반영하지 못했을 수도 있다.
variance_ratio
데이터의 분산을 나타내는 비율
PC1 축이 데이터의 분산을 약 73% 설명하며, PC2는 약 15%만 설명한다.
즉, PC1과 PC2로 이루어진 축은 전체(원본) 데이터를 약 88% 설명한다고 볼 수 있다.
variance
PC1의 분산값(고유값)은 약 4.06이며 PC2는 약 0.83의 값을 보인다.
분산값이 클수록 데이터의 분포를 더 잘 나타낸 축이라고 할 수 있다.
즉, PC1 축의 중요성이 더 높은 것이다.
각각의 축은 중요한 순서대로 설정된다.
위 그림처럼 각 cluster간의 차이가 비슷하다면
PC1 축에 있는 두 cluster의 차이가 더 극명하다는 것을 의미한다.
* 일반적으론 분산의 80%를 설명하는 주성분의 개수를 표현하도록 한다.
분산의 비율을 합하니 약 88.3%로,
80%보다는 더 설명하는 주성분으로 차원이 축소되었다.
** 또 다른 방법으론 기존 컬럼 개수의 0.8배를 한 차원으로 축소할 수 있다.
(컬럼) 5개 * 0.8 = 컬럼 4개
4차원으로 축소될 것이다.
이렇게 4차원으로 축소된 데이터는 전체 데이터의 약 98.6%를 설명한다.
참조
https://github.com/minsuk-heo/python_tutorial/blob/master/data_science/pca/PCA.ipynb
https://www.youtube.com/watch?v=FgakZw6K1QQ
https://www.youtube.com/watch?v=HMOI_lkzW08
https://www.youtube.com/watch?v=jNwf-JUGWgg
'Machine Learning > 전처리(Preprocessing)' 카테고리의 다른 글
Machine Learning - train_test_split (0) | 2020.09.08 |
---|---|
Machine Learning - 랜덤으로 train과 test로 나누기 (0) | 2020.09.04 |
Machine Learning - One-Hot Encoding (원핫 인코딩) (0) | 2020.08.26 |
Machine Learning - Label Encoding (라벨 인코딩) (0) | 2020.08.26 |
Machine Learning - Scaling : Standard Scaling (Z-score) (0) | 2020.08.26 |