본문 바로가기

ML & DM/Dimension Reduction

Dimension Reduction

아래 설명은 http://deepcumen.com/2015/04/dimension-reduction/ 과 http://darkpgmr.tistory.com/110의 설명을 정리해본것이다.

수학적 설명은 최대한 배제하여 직관적이고 개괄적인 부분만 설명을 했으므로 PCA와 LDA가 뭔지에 대해서 개념을 잡는데 초점을 맞추었다.


1. 벡터화에 대한 간단한 언급


일단 설명을 위해 먼저 벡터화에 대해서 설명을 간략하게 하겠다.




위 사진을 보면 28*28 픽셀의 이미지가 있다. 이 이미지 파일 안에 있는 총 픽셀수는 28*28=784개의 픽셀수가 있고, 픽셀하나를 하나의 차원으로 놓고 각 차원은 하나의 Feature가 된다. 이 Feature안에서 값들은 RGB(0~225)가 될 것이다. 따라서 하나의 벡터요소는 해당 차원(픽셀)의 색이 된다. 이처럼 모든 이미지는 이미지의 전체 픽셀의 수만큼 차원을 가진 벡터 값으로 치환이 가능하므로 하나의 이미지를 수치화시켰다.


여담으로 이렇게 비정형데이터(이미지, 음성)를 정형데이터를 만드는 작업의 예가 될수도 있을 것 같다. 결국은 어떻게 비정형데이터를 컴퓨터가 읽어서 분석하고 학습하게 만드는(알고리즘에 대입)지에 대한 문제가 주된 이슈이기 때문에.


이번엔 벡터화의 과정을 텍스트 데이터에 대입해보자.

 

Data1: Hi, I am a good boy.

Data2: Hi, she is Julia.

Data3: Good morning! Hi everyone!

Data4: Hi, I am introducing you a good loan service!


위의 4개의 글 데이터에 대해서 스팸분류기를 만든다고 하면, 일단 사용된 모든 단어에 대한 하나의 벡터를 만들어야 한다. 내 기억으론 이런 중복되지 않은 단어목록을 자연어 처리쪽에서 Vocabulary라고 말했던 것 같다. 

 W = (Hi, I, am, good, boy, she, is, Julia, morning, everyone, introducing, you, loan, service)


이제 위의 벡터의 각각의 원소에 대해 모든 데이터에 대해 유무를 바이너리로 맵핑 할 수 있게 되었다.

어떻게? 위의 W벡터를 잘 보면 14개의 차원이 되고 각 차원의 원소는 위에서 한번씩은 나온 단어들(자연어처리부문에서는 Token이라고 한다.)의 종류(?)라고 보면 될 것같다. 우리는 이 W벡터를 기준으로 Data1, Data2, Data3, Data4를 W벡터에 맵핑을 시킨 것이다. 따라서 W벡터의 원소에 대해 Data1,2,3,4 의 유무를 바이너리로 매핑한다. 


Data1: (1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)    

Data2: (1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0)

Data3: (1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0)

Data4: (1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1)



이렇게 벡터화를 시켜 이제 정규화가 되었으므로 이제는 벡터의 계산만을 고려하면 된다.


2. 차원축소와 특성의 의미


각각의 원소는 해당 데이터의 어떠한 특성을 나타내게 된다. 글 데이터의 경우 벡터화를 하여 해당 원소에 해당되는 단어가 있는지 없는지라는 매우 명확한 특성을 갖는다. 하지만 글 데이터에 공통적인 요소 예를 들어 "Hi" 는 모든 데이터에 있으므로 이는 다른 데이터와 구분 짓는 특성이 될 수 없다. 마치 사람을 구분할 때 눈, 코, 입의 유무로 사람들을 구별할 수 없는것 처럼. 이렇게 특성이 될 수 없는 원소들을 제거해 나가는 과정이 '차원 축소'의 한 방법(뒤에서 자세히 설명)이다. 왜 차원 축소를 해야 하는가? 그 이유는 벡터의 차원을 축소해 연산과정을 가볍게 할수도 있고 노이즈를 제거해 성능을 향상시킬 수 있기 때문이다. 더 자세히 설명해 보자면, 높은 차원의 데이터에서 갖는 문제 때문에 차원축소가 필요한데 크게 3가지로 볼 수 있다.


1. 전통적인 거리계산(ex. 유클리디안거리,맨하튼거리, 민코우스키, 마할라노비스 등)이 벡터공간에서 차원이 많아 지면 쓸모가 없어진다. (나름 이해한대로 적어보자면 유클리디안 거리는 고차원 상에서의 데이터의 분포를 고려하지 않고 차원 마다의 중요도를 고려하지 않고 차원마다 중요도를 일정하게 하기 때문에 높은차원에서는 가까운 거리임에도 유클리디안 공간(2차원..?)에서는 먼거리가 된 문제가 있다.)

2. 모델에서 많은 파라미터가 생겨 더 많은 훈련 데이터가 필요해지고 그렇게 되면 더 많은 계산이 실행될 것이고 결국  더 많은 저장공간이 필요하게 된다.

3. 시각화를 하기가 어렵다. (4차원 이상하기가 힘듬)


기존 14차원의 공간에 있던 데이터들(위치, (1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)  )이 10차원의 공간으로 이동해야 한다는(맵핑한다는) 의미가 차원 축소이다. 차원을 축소하는 방법에는 크게 2가지로 나눌 수 있는데 


1. Feature Selection : 중요한 Feature들을 D개의 Feature에서 뽑아 L개의 Feature로 줄이고 (D-L)개의 Feature들은 버리는 방식 (Ex. Subset selection algorithms)

(참고 http://topepo.github.io/caret/preprocess.html)


2. Feature Extraction : 모든 D개의 Feature를 온전히 잘 설명하는 벡터들을 원래 벡터보다 훨씬 작고 더 잘 설명하는 L개의 Feature를 가진 벡터로 나타내는 방식 , 모든 피쳐를 사용해서 더 작은 벡터로 만드는데 중점이 있음. (Ex. Principal Component analysis(PCA))


 이제 어떻게 이 Feature Extraction을 하는 대표적 방법이 PCA와 LDA이다. (원문에서도 설명하듯 이것은 가장 기본적 2가지 방법이고 더 많은 방법이 있을것)


3. PCA의 직관적 설명


PCA란 분포된 데이터들의 주성분(Principal Component)를 찾아주는 방법이다.

2차원 좌표평면에 n개의 점 데이터(x1,y1), (x2,y2)......(xn,yn)들이 타원형으로 분포되어 있을 때



데이터들의 분포특성을 2개의 벡터로 가장 잘 설명할 수 있는 방법은 무엇일까? 그건 바로, 그림과 같이 e1, e2 두개의 벡터로 데이터 분포를 잘 설명하는 것이다. e1의 방향과 크기(벡터), 그리고 e2의 방향과 크기(벡터)를 알면 이 데이터 분포가 어떤 형태인지 가장 단순하면서도 효과적으로 파악 할 수 있다.


PCA는 데이터 하나하나에 대한 성분을 분석하는 것이 아니라, 여러 데이터들이 모여 하나의 분포를 이룰 때 이 분포의 주성분(가장 잘 나타내는 성분, 여기서는 e1 벡터)을 분석해 주는 방법이다. 여기서 주성분이라 함은 그 방향으로 가장 분산이 큰 벡터를 의미한다. 


정리하자면 주성분 분석은 데이터들이 분포에서 이 분포를 가장 잘 설명해주는 다시말해 분산이 가장 큰 벡터를 찾는 분석인 것이다.


위 그림에서는 e1에서 방향을 따라 데이터들의 분산이 가장 크다, e1에 수직이면서(수직이어야 하는 이유는 e1이 있는 차원에서는 e1의 분산이 가장 크기 때문에 다른 차원에서 분산이 가장 큰 벡터(주성분)을 찾아야 하므로 e1에 수직이어야 다른차원이 됨... 나중에 자세히 알아보고 설명 해보겠다.) 그 다음으로 데이터들의 분산이 가장 큰 방향을 e2이다. 

여기서 주성분이라 함은 그 방향으로 데이터들의 분산이 가장 큰 방향 벡터를 의미한다. 

우선 2차원 공간의 위치들을 1차원의 공간으로 매핑하는 법을 살펴보자.



2차원의 점들을 어떤선분(1차원)으로 사영시키는지 그 선분(벡터)을 찾는 기준에 따라 PCA(주성분분석)와 LDA(선형판별분석)으로 나뉜다.



위그림은 같은 데이터들에 대해 두 벡터로의 사영을 나타낸 것이다.

첫번째 사영벡터의 경우 변환후 데이터들이 크게 분산되있지만 두번째 그림의 벡터는 변환 후 데이터들이 밀집되어 있다. 따라서 PCA의 경우 변환후 데이터가 가장 잘 분산되도록 하는 벡터를 찾는 것이므로 첫번째가 PCA에 적합한 벡터이다.


4. LDA (linear discriminant analysis, 선형판별분석)

PCA의 문제가 '모든' 데이터들 사이의 거리를 최대화 하도록 변환한다는 것이다. 

보통 같은 클래스의 경우 데이터들이 벡터 공간에 서로 가깝게 분포할 것을 가정한다. 하지만 클래스 정보를 고려하지 않고 모든데이터 사이의 거리를 최대화 하기 때문에 차원 축소 과정에서 클래스 분포가 무시될 위험이 있다. LDA의 경우 판별 문제에 적합하게 차원 축소의 기준을 정한다. 클래스 구분이 라벨링 된 데이터에 대해서 PCA와 마찬가지로 차원 축소를 하되, 같은 클래스의 데이터에 대해서는 최대한 가깝게, 다른 클래스의 데이터에 대해서는 최대한 멀게 매핑을 한다비슷한 데이터끼리는 잘 모이게 하고, 그렇지 않은 데이터는 다르다고 분류한다는 점에서 어떻게 보면 클러스터링과 비슷한 맥락이다. 클러스터링에 대한 설명은 나중에 더 자세히 하겠다. LDA는 이렇게 클래스 내의 거리는 최소화 하고 클래스간의 거리는 최대화 함으로써 판별의 성능을 높일 수 있다는 장점이 있다. 



예제를 보면  O와 X라는 두 클래스가 존재하고 이를 잘 구분하는 사영벡터를 찾는다고 해보자. 

PCA의 경우 클래스 정보에 상관없이 모든 데이터에 대해서 변환후 분산이 가장 크도록 사영벡터를 찾으므로 첫번째 그림이 PCA변환이 된다. 이렇게 되면 클래스별 분포에 대한 정보가 사라진다. 우리는 전체분포르를 잘 나타내는 사영벡터를 찾는 것이 아닌 두 클래스의 분포를 잘 나타내는 사영벡터를 찾는 것이다. 따라서 클래스간의 분포는 크고 클래스상의 분포는 작은 사영벡터를 찾아야 하고 이렇게 잘 함축된 벡터가 두번째 그림이다. 


나중에 시간이 되면 수학적 정의에 대해서도 자세히 다루어 보겠다.







'ML & DM > Dimension Reduction' 카테고리의 다른 글

Loading vs eigenvectors in PCA  (0) 2016.01.31
Clustering 과 Dimensionality Reduction의 차이  (0) 2016.01.28