PCA로 차원 축소

Python으로 배우는 Unsupervised Learning

Benjamin Wilson

Director of Research at lateral.io

차원 축소

  • 더 적은 특성으로 동일한 데이터를 표현합니다
  • 머신러닝 파이프라인의 중요한 단계입니다
  • PCA로 수행할 수 있습니다
Python으로 배우는 Unsupervised Learning

PCA로 차원 축소

  • PCA 특성은 분산 내림차순입니다
  • 분산이 낮은 특성은 "잡음"이라고 가정합니다
  • … 그리고 분산이 높은 특성은 정보성이 높다고 가정합니다

분산 대비 PCA 특성 번호 막대그래프, 1과 2 사이 수직선, 왼쪽 화살표는 informative, 오른쪽 화살표는 noisy로 표시

Python으로 배우는 Unsupervised Learning

PCA로 차원 축소

  • 유지할 특성 개수를 지정합니다
  • 예: PCA(n_components=2)
  • 처음 2개의 PCA 특성을 유지합니다
  • 고유 차원 선택이 좋습니다
Python으로 배우는 Unsupervised Learning

iris 데이터셋 차원 축소

  • samples = iris 측정 배열(특성 4개)
  • species = iris 품종 번호 목록
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca.fit(samples)
PCA(n_components=2)
transformed = pca.transform(samples)
print(transformed.shape)
(150, 2)
Python으로 배우는 Unsupervised Learning

2차원에서의 Iris 데이터셋

  • PCA로 차원을 2로 축소했습니다
  • 분산이 가장 큰 PCA 특성 2개를 유지했습니다
  • 핵심 정보 보존: 품종이 여전히 구분됩니다
import matplotlib.pyplot as plt
xs = transformed[:,0]
ys = transformed[:,1]
plt.scatter(xs, ys, c=species)
plt.show()

Iris 데이터셋에 PCA 적용한 산점도

Python으로 배우는 Unsupervised Learning

PCA로 차원 축소

  • 분산이 낮은 PCA 특성은 버립니다
  • 분산이 높은 특성이 정보성을 가진다고 가정합니다
  • 실제로 자주 성립합니다(예: iris)
Python으로 배우는 Unsupervised Learning

단어 빈도 배열

  • 행은 문서, 열은 단어를 나타냅니다
  • 각 항목은 문서별 단어 존재를 측정합니다
  • … 측정은 "tf-idf" 사용(뒤에서 설명)

단어 빈도 배열

Python으로 배우는 Unsupervised Learning

희소 배열과 csr_matrix

  • "희소": 대부분의 항목이 0입니다
  • NumPy 배열 대신 scipy.sparse.csr_matrix 사용 가능
  • csr_matrix는 0이 아닌 값만 저장합니다(공간 절약)

단어 빈도 배열

Python으로 배우는 Unsupervised Learning

TruncatedSVD와 csr_matrix

  • scikit-learn의 PCAcsr_matrix를 지원하지 않습니다
  • 대신 scikit-learn의 TruncatedSVD를 사용하세요
  • 동일한 변환을 수행합니다
from sklearn.decomposition import TruncatedSVD
model = TruncatedSVD(n_components=3)
model.fit(documents)  # documents is csr_matrix
transformed = model.transform(documents)
Python으로 배우는 Unsupervised Learning

연습해 봅시다!

Python으로 배우는 Unsupervised Learning

Preparing Video For Download...