차원축소(Dimension Reduction)
부천대 IOT 응용소프트웨어를 수강하는 학생들을 위해 강의내용을 정리했습니다. 강의내용은 모두 파이썬 머신러닝 완벽 가이드를 참고하였습니다.
Last updated
부천대 IOT 응용소프트웨어를 수강하는 학생들을 위해 강의내용을 정리했습니다. 강의내용은 모두 파이썬 머신러닝 완벽 가이드를 참고하였습니다.
Last updated
우리는 교수님께 어떤 과제를 부여 받으면 인터넷의 블로그나 논문, 신문자료 등을 통해 대량의 정보들을 검색한다. 그 수 많은 정보로부터 우리는 원하는 내용과 형식에 맞게 3~4p 분량으로 정리 및 요약해가며 레포트를 작성했던 경험이 있다. 내용을 정리면서 불필요한 혹은 원치않은 정보를 필터링하고 원하는 정보만을 취합했던 경험과 같이 데이터도 유사하다.
비지도학습의 큰 축인 차원축소란 고차원의 원본 데이터를 저 차원의 부분공간으로 투영하여 데이터를 축소하는 기법을 말한다. 예를들어 10차원 이상의 데이터가 주어졌을 때 2~3차원의 데이터로 부분공간으로 투영하여 데이터를 축소킨다. 일반적으로 차원이 증가할수록 데이터 포인트 간 거리가 기하급수적으로 멀어져 희소한(sparse) 구조를 가지게 된다. 또한 피쳐가 많아지게 되면 개별 피처 간 상관관계가 높아 다중공선성의 문제 과적합이나 예측 성능이 저할 될 우려가 있다.
따라서 차원축소기법으로 많은 다차원의 피쳐를 피처 수를 줄이다 보면 데이터를 직관적으로 해석할 수 있고, 데이터 크기가 줄어들어 학습에 필요한 학습시간이 줄어들거나 모델 성능 향상에 기여할 수 있다. 이외에도 시각적으로 데이터 패턴인지가 가능하다.
그럼 어떻게 원본데이터의 정보량을 최소한으로 훼손을 덜 시키며 차원을 축소시킬 수 있는 것인가?
차원축소 방법에 피처선택(feature selection)과 피처추출(feature extraction)방법으로 나뉠 수 있다.
피처선택(feature selection): 고등학교 시절, 성적이 좋은 학생들만 따로 면학실을 만들어 줬던 경험과 같이 특정 피처에 종속성이 강한 불필요한 피처를 제거하고, 데이터 특징을 잘 살릴 수 있는 피처만을 선택하는 방법이다.
피처추출(feature extraction): 바나나,포도,사과를 과일이라는 하나의 단어로 요약하듯이 기존피처를 저차원으로 압축시켜 추출하는 방법이다. 이렇게 새롭게 추출된 중요특성은 기존피처가 압축된 것이지만, 기존 피처와 다른 새로운 값이 된다.
이처럼 피처추출(Feature Extraction)은 기존 피처를 단순 압축만 아니라, 잠재된 피처를 함축적으로 더 설명할 수 있는 또 다른 공간(저차)으로 매핑해 추출한다. 즉 다양한 피처들로부터 내재된(latent) 요소 찾는 것이다. 활용분야로는 추천 엔진, CNN 나오기 전 이미지 분류, 문서 토픽 모델링이 있다.
차원축소의 대표적인 방법인 PCA는 고차원의 원본 데이터를 저 차원의 부분 공간으로 투영하여 데이터를 축소시키는 방법이다. 차원축소를 하게되면 데이터 정보유실이 생길 수 밖에 없는데, 이러한 정보유실을 최소화하고자 PCA는 원본 데이터가 가지는 데이터 변동성을 가장 중요한 정보로 간주하여 이 변동성을 기반으로 원본 데이터를 투영시켜 차원 축소를 진행한다.
PCA는 여러 변수 간에 존재하는 상관관계가 있다 가정을 하고 대표하는 주성분(Principal Component)을 추출하여 차원을 축소시킨다. 구체적으로 가장 높은 분산을 가지는 데이터의 축을 찾아 새로운 축으로 데이터를 투영(mapping)시키고, 그 축을 기준으로 데이터를 표현한다.
데이터 축은 어떻게 만들어질까?
아래그림과 같이 PCA는 먼저 가장 큰 데이터 변동성(Varience)을 기반으로 첫 번째 벡터 축을 생성하고, 두 번째 축은 첫번째 벡터축에 직각이 되는 벡터(직교 벡터)를 축으로 만든다. 다음 세번째 축은 다시 두번째의 축과 직각이 되는 벡터를 설정하는 방식으로 축을 생성한다. 따라서 PCA는 원본 데이터 피처개수에 비해 매우 작은 주성분으로 원본 데이터의 변동성을 대부분 설명할 수 있는 분석방법이다.
PCA를 변환하는 방식은 먼저 원본 데이터의 공분산 행렬을 추출한다. 공분산행렬을 구하면 대칭행렬이기에 고유값(eigenvalue)으로 분해될 수 있다. 그러면 이렇게 구한 고유벡터 원본 데이터로 아래 그림과 같이 새로운 벡터로 변환(선형변환)시키면 PCA값이 도출된다. 따라서 고유벡터는 PCA의 주성분 벡터로서 입력 데이터의 분산이 큰 방향을 나타내고, 고유값은 고유벡이터의 크기이자 입력 데이터의 분산을 나타낸다.
(공분산 구하는 방법은 파이썬머신러닝 완벽 가이드 책을 참조하길 바란다.)
그래서 PCA 수행절차를 보면 다음과 같다.
입력 데이터 세트의 공분산 행렬을 생성한다.
공분산 행렬의 고유벡터와 고유값을 계산한다.
고유값이 가장 큰 순으로 K개의 고유벡터를 추출한다.
고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환한다.
다음은 사이킷런의 PCA를 이용하여 붓꽃(iris) 데이터 세트의 sepal length, sepal width, petal length, petal width의 4개 속성을 2개의 PCA 차원으로 압축해보는 실습을 하겠다.
1.데이터 불러오기 (데이터 프레임까지 변환
2. 평균이0, 편차가 1로 변환하는StandardScaler
로 데이터를 정규화 한다.
3. 2개의 PCA 차원으로 압축
4. 2D 공간으로 데이터 시각화
SVD는 행렬을 대각화하는 PCA와 유사하게 행렬분해를 이용한 차원축소 기법이다. PCA 경우 행과 열의 크기가 같은 정방행렬만을 고유벡터로 분해 후 고유 벡터에 원본 데이터를 투영하여 차원축소를 했었다.
하지만 SVD는 행과 열의 크기가 다른 행렬 A(rectangular matrix)에서도 다음과 같이 분해(decomposition) 할 수 있다. (U: 왼쪽 직교행렬,시그마 :대각행렬, V: 오른쪽 직교행렬)
행렬U와 V에 속한 벡터는 특이벡터(singular vector)라 하고, 모든 특이벡터는 서로 직교하는 성질을 가진다. 시그마는 대각행렬이고, 대각행렬은 행렬의 대각에 위치한 값만 0이 아니고, 나머지 위치 값이 모두 0인 행렬을 말한다. 그리고 시그마에서 0이 아닌 값이 행렬 A의 특이값이다.
방금 전 위의 식을 그대로 적용한 것이 Full SVD라고 하는데, 이 Full SVD의 왼쪽 직교행렬(U)이 M*M인 사이즈를 그대로 사용할 수 없어 Compact SVD 로 비대각 부분과 대각원소가 0인 부분을 제거하여 데이터 사이즈를 줄인다. 그리고 Truncated SVD 사용해 원하는 차원의 갯수(상위 r)만큼 차원을 추출하면 U와 V 행렬 사이즈가 줄어든다.
이렇게 Truncated SVD 사용하면 다시 원본데이터가 일부손실되었지만 잡음이 제거된 형태로 재구성을 할 수 있고, 차원 축소를 통해 잠재요인(Latent Factor)를 찾을 수 있다.이러한 SVD는 이미지 압축, 추천엔진, 문서의 잠재의미분석 등 다양한 분야에 활용된다.
[1] 파이썬 머신러닝 완벽가이드
[2] https://blog.bioturing.com/2018/06/14/principal-component-analysis-explained-simply/
[3] https://angeloyeo.github.io/2019/07/27/PCA.html#fnref:3