본문 바로가기

파이썬/머신러닝

차원 축소 PCA(주성분 분석) 기본 개념 - 투영과 매니폴드 학습

먼저 읽어보면 좋은 글

▼▼▼▼▼▼▼▼

차원의 저주 개념

 

 

지난번 포스팅에서는 차원의 저주에 대해 알아봤고 이번에는 차원의 저주를 해결하는 방법인 차원 축소에 대해 알아보자. PCA 알고리즘을 공부하기 전에 차원 축소 접근법인 투영과 매니폴드 학습법부터 먼저 짚고 넘어가자.

 

 

투영

출처: 핸즈온머신러닝

 

투영은 고차원 공간에 있는 훈련 샘플을 저차원 공간에 그대로 수직으로 옮기는 것이다. 위의 예시에서 보듯 3차원 데이터를 2차원에 투영해도 데이터 특성이 크게 뭉개지지 않고 거의 그대로 보존된다.

 

 

다만 항상 투영법이 통하는 것은 아니다.

 

 

출처: 핸즈온머신러닝

 

이렇게 스위스롤처럼 데이터가 말려있는 경우라면 X3을 버리고 그냥 평면에 투영시켜버리면 아래처럼 데이터가 뭉개져버린다.

 

출처: 핸즈온머신러닝

왼쪽이 그냥 투영시켰을 때의 모습이다. 데이터가 구분되지 않고 완전히 뭉개져버렸다. 우리가 실제로 얻고 싶은건 우측의 예쁘게 구분된 데이터이다. 이렇게 고차원 공간에서 휘어지거나 뒤틀린 2D 모양의 데이터셋을 매니폴드라고 하며 이를 차원축소 하는 방법을 매니폴드 학습이라고 한다.

 

 

매니폴드 학습

 

매니폴드 학습은 비선형 차원축소법으로 위의 스위스롤처럼 고차원의 꼬여있는 데이터 분포에서 매니폴드를 모델링하는 것이다. 기본적으로 저차원의 매니폴드 공간에 표현되면 더 간단해질 것이라는 암묵적인 가정이 있지만 이 가정이 항상 들어맞는 것은 아니다.

 

 

출처: 핸즈온머신러닝

 

위와 같은 경우의 데이터셋에서는 3차원 공간에서 결정경계를 나누기 쉽지 않다. 하지만 2차원의 펼쳐진 매니폴드 공간에서는 결정경계가 아주 명확하고 단순한 직선이다.

 

 

출처: 핸즈온머신러닝

 

이 경우에는 다르다. 좌측의 3차원 매니폴드 공간에서 결정경계가 X1=5로 꽤나 명확하다. 하지만 이를 2차원의 매니폴드 공간에 펼쳐보면 결정경계를 나누기 어렵다. 즉, 훈련 세트의 차원을 축소한다고 해서 항상 더 좋아지거나 간단해지는 것은 아니다. 전적으로 원본 데이터셋의 모양에 따라 다르기 때문에 차원축소가 항상 옳다고 할 수는 없다.

 

 

PCA(주성분분석)

 

PCA는 Principa Component Analysis(주성분 분석)의 줄임말로 가장 인기 있는 차원축소 알고리즘이다. 데이터에 가장 가까운 초평면을 정의하고 데이터를 그 평면에 투영하는 방법이다. 훈련세트를 초평면에 투영하려면 일단 올바른 초평면을 선택하는 것이 우선이다.

 

좌측은 간단한 2차원 데이터셋이고 위에 3개의 축이 표시되어 있다. 우측은 각 축이 1차원에 투영된 결과이다. 가장 위의 실선이 분산을 최대로 보존하고 있고 맨 마지막의 점선은 분산을 가장 적게 보존하고 있다. 당연히 분산이 최대로 보존되는 축을 선택하는 것이 정보 손실이 가장 적으므로 합리적인 선택이다. 다른말로 하면 원본데이터셋과 투영된 데이터 셋 사이의 평균제곱거리를 최소화하는 축을 선택하는 것이 PCA 기법이다.

 

▼▼▼▼▼▼▼▼▼▼

분산, 편향 개념과 MSE

 

 

PCA의 주성분 개념

 

PCA 알고리즘을 작동법을 정리하자면 아래와 같다.

*국부적으로 d차원 초평면으로 보일 수 있는 n차원 공간의 일부인 d차원 매니폴드 (d<n)

 

1. 훈련 세트에서 분산이 최대인 축 찾기

2. 1번 축에 직교하면서 남은 분산을 최대한 보존하는 두번째 축 찾기

3. 2번 축에 직교하면서 남은 분산을 최대한 보존하는 세번째 축 찾기

4. 위의 단계를 반복하면서 데이터셋에 있는 차원의 수만큼 n번째 축 찾기

5. 주성분을 모두 추출한 후 처음 d개의 주성분으로 정의한 초평면에 투영해 데이터셋을 d차원으로 축소

 

 

 

이 때 i번째 축을 이 데이터의 i번째 주성분(PC)라고 부른다. 위의 이차원 데이터셋에서는 c1이 첫번째 PC, c2가 두번째 PC이다. 주성분은 SVD(특잇값 분해)라는 표준 행렬 분해 기술로 찾을 수 있다. 넘파이의 svd()함수를 사용해 직접 구현할 수도 있고 사이킷런의 PCA 모델을 이용하면 된다.