-
PCA (Principal Component Analysis; 주성분 분석)Learn/머신러닝 2023. 2. 6. 21:31
# 차원 축소
고차원 데이터란 변수의 수가 많은 것을 뜻한다.
이럴 경우 나타날 수 있는 문제는 아래와 같다.
- 불필요한 변수가 많다.
- 시각화가 어렵다.
- 모델링이 비효율적이다.
차원을 줄이는 방법은 두 가지가 있다.
- 변수 선택(selection) : 분석 목적에 부합하는 소수의 예측 변수만을 선택
- 장점 : 선택한 변수 해석 용이 (기존에 있는 변수를 사용하므로)
- 단점 : 변수간 상관관계 고려가 어려움
- 변수 추출(extraction) : 예측 변수의 변환을 통해 새로운 변수 추출
- 장점 : 변수간 상관관계를 고려함. 일반적으로 변수의 개수를 많이 줄일 수 있음
- 단점 : 추출된 변수는 해석이 어려움. (기존의 변수를 결합해서 새롭게 만든 것이므로)
supervised / unsupervised learning 각각 selection / extraction 방법이 존재한다.
- Supervised learning - y를 이용해서 변수를 선택/추출 한다.
- selection : Information gain, Stepwise regression, LASSO, Genetic algorithm 등 (많음)
- extraction : Partial Least Squares (PLS)
- Unsupervised - y없이 변수 선택/추출
- selection : PCA loading (이 분야는 많이 연구되진 않음)
- extraction : Principal component analysis(PCA), Wevelets transforms, Autoencoder
# PCA 개요
PCA란 무엇인가 정리해보면 다음과 같다.
- 고차원 데이터를 분석하기 위한 대표적인 분석 기법
- n by p (관측치 by 변수)로 구성된 데이터를 상관관계가 없는 n by k로 요약하는 방식
- 요약된 변수는 기존 변수의 선형 결합으로 생성됨 (더하기, 빼기로만 결합시킨 것)
- 원래 데이터의 분산을 최대한 보존하는 새로운 축을 찾고 그 축에 데이터를 사영(Projection) 시키는 방법
주요 목적은 데이터 차원 축소, 시각화 및 해석이다.
일반적으로 PCA는 전체 분석 과정 중 초기에 사용된다.
# 기본 용어
용어는 아래와 같다.

각각의 Z는 모든 X를 선형결합해서 만들어진다.

사영의 경우 여러 방향이 있을 수 있다.
오른쪽이 정보 손실이 더 적으므로 선호되는 기저(basis)이다.

# 수리적 배경
본격적으로 PCA 알고리즘을 살펴보기 전에 몇 가지 용어를 더 봐야한다.
일단 데이터는 아래와 같이 표현한다.

그리고 데이터에 대한 세 가지 행렬이 존재한다.
왼쪽부터 Mean vector / Covariance matrix / Correlation matrix

## 공분산
공분산은 아래와 같이 구한다.

공분산행렬의 특징은 대각 성분은 각 변수의 분산과 같고 비대각 행렬은 두 변수의 공분산과 같다.

## 사영 (Projection)
사영의 개념은 위에서 봤는데 수학적으로 표현아면 아래와 같다.
방향은 같게 되며 크기는 수직인 지점까지가 되는 벡터를 찾는 것이다.

## 고유값(eigenvalue)와 고유벡터(eigenvector)
어떤 행렬 A에 대해 상수 λ와 벡터 x가 아래를 만족할 때
행렬 A에 대해 λ를 고유값(eigenvalue), x를 고유벡터(eigenvector)라고 한다.

이것이 무슨 의미를 갖는지 생각해보자.
벡터에 행렬을 곱했다는건 해당 백터를 선형변환(linear transformation)한다는 의미이다.
보통은 벡터의 방향이 바뀌기 마련이나,
고유벡터는 아래 그림처럼 기존의 방향에 영향을 주지 않는다.

# PCA 알고리즘
## 가정
- 데이터는 센터링 되었다고 가정한다. (각 변수에 대한 X값의 평균이 0)
- X는 p차원이며 공분산행렬 Σ를 가진다.
- α는 선형결합을 위한 계수(Loading)인데 길이는 1이라고 가정한다.
- 우리가 찾고자 하는 주성분 Z는 X의 선형결합 형태이다.
이런 가정하에 Z의 분산을 최대화하는 α를 찾아야 한다.
## 주성분 추출
수식으로 표현하면 아래와 같다.

위 식에서 α tanspose가 분산 밖으로 나오면서 뒤에 α가 곱해진다.
이것은 V(2X)=4V(X)와 같이 제곱되는 것이라고 생각해면 된다.
모든 행렬은 고유값과 고유벡터를 가지고 있으므로 아래와 같이 표현할 수도 있다.

E는 Eigenvector이고 Λ는 lambda의 대문자로 Eigenvalue를 담고 있는 행렬을 뜻한다.
참고로 Λ는 대각행렬이다.

위와 같이 Eigenvector과 Eigenvalue로 분해하는 방법을 spectral decomposition이라 하는데 이번 범위가 아니니 생략한다.
위 목적식은 아래와 같이 한번 더 치환이 가능하다.

이 식을 전개하면 아래와 같이 된다.

λ는 Σ의 Eigenvalue임을 잊지 말자.
위의 식을 어렵게 풀지 않아도 β1과 λ1이 1이고 나머지가 0일때 최대임을 짐작할 수 있다.
그러면 α는 가장 큰 Eigenvalue에 해당하는 Eigenvector가 된다. (e1)
# 예제
아래와 같이 x가 주어지며 일단 센터링 작업을 해야 한다.

데이터가 3개이므로 3x3의 correlation matrix가 나온다.
그리고 그에 해당하는 각각의 Eigenvalue, Eigenvector를 구할 수 있다.

첫 번째로 큰 Eigenvalue에 대한 Eigenvector로 x값들을 선형 결합하면 첫 번째 주성분을 찾을 수 있다.

주성분들에 대한 공분산을 구해보면 아래와 같이 나오는데,
각 주성분 Z는 서로 독립임을 알 수 있다.

# 주성분 갯수 결정하기
공분산행렬의 Eigenvalue는 정보량을 뜻한다.
즉, 전체 Eigenvalue의 합 대비 Eigenvalue의 비율을 계산하면 해당 주성분이 원 데이터를 얼마나 설명할 수 있는지 알 수 있다.
위 예제의 첫 번째 주성분은 92%를 설명할 수 있다.

갯수를 선택하는 방법은 크게 두 가지가 있을 수 있다.
① 각 주성분에 대한 비율ㅇ을 그래프로 그려서 Elbow point에 해당하는 주성분 수를 선택한다.

② 일정 수준 이상의 분산비를 보존하는 최소의 주성분을 선택한다. (보통 70% 이상)
# PCA Loading Plot
위에서 α를 Loading이라고도 부른다고 정리했었다.
이를 그래프로 표현하면 실제 변수가 주성분 결정에 얼마나 큰 영향을 미쳤는지 알 수 있다.
첫 번째, 두 번째 주성분에 대한 α를 각 축으로 그리면 아래와 같이 표현할 수 있다.

X1는 두 주성분 모두에 큰 영향을 미쳤으므로 중요한 변수일 가능성이 높다.
X2가 증가하면 Z1은 증가하지만 Z2는 감소한다.
X3가 감소하면 Z1은 감소하지만 Z2에는 큰 영향을 주지 못한다.
# 요약
PCA 과정을 요약해보면 아래와 같다.
를 사용하는것이 좋다는 것을 기억하자.
(보통 라이브러리에서 옵션으로 선택 가능)
Step 1. 데이터 정규화 (mean centering)
Step 2. 기존 변수의 covariance (correlation) matrix 계산
- mean centering을 하지 않는다면 correlation matrix
Step 3. Covariance (correlation) matrix로부터 Eigenvalue 및 이에 해당하는 Eigenvector를 계산
Step 4. Eigenvalue 및 해당되는 Eigenvector를 순서대로 나열

Step 5. 정렬된 Eigenvector를 토대로 기존 변수 변환

# PCA의 한계
1. 데이터 분포가 가우시안이 아니거나 다중 가우시안이면 적용이 어렵다.
- 단일 가우시안 분포를 따르는 데이터여야 서로 독립적인 축을 찾을 수 있다.
- 대안으로 커널 PCA나 LLE(Locally Linear Embedding)을 사용할 수 있다.
2. 데이터의 Y값을 고려하는 추출법은 아니므로 분류/예측이 더 잘되도록 변환해주는건 아니다.
- 단지 분산이 최대화되는 방향으로 추출했을 뿐이다.
참고: 김성범 교수님 유튜브
'Learn > 머신러닝' 카테고리의 다른 글
Soft Margin SVM, Nonlinear SVM, Kernel (2) 2022.12.02 SVM (Support Vector Machine) (0) 2022.11.30 랜덤포레스트 (Random Forest) (3) 2022.11.20 Decision tree (0) 2022.11.18 K-Nearest Neighbor (KNN) (0) 2022.11.13