Hyun's Wonderwall

[AIchemist] 파머완 - CH06. 차원 축소 (1~6) 본문

Study/Python-Machine-Learning

[AIchemist] 파머완 - CH06. 차원 축소 (1~6)

Hyun_! 2023. 11. 21. 06:06

[Chapter 06] 차원 축소

1. 차원 축소 개요

차원 축소: 매우 많은 피처로 구성된 다차원 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것.

 

일반적으로 차원이 증가할수록 데이터 포인트 간의 거리가 기하급수적으로 멀어지게 되고 희소한(sparse) 구조를 가지게 된다. 수백 개 이상의 피처로 구성된 데이터 세트의 경우, 상대적으로 적은 차원에서 학습한 모델이 예측 신뢰도가 높다. (피처가 많을 경우 개별 피처간에 상관관계가 높을 가능성이 큰데, 선형 회귀와 같은 선형 모델에서는 입력 변수 간의 상관관계가 높으면 다중 공선성 문제로 모델의 예측 성능이 저하된다)

 

매우 많은 피처를 갖는 다차원 데이터 세트를 차원 축소해 피처 수를 줄이면 더 직관적으로 데이터를 해석할 수 있다.

(시각적으로 데이터를 압축해 표현 가능, 학습 데이터 크기 줄어들어 학습에 필요한 처리능력 감소)

 

<차원 축소의 종류>

피처 선택: 특정 피처에 종속성이 강한 불필요한 피처는 아예 제거하고 데이터의 특징을 잘 나타내는 주요 피처만 선택하는 것.

피처 추출: 기존 피처를 저차원의 중요 피처로 압축해서 추출하는 것. (이렇게 새롭게 추출된 중요 특성은 기존의 피처가 압축된 것이므로, 기존의 피처와는 완전히 다른 값)

- 피처 추출은 기존 피처를 단순 압축하는 게 아니라 더 함축적인 요약 특성으로 추출 -> 기존 피처가 인지하기 어려웠던 '잠재적인 요소(Latent Factor)를 추출.

차원 축소는 데이터를 좀 더 잘 설명할 수 있는 잠재적인 요소를 추출하는 것에 중요한 의미가 있다. (ex. 이미지나 텍스트에서 잠재적인 의미 찾기)

 

<차원 축소 알고리즘의 활용>

(1) 많은 픽셀로 이뤄진 이미지 데이터에서 잠재 특성을 피처로 도출해, 함축적인 이미지 변환과 압축을 수행. 이렇게 변환된 이미지는 원본 이미지보다 훨씬 적은 차원이므로 분류 수행 시 과적합(overfitting) 영향이 작아지며 예측 성능을 끌어올릴 수 있음.

(2) 텍스트 문서에서 단어들의 구성에서 숨겨져 있는 시맨틱(Semantic) 의미나 토픽(Topic)을 잠재 요소로 간주하고 찾아낼 수 있음. (SVD, NMF가 이러한 시맨틱 토픽 모델링을 위한 기반 알고리즘으로 사용됨)

- 대표적인 차원 축소 알고리즘: PCA, LDA, SVD, NMF


2. PCA(Principal Component Analysis)

PCA: 가장 대표적인 차원 축소 알고리즘. 여러 변수간에 존재하는 상관관계를 이용해 이를 대표하는 주성분(Principal Component)을 추출해 차원을 축소하는 기법.

기존 데이터의 정보 유실이 최소화되어야 -> 이를 위해 PCA는 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 데이터의 차원을 축소시킨다. 이것이 PCA의 주성분이 된다(즉, 분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주한다.)

 

ex. 키와 몸무게 2개의 피처를 가지고 있는 데이터 세트를 가정 - 좌표평면 상에서 보면 가로축이 키, 세로축이 몸무게

(A) 데이터 변동성이 가장 큰 방향으로 축을 생성한다. (ex. y = x+1 처럼 대각선)

(B) 새롭게 생성된 축으로 데이터를 투영하고, 새로운 축 기준으로 데이터를 표현한다.

 

PCA는 제일 먼저 가장 큰 데이터 변동성(Variance)를 기반으로 첫 번째 벡터 축을 생성하고, 두 번째 축은 이 벡터 축에 직각이 되는 벡터(직교 벡터)를 축으로 한다. 세 번째 축은 다시 두 번째 축과 직각이 되는 벡터를 생성하는 방식으로 축을 생성한다.

이렇게 생성된 벡터 축에 원본 데이터를 투영하면, 벡터 축 개수만큼의 차원으로 원본 데이터가 차원 축소된다.

-> 원본 데이터의 피처 개수에 비해 매우 작은 주성분으로 원본 데이터의 총 변동성을 설명할 수 있음.

 

PCA를 선형대수 관점에서 해석: 입력 데이터의 공분산 행렬을 고유값 분해하고, 이렇게 구한 고유벡터에 입력 데이터를 선형 변환하는 것. 이 고유벡터가 PCA의 주성분 벡터로서 입력 데이터의 분산이 큰 방향을 나타낸다. 고유값(eigenvalue)은 바로 이 고유벡터의 크기를 나타내며 동시에 입력 데이터의 분산을 나타낸다.

*선형 변환: 특정 벡터에 행렬 A를 곱해 새로운 벡터로 변환하는 것. 특정 벡터를 하나의 공간에서 다른 하나의 공간으로 투영하는 개념으로도 볼 수 있다.

*공분산: 두 변수간의 변동. X, Y 변수가 있을 때 Cov(X, Y)>0라고 하면 X가 증가할 때 Y도 증가한다는 의미이다. 공분산 행렬은 여러 변수와 관련된 공분산을 포함하는 정방형 행렬임.

*고유벡터: 행렬 A를 곱하더라도 방향이 변하지 않고 그 크기만 변하는 벡터. 고유벡터는 여러 개가 존재하며, 정방 행렬은 최대 그 차원 수만큼의 고유벡터를 가질 수 있다. 이렇게 고유벡터는 행렬이 작용하는 힘의 방향과 관계가 있어서 행렬을 분해하는 데 사용된다.

 

공분산 행렬은 개별 분산값을 대각 원소로 하는 대칭행렬이다.

(정방행렬: 열과 행이 같은 행렬. / 대칭행렬: 정방행렬 중 대각 원소를 중심으로 원소값이 대칭되는 행렬) 

대칭행렬은 항상 고유벡터를 직교행렬(orthogonal matrix)로, 고유값을 정방 행렬로 대각화할 수 있다는 특성이 있다.

결국 중요한 것: 입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식이 PCA.

 

[PCA 수행 steps]

1. 입력 데이터 세트의 공분산 행렬을 생성.

2. 공분산 행렬의 고유벡터와 고유값을 계산.

3. 고유값이 가장 큰 순으로 K개(PCA 변환 차수만큼)만큼 고유벡터를 추출.

4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환.

 

붓꽃 데이터 세트에 PCA 적용

  • 4개의 속성을 2개의 PCA 차원으로 압축해 원래 데이터 세트와 압축된 데이터 세트 비교.
  • 4개의 속성이 2개의 변환 속성으로 감소하면서 예측 성능의 정확도가 약 8% 하락했지만, 속성 개수가 50% 하락한 것을 감소하면 PCA 변환 후에도 원본 데이터의 특성을 상당부분 유지하고 있음을 알 수 있음.

신용카드 고객 데이터 세트에 PCA 적용

  • 총 23개 속성 중 6개 속성을 2개 컴포넌트로 PCA 변환한 뒤 개별 컴포넌트의 변동성 확인.
  • 단 2개의 컴포넌트만으로 6개 속성의 변동성을 약 95%이상 설명할 수 있으며 특히 첫 번째 PCA 축으로 90%의 변동성을 수용할 정도로 이 6개 속성의 상관도가 매우 높음.
  • 전체를 6개 컴포넌트로 PCA 변환 -> 단 1~2%의 예측 성능 저하만 일어남. 뛰어난 압축 능력!
  • PCA는 컴퓨터 비전 분야에 활발하게 적용된다.

3. LDA(Linear Discriminant Analysis)

LDA(선형 판별 분석법): PCA와 유사하게, 입력 데이터 세트를 저차원 공간에 투영해 차원을 축소하는 기법. LDA는 지도학습의 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 차원을 축소한다.

LDA는 입력 데이터의 결정값 클래스의 분리를 최대화하는 축을 찾는다. 그를 위해 LDA는 클래스 간 분산(between-class-scatter)과 클래스 내부 분산(within-class-scatter)의 비율을 최대화하는 방식으로 차원을 축소한다. (-> 즉, 클래스 간 분산을 최대로, 클래스 내부 분산을 최소로)

 

*PCA와의 차이점: 클래스 간 분산 행렬과 클래스 내부 분산 행렬을 생성한 뒤, 이 행렬에 기반해 고유벡터를 구하고 입력 데이터를 투영한다. (공분산 행렬x)

 

[LDA 수행 steps]

1. 클래스 내부와 클래스 간 분산 행렬 구하기. 이 두 개의 행렬은 입력 데이터의 결정 값 클래스별로 개별 피처의 평균 벡터를 기반으로 구함.

2. 클래스 내부 분산 행렬 SW, 클래스 간 분산 행렬을 SB라고 할 때 아래의 식으로 두 행렬을 고유벡터로 분해.

3. 고유값이 가장 큰 순으로 K개(LDA 변환 차수만큼) 추출.

4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환.

 

붓꽃 데이터 세트에 LDA 적용하기

- 사이킷런 LinearDiscriminantAnalysis 클래스

# 붓꽃 데이터 세트로 로드하고 표준 정규 분포로 스케일링함

LDA는 PCA와 다르게 지도학습임. 즉 클래스의 결정값이 변환 시에 필요함. fit() 메서드를 호출할 때 결정값을 입력함.

# LDA 변환된 입력 데이터 값을 2차원 평면에 시각화해보니 PCA로 변환된 데이터와 좌우 대칭 형태로 많이 닮아 있음


4. SVD(Singular Value Decomposition)

SVD(특이값 분해): PCA와 유사, 정방행렬 뿐 아니라 행과 열의 크기가 다른 행렬도 고유벡터로 분해할 수 있다. m*n 크기의 행렬 A를 다음과 같이 분해.

행렬 U와 V에 속한 벡터는 특이벡터(singular vector)이며, 모든 특이 벡터는 서로 직교하는 성질을 갖는다.

S(시그마)는 대각행렬이며, 행렬의 대각에 위치한 값(이 값만 0이 아니고 나머지 위치의 값은 모두 0) 행렬 A의 특이값이다.

https://velog.io/@mios_leo/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C-7.-Dimension-Reduction2-SVD-NMF

 

*Full SVD: A가 m*n일 때 -> U가 m*m, S가 m*n, V*가 n*n으로 분해.

*Compact SVD: S에서 비대각인 부분과 대각원소 중 특이값이 0인 부분 모두 제거하고 제거한 S에 대응되는 U와 V원소도 함께 제거해 차원을 줄인 상태로 SVD를 적용. 이때 행렬들의 차원: A가 m*n일 때 -> U가 m*p, S가 p*p, V*가 p*n으로 분해.

*Truncated SVD: S의 대각원소 중 상위 몇 개만 추출해서 여기에 대응하는 U와 V의 원소도 함께 제거해 더욱 차원을 줄인 형태로 분해.

 

SVD는 넘파이와 사이파이 라이브러리를 이용해 수행함.넘파이 SVD 실습, Truncated SVD(사이파이 모듈) 실습

 

사이킷런 TruncatedSVD 클래스를 이용한 변환

TruncatedSVD 클래스는 fit()과 transform()을 호출해 원본 데이터를 몇 개의 주요 컴포넌트(즉 K 컴포넌트 수)로 차원을 축소해 변환한다.

- 데이터 세트가 스케일링으로 데이터 중심이 동일해지면 사이킷런의 SVD와 PCA는 동일한 변환을 수행한다. 이는 PCA가 SVD 알고리즘으로 구현되었음을 의미한다. 하지만 PCA는 밀집 행렬에 대한 변환만 가능하며 SVD는 희소 행렬에 대한 변환도 가능하다.

- SVD는 컴퓨터 비전 영역에서 이미지 압축을 통한 패턴 인식과 신호 처리 분야에 사용되며, 텍스트 토픽 모델링 기법 LSA의 기반 알고리즘이다.


5. NMF(Non-Negative Martix Factorization)

NMF: Truncated SVD와 같이 낮은 랭크를 통한 행렬 근사(Low-Rank Approximation) 방식의 변형. 원본 행렬 내의 모든 원소 값이 모두 양수(0 이상)이라는 것이 보장되면 좀 더 간단하게 두 개의 양수 행렬로 분해될 수 있는 기법이다.

V ~~ W X H

- 사이킷런 NMF 클래스

- NMF는 SVD와 유사하게 차원 축소를 통해 잠재 요소를 도출할 수 있어 이미지 변환 및 압축(패턴인식), 텍스트의 토픽 모델링 기법, 문사 유사도 및 클러스터링에 잘 사용된다.

- 잠재 요소 기반의 추천 방식에 활발하게 쓰인다. (사용자가 평가하지 않은 상품에 대해 잠재적인 요소를 추출해 높은 순위로 예측된 상품을 추천)

 


6. 정리

차원 축소

- 많은 피처로 이뤄진 데이터 세트를 더욱 직관적으로 이해할 수 있음

- 데이터를 더 잘 설명하는 잠재적인 요소를 추출할 수 있음 (이미지, 텍스트에서 활발하게 사용됨)

  • PCA: 입력 데이터의 변동성이 가장 큰 축을 구하고(Principal Component), 다시 이 축에 직각인 축을 반복적으로 축소하려는 차원 개수만큼 구한 뒤 입력 데이터들을 이 축들에 투영해 차원을 축소.
    - 이를 위해 입력 데이터의 공분산 행렬을 기반으로 고유 벡터를 생성하고 이렇게 구한 고유 벡터에 입력 데이터를 선형 변환.
  • LDA: 입력 데이터의 결정 값 클래스를 최대한으로 분리할 수 있는 축을 찾는 방식으로 차원을 축소.
  • SVD, NMF: 매우 많은 피처 데이터를 가진 고차원 행렬을 두 개의 저차원 행렬로 분리하는 행렬 분해 기법.
    - 행렬 분해를 수행하면서 원본 행렬에서 잠재된 요소를 추출하기 때문에 토픽 모델링이나 추천 시스템에서 활발하게 사용됨.