[머신러닝 완벽가이드] Chap.6 차원 축소

Elin·2021년 7월 12일
0
post-thumbnail

6.1 차원 축소 개요

개념

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

  • 피처가 많을 경우, 희소한 구조를 가지고 예측 신뢰도가 감소. 개별 피처별 상관관계가 높아 다중 공선성 문제로 예측 성능 저하 우려.
  • 차원 축소를 하면 더 직관적인 데이터 해석과 시각적 표현, 학습에 필요한 처리 능력 줄이기 가능

종류

  • 피처 선택(=특성 선택): 특정 피처에 종속성이 강한 불필요한 피처는 제거, 데이터의 특징을 잘 나타내는 주요 피처만 선택.
  • 피처 추출(=특성 추출): 기존 피처를 저차원의 중요 피처러 압축하여 추출
    • 피처를 함축적으로 더 잘 설명할 수 있는 또 다른 공간으로 매핑해 추출
    • 모의고사 성적, 종합 내신성적, 수능 성적, 대외활동, 수상경력 => 학업 성취도, 커뮤니케이션 능력, 문제 해결력으로 압축
      => 잠재적인 요소 추출
  • 단순한 압축이 아닌, 잠재적 요소를 추출하는 데에 의미가 있음
  • 이미지나 텍스트에서 많이 사용되는 알고리즘

6.2 PCA(Principal Component Analysis)

: 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분을 추출해 차원을 축소하는 기법

  • 기존 데이터의 정보 유실 최소화를 위해 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 차원 축소(분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주)
    pca

  • 첫 번째는 데이터 변동성이 가장 큰 축, 두 번째는 첫 번째 축과의 직교 벡터를 축으로 함.

선형 대수의 관점

: 입력 데이터의 공분산 행렬을 고유값 분해하고, 고유 벡터에 입력 데이터를 선형 변환하는 것.

  • 고유값: 고유 벡터의 크기, 입력데이터의 분산
  • 고유 벡터: PCA의 주성분 벡터, 입력 데이터의 분산이 큰 방향. 행렬을 곱핟더라도 방향이 변하지 않고 크기만 변함.
  • 선형 변환: 특정 벡터에 행렬을 곱해 새로운 벡터로 변환하는 것(=특정 벡터를 다른 공간으로 투영하는 개념)
  • 공분산 행렬: 공분산=두 변수 간의 변동, 정방행렬, 대칭 행렬(고유 벡터를 직교행렬로, 고유값을 정방 행렬로 대각화 가능)
    공분산 행렬
    공분산 C = 고유벡터 직교 행렬 x 고유값 정방 행렬 x 고유벡터 직교 행렬의 전치행렬
    • e1: 가장 분산이 큰 방향을 가진 고유벡터
    • e2: e1에 수직이면서 다음으로 가장 분산이 큰 방향을 가진 고유벡터

수행 과정

Step 1: 입력 데이터 세트의 공분산 행렬 생성
Step 2: 공분산 행렬의 고유벡터와 고유값 게산
Step 3: 고유값이 가장 큰 순으로 K개(PCA 변환 차수)만큼 고유 벡터 추출
Step 4: 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터 변환

PCA()

  • n_components: PCA로 변환할 차원의 수
  • .explainedvariance_ratio: 개별 컴포넌트가 차지하는 변동성 비율
from sklearn.decomposition import PCA

pca = PCA(n_components=2)

#fit( )과 transform( ) 을 호출하여 PCA 변환 데이터 반환
pca.fit(iris_scaled)
iris_pca = pca.transform(iris_scaled)
print(iris_pca.shape)

print(pca.explained_variance_ratio_)

oca 결과

** 원본 데이터 세트 대비 PCA 변환된 데이터 세트의 예측 정확도는 떨어질 수밖에 없음.

신용카드 고객 데이터

@

LDA(Linear Discriminant Analysis)

: 선형 판별 분석법. 지도학습의 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 잇는 기준을 최대한 유지하면서 차원을 축소하는 방법.

  • 입력 데이터의 결정값 클래스를 최대한으로 분리할 수 있는 축을 찾음
  • 클래스 간 분산과 클래스 내부 분산의 비율을 최대화하여 클래스 분리를 최대화하는 축을 찾음(클래스 간 분산 최대화, 클래스 내부의 분산 최소화)
  • PCA에서는 공분산 행렬을 사용하는 반면, LDA는 클래스 간 분산과 클래스 내부 분산 행렬을 생성, 이 행렬에 기반해 고유벡터를 구하고 입력 데이터를 투영

수행 과정

Step 1: 클래스 내부와 클래스 간 분산 행렬을 구함(입력 데이터의 결정값 클래스별로 개별 피처의 평균 벡터를 기반으로)
Step 2: Sw(클래스 내부 분산 행렬), Su(클래스 간 분산 행렬)을 고유 벡터로 분해

lda 행렬분해

Step 3: 고유값이 가장 큰 순으로 K개(LDA 변환 차수)만큼 추출
Step 4: 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 입력 데이터 변환

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_scaled, iris.target)
iris_lda = lda.transform(iris_scaled)

lda_ex

6.4 SVD(Singular Value Decomposition)

SVD

: 특이값 분해. m x n 크기의 행렬 A를 다음과 같이 분해하는 것.

svd

  • 특이 벡터(Singular vector): U(m x m), V(n x n) 안의 벡터, 모두 서로 직교
  • Σ(m x n): 대각행렬, 대각원소를 제외한 나머지 값 = 0인 행렬
  • 특이값: Σ의 대각에 위치한 값

svd2

  • 일반적으로 Σ의 비대각인 부분, 대각 원소 중에 특이값이 0인 부분을 모두 제거하고, 제거된 Σ에 해당하는 U, V의 원소도 제거해 차원을 줄인 형태로 적용 (m x p, p x p, p x n)

  • 분해한 행렬을 다시 내적하여 곱하면 원본 행렬로 완벽 복원 가능

  • scipy.linalg.svd 이용

from numpy.linalg import sv

U, Sigma, Vt = svd(a)

ex. 개별 로우끼리 관계 없는 경우

1

ex. 개별 로우끼리 의존하는 경우
3번째 = 1번째 + 2번째
4번째 = 번째

2

선형 독립인 로우 벡터의 개수가 2개임 => Sigma Value 0이 2개(행렬의 rank = 2)

Truncated SVD

: Σ의 대각 원소 중에 상위 몇 개만 추출해서 이에 대응하는 U, V의 원소도 제거해 차원을 줄인 형태로 분해

  • 원본 행렬을 정확하게 복원 불가능, but 근사 가능 (원래 차원의 차수에 가깝게 잘라낼수록(truncate) 원본 행렬에 더 가깝게 복원 가능)
  • scipy.sparse.linalg.svds 이용
from scipy.sparse.linalg import svds
from scipy.linalg import svd

# 행렬의 특이값 = 4
num_components = 4
U_tr, Sigma_tr, Vt_tr = svds(matrix, k=num_components)

TruncatedSVD()

: 분해 행렬을 반환하지는 않지만, fit(), transfomr()을 호출하여 원본 데이터의 차원을 축소해 변환함

from sklearn.decomposition import TruncatedSVD

# 2개의 주요 component로 TruncatedSVD 변환
tsvd = TruncatedSVD(n_components=2)
tsvd.fit(iris_ftrs)
iris_tsvd = tsvd.transform(iris_ftrs)

plt.scatter(x=iris_tsvd[:,0], y= iris_tsvd[:,1], c= iris.target)

svd_ex

** 데이터 세트가 스케일링으로 데이터 중심이 동일해지면 사이킷런의 SVD와 PCA는 동일한 변환을 수행함. (=PCA가 SVD 알고리즘으로 구현되었음)
But, PCA는 밀집 행렬에 대한 변환만 가능한 반면, SVD는 희소 행렬(행렬값 대부분이 0인 행렬)에 대한 변환도 가능

6.5 NMF(Non-Negative Matrix Factorization)

  • 낮은 랭크를 통한 행렬 근사 방식의 변형
  • 원본 행렬 내의 모든 원소 값이 모두 양수이면 두 개의 양수 행렬로 분해될 수 있는 기법

nmf

  • 행렬 분해를 하면 일반적으로 길고 가는 행렬 W, 작고 넓은 행렬 H로 분해됨. 이러한 행렬은 잠재 요소를 특성으로 가짐.
  • W: 원본 행에 대해서 잠재 요소의 값이 얼마나 되는지
    H: 잠재 요소가 원본 열(원본 속성)로 어떻게 구성되었는지
  • 이미지 변환 및 압축, 텍스트의 토픽 도출 등에 사용
  • NMF() 이용
from sklearn.decomposition import NMF

nmf = NMF(n_components=2)
nmf.fit(iris_ftrs)
iris_nmf = nmf.transform(iris_ftrs)

plt.scatter(x=iris_nmf[:,0], y= iris_nmf[:,1], c= iris.target)

nmf_ex

profile
Data Analyst | Statistics

1개의 댓글

comment-user-thumbnail
2021년 7월 14일

<PCA와 LDA의 비교>
PCA는 변동성을 기준으로 차원 축소
LDA는 클래스를 유지하는 방향으로 차원 축소

답글 달기