오늘은 머신 러닝에서 중요한 개념인 차원 축소와, 차원 축소를 진행하는 방법인 PCA와 LDA에 대해 간단하게 정리해보도록 하겠다. 학교에서 배운 내용을 토대로 작성하기 때문에 사소한 오류들이 있을 수 있다. 또한 출처 표시가 없는 자료들은 모두 학교 수업 자료이며, 수업 자료는 다음 책들이 원본이다.
Data Mining for Business Analytics: Concepts, Techniques and Applications in Python
Data Mining for Business Analytics: Concepts, Techniques, and Applications in R
저자 Shmueli, Galit , Patel, Nitin R. , Bruce, Peter C.
차원 축소와 그 필요성
차원 축소란, n개의 observation 이 m 개의 variable을 가지고 있을 때, m 개의 변수들을 조작하여 p 개의 변수들로 줄이는 과정이다. 이때 변수의 개수가 차원의 개수와 같다.
차원 축소는 크게 Feature Selection 과 Feature Projection 으로 나눌 수 있다. 이름에서 유추 가능하듯이, Selection은 변수들 중 유의미한 변수들만 골라내는 것이고, Projection은 기존 변수들을 조합하여 새로운 변수를 만들어내는 느낌이다. 이번 포스팅에서 다룰 PCA와 LDA는 모두 Feature Projection에 해당하는 차원 축소 기법이다.
차원 축소의 필요성은 간단히 말하면, "차원이 커지면 커질수록 좋은 효과를 보기 어렵기 때문" 이다.
이는 Ucleadian Distance와 관련된 내용인데, 벡터 공간 상에서 두 점의 거리를 의미한다. 우리 세상이 3차원까지밖에 표현을 못 하기 때문에 근본적으로 그 이상의 차원에 대해서는 해석하기가 아주 어렵다. 또한 컴퓨터 상으로도 고차원으로 갈수록 점 사이의 거리가 크게 증가함을 볼 수 있다. 거리가 늘어난다는 것은 회귀, 분류 등의 머신러닝에서 굉장히 치명적으로 다가오기 때문에, 차원을 줄이는 것은 꼭 필요한 작업이라고 할 수 있다.
주성분 분석, PCA (Principal Components Analysis)
PCA의 핵심은 "데이터의 분산만 잘 가져와 나타내면 원래 데이터의 특성을 그대로 설명할 수 있다"는 것에 있다. 데이터의 특징에는 평균, 분산, 중앙값, 사분위값 등 추출해낼 수 있는 많은 성분들이 있지만, 그 중 특히 분산에 초점을 맞추는 것이 PCA라고 생각하면 편할 것 같다.
단적인 예를 들기 위해 유튜브에서 그림을 찾아왔다. (링크는 글 맨 밑에)
초록색 점이 데이터고, 데이터가 유전자와 관련있기 때문에 x축과 y축이 gene 1, 2로 나타내져 있음을 확인할 수 있다. 여기서 빨간 점선이 바로 초록색 데이터들의 분산을 가장 잘 나타내는 선이다. 이 빨간 점선을 찾는 방법은 결국 축 한 개를 360도 모든 방향으로 회전시켜보면서 데이터들을 축에 사영시키고, 사영된 값들의 분산이 가장 큰 축을 선택하는 간단한 방법이다. PCA는 다시 한 번 말하지만 분산으로 데이터를 설명하고자 하는 것이기 때문에, 분산이 가장 큰 축을 선택하는 것이다. 이렇게 해서 가장 분산을 잘 나타내는 축이 바로 PC1 이 되는 것이다.
이렇게 구한 PC1의 기울기를 loading vector, weight vector 등으로 부른다. 한 데이터셋에서 주성분(Principal Component)의 최대 갯수는 데이터셋의 Variable의 수와 같다. (차원의 수만큼 축을 뽑아낼 수 있기 때문) 그렇다면 PC1 말고 PC2, 3 ... 을 구하는 방법은?
결과적으로 말하면 PC1과 수직인 방향의 벡터들 중, 분산이 가장 큰 벡터가 PC2가 된다. 사진은 애초에 2차원 데이터였어서 PC2가 자연스럽게 골라지지만, 다차원의 공간이라면 선택 가능한 축들의 개수가 더 많을 것이다. 데이터셋의 차원의 수가 주성분의 수와 같음에 유의하자. 그리고 PC에 정사영된 초록색 X 들을 Scoring vector를 의미한다. Scoring vector의 크기는 당연히 [n,1] 일 것이다. (n은 데이터의 개수) 이렇게 데이터들을 정사영시켜서 PC를 구하고 나면, 원래의 데이터를 PC1, PC2로 나타낼 수 있게 된다. 위의 예시에선 원래 데이터가 gene 1, 2 2개였어서 체감이 안 되겠지만, gene이 100까지 있던 상황이었다면 100차원의 데이터를 2차원의 데이터로 축소한 아주 간편해진 상황이 된 것이다.
어째서 수직인 방향의 벡터들을 찾아냐고 묻는다면 선형대수학적으로 접근해야 하는데, 사실 그 방면에 대해선 잘 설명할 재간이 없다. 간단히 말하자면 데이터셋의 공분산 행렬의 고유벡터가 결국 PC, 즉 weight vector 인데, 이 고유벡터들 끼리는 항상 직각일 수밖에 없다. 자세한 내용은 참고 자료에 걸어놓은 블로그를 참고하시길...
PC 를 몇 번째까지 구해야 하는지에 대한 기준은 명확하지 않고 분석가마다 다르다. 하지만 핵심은 적은 PC로 원래 데이터의 분산을 많이 설명할 수 있다면 그게 좋은 PCA인 것이다. 가령 100차원의 데이터의 총 분산이 10000인데, PC1과 PC2로 8500을 설명했다면 그 상태에서 데이터 분석을 진행해도 무리는 없을 것이다. 다만, 일반적으로는 PC의 개수를 늘려나가보다가 분산의 설명도가 급격히 떨어지는 지점을 마지막 주성분으로 선택한다고 한다.
이렇게 차원 축소와 PCA의 이론적인 부분들에 대해서 살펴보았는데, 다음 포스팅에서는 파이썬을 통해 PCA를 해본 결과를 공유하도록 하겠다.
수업자료 외의 참고 자료 :
https://casa-de-feel.tistory.com/19
https://www.youtube.com/watch?v=FgakZw6K1QQ&ab_channel=StatQuestwithJoshStarmer
'머신러닝' 카테고리의 다른 글
머신러닝 - Naive Bayes Classifier(분류) 정리 (0) | 2023.06.17 |
---|---|
머신러닝 - Regularization 과 LASSO, Ridge 정리 (0) | 2023.06.09 |
머신러닝 - Bootstrap 정리 with 중심극한정리, R (0) | 2023.05.31 |
머신러닝 - 차원 축소와 PCA (3) (0) | 2023.04.15 |
머신러닝 - 차원 축소와 PCA (2) (0) | 2023.04.14 |