Unsupervised Learning : PCA, K-Means

Juneee
Almighty Data Science Bootcamp
10 min readJun 20, 2018

Introduction

Supervised learning에서는 input variable X와 response variable Y의 pair로 이루어진 data를 이용해, X variable로 Y variable을 예측하고 해석하는 model을 만들고자 한다. 이때 우리에게는 Y 값들이 주어지기 때문에, 이를 이용해서 우리가 만든 model이 얼마나 정확한지 검토해보고, 문제가 있다면 model을 수정해나갈 수 있다. 이는 마치 학생들이 답지가 있는 문제를 풀면서, 자신의 틀린 부분들을 그때그때 feedback 받으면서 공부 하는 과정과 유사하다.

하지만 unsupervised learning에서는, 우리는 답지가 없는 문제를 푸는 학생이 된다. 우리에게는 response variable Y가 없고 input variable X로만 이루어진 data가 주어지고, 이 data 안에서 어떤 의미있는 정보를 찾고자 한다. 하지만 우리가 푸는 문제에는 정확한 답이 없다. 똑같은 data가 주어지더라도, 사람마다 얻고자 하는 정보, 목표가 다르고, 또 우리의 분석 결과가 맞는지 틀린지를 확인해 볼 정답이 없다. 따라서 unsupervised learning 문제가 supervised learning 문제에 비해 좀 더 challenging하다고 한다.

그러면 어떤 방법으로 주어진 data에서 의미있는 정보를 찾을 수 있을까? 우리에게 p개의 변수와 관련된 n개의 관측치가 주어져있다고 하자. 만약 이 data의 크기가 너무 크다면, 즉 변수의 개수도 많고 관측치의 개수도 많다면, 데이터를 한눈에 파악하기 힘들기 때문에 그 안에 내포돼 있는 의미있는 정보를 찾기 힘들 것이다. 그래서 우리는 데이터의 정보를 많이 손실하지 않으면서도, 압축해서 한눈에 보고싶다. 이에 대해 두가지 접근 방법을 생각해볼 수 있다.

  1. 현재 data의 변수가 너무 많아, 데이터를 하나의 plot에 시각화해서 살펴보지 못한다. 이에 p개의 변수를 2~3개정도로 압축해서 데이터를 시각화 해서 살펴보고싶다. 즉 data의 차원을 축소시키고 싶다.
  2. 현재 data의 관측치가 너무 많아, 하나 하나의 관측치의 정보를 모두 살펴보기 힘들다. 이에 n개의 관측치를 비슷한 특징을 지닌 관측치끼리 그룹지어서, 그룹별로 특징을 살펴보고싶다. 즉 data의 관측치들을 군집화하고 싶다.

위의 1번 접근방법중 하나는 PCA(Principal Components Analysis)이고, 2번 접근방법중 하나는 K-means 이다. 이번 글에서는 이 두가지 방법을 살펴보려고 한다.

1. PCA(Principal Components Analysis)

다시 우리에게 p개의 변수에 대한 n개의 관측치 data가 주어졌다고 하자. 우리가 이 data를 시각화해서 보고싶다면, p개의 변수중 2개씩 짝지어서 scatter plot을 그려볼수는 있다. 하지만 이렇게 plot을 그리면 변수가 조금만 많아져도 살펴봐야 할 plot이 너무 많아지고, 또 전체 p개 변수중에서 한번에 2개의 변수씩만 살펴볼 수 있기 때문에, 정보의 손실이 너무 많아 의미있는 정보를 찾지 못할 가능성도 높다.

이에 우리는 주어진 data의 정보를 최대한 유지하면서도, 한눈에 살펴볼 수 있는 더 작은 차원으로 data를 가져오고 싶다. 이때 data의 정보를 손실하지 않는다는 개념은 수학적으로 어떻게 표현할 수 있을까? data가 담고있는 정보라는 개념은 분산이라는 관점에서 살펴볼 수 있다. 어떤 방 안에 3명의 사람이 있고, 우리에게 이 사람들의 나이 정보가 주어졌다고 하자. 우리는 이 사람들의 나이를 맞춰야 한다. 만약 우리에게 주어진 나이가 1살, 30살, 90살이라면, 우리는 이 사람들을 보고 나이를 바로 맞출 수 있을 것이다. 반면 우리에게 주어진 나이가 30살 3개월, 30살 8개월, 30살 5개월이라면, 이 사람들을 봐도 나이를 제대로 맞출 가능성이 매우 작다. 이렇게 어떤 data의 분산이 크면 우리는 그 data로부터 많은 정보를 얻을 수 있다. 즉, 정보를 최대한 유지하고 싶다라는 목적은 분산을 최대로 하고싶다라는 수학식으로 표현할 수 있다.

이때 PCA는 기존 p개의 변수들의 선형 결합으로 새로운 주성분을 만든다. 이렇게 만들어지는 주성분들 중에서, 기존 데이터의 분산을 가장 많이 설명하는 주성분을 첫번째 주성분으로 선택한다. 그리고 설명되지 않은 나머지 분산을 가장 많이 설명하는 주성분을 두번째 주성분으로 선택한다. 이런식으로 주성분을 만들어 나가면, 기존에 p차원의 데이터였기 때문에 총 p개의 주성분을 만들 수 있다. 이런 여러 조건들을 만족시키는 주성분을 구하는 과정을 식으로 살펴보자.

이때 첫번째 주성분의 loading을 나타내는 loading vector를 다음과 같이 표현하고, loading들의 크기에 어느정도 제약조건을 둔다.

먼저 기존 data의 분산을 가장 많이 설명하는 첫번째 주성분 Z1찾아보자. 즉, 이는 Z1의 분산이 가장크게하는 loading 조합을 찾는다는 뜻이다.

cf. 기본적으로 데이터의 분산에만 관심이 있기 때문에, 계산의 편의를 위해 처음에 원래 data의 각 변수 X들의 평균이 0이 되도록 해준 후 진행한다. 따라서 X의 선형걸합으로 이루어진 주성분 Z들의 평균도 0이되고, 위의 Z1의 분산을 구하는 과정에서 Z1의 기대값 부분이 사라지게 된다.

이제 첫번째 주성분이 설명하고 남은 분산을 가장 많이 설명하는 두번째 주성분을 찾아보자. 두번째 주성분은 첫번째 주성분과 정보가 겹치지 않아야 하므로, 첫번째 주성분과 uncorrelated해야한다. 즉, 이는 두번째 주성분의 loading vector가 첫번째 주성분의 loading vector와 orthogonal해야 한다는 뜻이므로, 이 부분을 제약조건에 추가해준다.

이를 그래프로 표현해보면,

기존 두 변수의 선형결합으로 주성분이 만들어지는데, 이때 만들어진 주성분 축으로 기존 data를 projection 시킨 결과를 해당 주성분의 score라고 한다. 이때 이 주성분의 축을 기준으로 score들의 분산을 계산했을때 이 분산을 가장 크게 만드는 주성분을 첫번째 주성분 PC1이라고 한다. 이렇게 설명하고 남은 분산을 가장 많이 설명하는 두번째 주성분 PC2는 PC1축과 orthogonal하게 나타난다.

이런식으로 P개의 주성분을 찾았다면, 이 중 몇개의 주성분을 사용해서 기존 data를 압축시킬까라는 문제가 남는다. 이때 판단의 근거가 되는 값은 각각의 주성분이 기존 data의 정보를 설명하는 정도이다. 이를 Proportion of Variance Explained(PVE)라고 한다. 이를 계산해보자.

이렇게 각 주성분들의 PVE와, 주성분을 추가시킬때 누적되는 PVE의 정도를 보고 사용할 주성분의 개수를 결정한다. 예를들어 4개의 변수가있는 data에서 4개의 주성분들의 PVE를 계산한 결과가 다음과 같다고 하자.

왼쪽의 그래프가 각 주성분들이 설명하는 정보의 양이고, 오른쪽 주성분을 추가했을 때 누적 정보의 양이다. 먼저 왼쪽 그래프를 보면, 첫번째 주성분은 기존 data 정보의 약 60%정도를 설명하고, 두번째 주성분은 약 20% 정도를 설명한다. 따라서 오른쪽 그래프를 보면, 처음 두개의 주성분이 전체 data 정보의 약 80% 정도를 설명한다. 반면 세번째와 네번째 주성분은 각각 10%정도의 정보만 담고있다. 따라서 처음 두개의 주성분만으로도 전체 정보의80%를 담을 수 있고, 세번째 주성분을 추가하더라도 10%정도의 정보밖에 추가되지 않기때문에, PC1과 PC2까지만 사용하여 data를 압축시키는게 좋아 보인다.

이런식으로 2개나 3개의 주성분을 이용해서 기존의 P차원 data를 2~3차원으로 차원을 축소시키면, 전체 data를 plot을 통해 한눈에 볼 수 있다는 장점이 있다. 바로 위의 예에서처럼, 변수가 4개였던 4차원 data를 PCA를 통해 2차원으로 압축시켰고, 이렇게 압축된 data를 plot으로 나타냈을 때 다음과 같다고 하자.

먼저 기존 data를 간략하게 설명하면, 총 Murder, Assault, Rape, UrbanPop 4개의 변수와 50개의 관측치가 있고, 각각의 관측치는 도시를 나타낸다.변수들중 Murder, Assault, Rape은 범죄와 관련된 정보를 담고있고, UrbanPop은 도시의 크기나 발전 정도와 관련된 정보를 담고있다. 이때 PCA의 결과, PC1은 Murder, Assault, Rape의 loading 절대값이 0.5정도로 비슷하게 크고 UrbanPop 의 loading 절대값은 0.2로 상대적으로 작다. 즉 PC1은 범죄의 정도를 나타내는 변수라고 해석할 수 있을 것 같다. 반면 PC2는 PC1과 반대로 UrbanPop의 loading 절대값이 0.8로가장 크고, 나머지 변수들의 loading 절대값은 상대적으로 작다. 따라서 PC2는 도시화 정도를 나타내는 변수라고 해석할 수 있을 것 같다. 정리하면, PC1이 클수록 범죄가 많은 도시, PC2가 클수록 발전한 도시라고 볼 수 있다. 오른쪽은 각각의 도시를 PC1, PC2 좌표에 나타낸 plot이다. 오른쪽 위에 california같은 경우, PC1값과 PC2값 모두 크다. 따라서 도시화가 어느정도 됐으면서도 범죄가 많은 도시라고 해석할 수 있다. 이런식으로 기존 data의 차원을 줄이면, plot을 통해 data들을 한눈에 볼 수 있기때문에 의미있는 정보를 파악하기 쉽다는 장점이 있다.

이때 주의할 점은, pca는 분산을 이용하는 방법이기때문에, 만약 기존 변수끼리 단위가 많이 다르면, 이 단위의 차이에의해 결과가 크게 영향받을 수 있다.

위의 plot을 보면, 왼쪽이 scaling을 했을 때, 오른쪽이 scaling을 하지 않았을 때의 결과이다. 오늘쪽 plot을 보면, scaling을 하지 않았을 때, 첫번째 주성분은 Assault의 loading이 거의 1에 가깝고, 두번째 주성분은 UrbanPop의 loading이 거의 1에 가깝게 나타난다. 즉, Assault변수의 분산이 가장 크기때문에 첫번째 주성분은 Assault가 weight의 대부분을 가져갔고, UrbanPop변수가 그 다음으로 분산이 크기 때문에 두번째 주성분은 UrpanPop이 weight의 대부분을 가져갔다. 즉, 단순한 변수들의 단위차이가 결과에 큰 영향을 끼칠 수 있으니, 분석에 앞서 변수들의 standard deviation이 1이되게 scaling을 해줘야 한다.

이렇게 주어진 data의 변수 측면에서 접근하여 차원을 축소시키는 PCA와 달리, K-means는 관측치 측면에서 접근하여 data의 군집화를 시도한다.

K-means 관련 내용은 다음 블로그 글에서 자세히 다뤄보겠습니다.

--

--