본문 바로가기
IT 도서/파이썬 머신러닝

6. 차원 축소

by 이민우 2021. 2. 9.
728x90
반응형

book.naver.com/bookdb/book_detail.nhn?bid=16238302

 

파이썬 머신러닝 완벽 가이드

자세한 이론 설명과 파이썬 실습을 통해 머신러닝을 완벽하게 배울 수 있습니다!《파이썬 머신러닝 완벽 가이드》는 이론 위주의 머신러닝 책에서 탈피해 다양한 실전 예제를 직접 구현해 보면

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.

 

 

차원 축소 (Dimension Reduction)

  • 많은 특징으로 구성된 다차원 데이터 셋의 차원을 축소해 새로운 차원의 데이터 셋을 생성하는 기술
  • 일반적으로 차원이 증가하면 데이터 포인트 간 거리가 멀어져서 희소한 구조가 된다.
  • 수백 개 이상의 특징으로 구성된 데이터 셋은 상대적으로 적은 차원에서 학습된 모델보다 예측 신뢰도가 떨어진다.
  • 또한 특징이 많을 경우 개별 특징 간에 상관관계가 높을 가능성이 크다.
  • 선형 모델에서는 입력 변수 간 상관관계가 높을 경우 다중 공선성 문제로 모델의 예측 성능이 저하된다.
  • 차원 축소는 특징 수를 줄여 더 직관적으로 데이터를 해석할 수 있게 해준다.
  • 또한 시각적으로 데이터를 압축해서 표현할 수 있고, 학습 데이터의 크기가 줄어들어 학습에 필요한 처리 능력도 줄일 수 있다.
  • 일반적으로 차원 축소는 피처 선택 (Feature selection)과 피처 추출 (Feature extraction)으로 나눈다.
피처 선택 : 특정 피처에 종속성이 강한 불필요한 특징은 아예 제거하고 주요 특징만 선택한다.
피처 추출 : 기존 특징을 저차원의 중요 특징으로 압축해서 추출한다.
               단순한 압축이 아닌, 특징을 함축적으로 더 잘 설명할 수 있는 공간으로 매핑해 추출하는 것.
  • 차원 축소는 단순히 데이터를 압축하는 것이 아닌, 기존 특징으로 인지할 수 없었던 잠재적인 요소를 추출하는 것이다.
  • 이미지 데이터의 특성을 추출하거나, 텍스트 문서의 숨겨진 의미를 도출하는 데 사용된다.

 


 

PCA (Principa Component Analysis, 주성분 분석)

  • 가장 대표적인 차원 축소 기법
  • 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분을 추출하고, 차원을 축소한다.
  • 데이터를 쉽게 인지할 수 있으며, 컴퓨터 비전 분야에서 주로 사용된다.
  • 기존 데이터의 정보 유실이 최소화해야 한다.
  • 가장 높은 분산을 가지는 데이터 축을 찾아 이 축으로 차원을 축소하는데, 이것이 PCA의 주성분이 된다.
  • sklearn.decomposition.PCA 

 

 

작동 방식

  1. 가장 큰 데이터 변동성을 기반으로 첫 번째 축을 생성한다.
  2. 두 번째 축은 이전의 축과 직각이 되는 직교 벡터를 축으로 생성한다.
  3. 세 번째 축은 다시 두 번째 축과 직각이 되는 직교 벡터를 축으로 생성한다.
  4. 이렇게 여러 번 생성된 벡터 축에 원본 데이터를 투영해 벡터 축의 개수만큼의 차원으로 원본 데이터를 차원 축소한다.

 

 

특징

  • PCA는 원본 데이터의 특징 개수에 비해 매우 작은 주성분으로 원본 데이터의 총 변동성을 설명할 수 있다.
  • 선형대수 관점에서 보자면, 입력 데이터의 공분산 행렬을 고유값 분해하고, 구한 고유벡터에 입력 데이터를 선형 변환하는 것.
  • 위의 고유벡터가 PCA의 주성분이며, 입력 데이터의 분산이 큰 방향을 나타낸다.
  • 고유값은 고유벡터의 크기를 나타내며, 입력 데이터의 분산을 나타낸다.
  • 선형 변환은 특정 벡터에 행렬을 곱해 새로운 벡터로 변환해, 벡터를 하나의 공간에서 다른 공간으로 투영하는 것이다.
  • 입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 것이 PCA이다.
분산 : 한 개의 특정한 변수의 데이터 변동
공분산 : 두 변수 간의 변동

*공분산 행렬은 여러 변수와 관련된 공분산을 포함하는 정방행렬이다.
*공분산 행렬은 정방행렬이자 대칭행렬이다.

 


LDA (Linear Discriminant Analysis, 선형 판별 분석법)

  • PCA와 유사하게 입력 데이터 셋을 저차원 공간에 투영해 차원을 축소한다.
  • LDA는 PCA와 달리 개별 클래스를 분별할 수 있는 기준을 최대한 유지하며 차원을 축소한다.
  • PCA는 입력 데이터의 변동성이 가장 큰 축을 찾았지만, LDA는 입력 데이터의 결정 값 클래스를 최대한으로 분리할 수 있는 축을 찾는다.
  • LDA는 입력 데이터의 결정 값 클래스 분리를 최대화하는 축을 찾기 위해 클래스간 분산과 클래스 내부 분산의 비율을 최대화하는 방식으로 차원을 축소한다.
  • 즉, 클래스 간 분산은 최대한 크게하고, 클래스 내부 분산은 최대한 작게 한다.

 

 

작동 방식

  • 클래스간 분산과 클래스 내부 분산 행렬을 구한 뒤 이 행렬에 기반해 고유 벡터를 구하고 입력 데이터를 투영
  1. 입력 데이터의 결정값 클래스별로 개별 특징의 평균 벡터를 기반으로 클래스 내부와 클래스 간 분산 행렬을 구한다.
  2. 클래스 내부 분산 행렬과 클래스간 분산 행렬을 고유벡터로 분해한다.
  3. 고유값이 가장 큰 순으로 K개(LDA의 변환 차수만큼) 구한다.
  4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환한다.

 


 

SVD (Singular Value Decomposition, 특이값 분해)

  • PCA와 유사한 행렬 분해 기법을 사용한다.
  • PCA의 경우 정방행렬만을 고유벡터로 분해했지만, SVD는 정방행렬 뿐 아니라 행과 열의 크기가 다른 행렬에도 적용할 수 있다.
  • 행렬 A는 다음과 같이 분해한다. A = U ∑ Vt
  • U와 Vt는 특이벡터이며, 보든 특이벡터는 서로 직교한다.
  • ∑는 대각행렬이며, 행렬의 대각에 위치한 값만 0이 아니고 나머지는 0이다.
  • ∑에 위치한 0이 아닌 값이 바로 행렬 A의 특이값이다.
  • numpy.linalg.svd (U, sigma, V 반환)
  • scipy.linalg.svd (U, sigma, V 반환)

 

-SVD는 A의 차원이 m*n일 때 U는 m*m, Vt는 n*n, ∑는 m*n으로 분해된다.
-그런데 사실 ∑의 비대각인 부분과 대각원소 중 특이값이 0인 부분도 모두 제거하고 제거된 ∑에대응하는
 U와 Vt의 원소도 함께 제거해 차원을 줄인 형태로 SVD를 적용한다.-이런 방식으로 적용하면
 
U는 m*p, Vt는 p*n, ∑는 p*p으로 분해된다.

 

 

Truncated SVD

  • 위의 식에서 ∑의 대각원소 중 상위 몇 개만 추출해 여기에 대응하는 U와 Vt의 원소도 함께 제거해 더욱 차원을 줄인 형태로 분해
  • scipy.sparse.linalg.svds (U, sigma, V 반환)
  • sklearn.decomposition.TruncatedSVD (원소를 반환하지 않고 곧바로 fit과 transform 등의 함수 사용을 가능하게 해줌)

 


 

NMF (Non-Negative-Matrix Factorization, 음수 미포함 행렬 분해)

  • Truncated SVD와 같이 낮은 랭크를 통한 행렬 근사 방식의 변형
  • NMF는 원본 행렬 내의 모든 원소 값이 모두 양수라는 것이 보장되면 간단하게 두 개의 기반 양수 행렬로 분해될 수 있는 기법이다.
  • SVD와 유사하게 차원 축소를 통한 잠재 요소 도출로 이미지 변환 및 압축, 텍스트의 토픽 도출 등의 영역에서 사용된다.
  • sklearn.decomposition.NMF

실습코드 : https://github.com/123okk2/MachineLearning_practice/tree/main/6.%20%EC%B0%A8%EC%9B%90%20%EC%B6%95%EC%86%8C/DimensionReduction_practice-main

728x90
반응형

'IT 도서 > 파이썬 머신러닝' 카테고리의 다른 글

8. 텍스트 분석  (0) 2021.02.11
7. 군집화  (0) 2021.02.10
5. 회귀  (0) 2021.02.08
4. 분류  (0) 2021.02.08
3. 평가  (0) 2021.02.01