주성분 분석(PCA)이란?
오늘은 가장 인기있는 차원 축소 알고리즘인 주성분 분석(Principle Component Analysis, PCA)에 대해서 알아봅시다.
차원의 저주란?
많은 경우 머신러닝 문제는 훈련 샘플이 각각 수천, 혹은 수백만개의 특성을 가지고 있습니다. 이렇게 특성들이 많을 경우, 유의미한 특성들을 찾기가 어려울 뿐더러 훈련을 느리게 해 결과적으로 성능 저하를 일으키는 원인이 됩니다. 이런 문제를 "차원의 저주"(curse of dimensionality)라고 합니다.
이런 경우에는 당연하게도 차원을 줄여줘야 하는데, PCA는 그 중에서도 가장 많이 사용되는 차원 축소 알고리즘입니다. PCA에 대해서 자세히 알아봅시다!
PCA (Principle Component Analysis), 주성분 분석
PCA는 말 그대로 '주' 성분을 분석하는 것입니다.
분산을 보존하자!
저차원의 초평면에 투영을 하게 되면 차원이 줄어들게 됩니다. 그럼 어떤 초평면을 선택하면 좋을까요?

위와 같은 예시를 살펴봅시다. 간단한 2D 데이터셋이 있을 때, 세개의 축을 우리의 초평면 후보로 둡시다. 여기에서 볼 수 있는 것은 실선을 선택하는 방법이 분산을 최대로 보존하는 것이고, c2의 점선을 선택하는 것이 분산을 적게 만들어버리는 방법입니다.
다른 방향으로 투영하는 것 보다 분산을 최대로 보존할 수 있는 축을 선택하는 것이 정보를 가장 적게 손실할 수 있다고 생각할 수 있습니다. 분산이 커야 데이터들사이의 차이점이 명확해질테고, 그것이 우리의 모델을 더욱 좋은 방향으로 만들 수 있을 것이기 때문입니다.

그래서 PCA에서는 분산이 최대인 축을 찾고, 이 첫번째 축에 직교하고 남은 분산을 최대한 보존하는 두번째 축을 찾습니다. 2D 예제에서는 선택의 여지가 없지만, 고차원의 데이터셋이라면 여러 방향의 직교하는 축을 찾을 수 있을 것입니다.
이렇게 i번째 축을 정의하는 단위 벡터를 i번째 주성분(principal component, PC)라고 합니다. 위 예제에서는 첫번째 PC는 c1이고, 두번째 PC는 c2입니다.
주성분을 찾는 법
특잇값 분해(Singular Value Decomposition, SVD)이라는 표준 행렬 분해 기술을 이용해 훈련 세트 행렬 X를 3개의 행렬의 점곱인 U⋅∑⋅VT로 분해할 수 있습니다. 여기서 우리가 찾고자하는 모든 주성분은 V에 담겨있습니다.
아래 파이썬 코드는 넘파잉의 svd()
함수를 사용하여 훈련 세트의 모든 주성분을 구한 후 처음 두개의 PC를 추출하는 코드입니다.
X_centered = X - X.mean(axis=0) U, s, Vt = np.linalg.svd(X_centered) c1 = Vt.T[:, 0] c2 = Vt.T[:, 1]
d차원으로 투영하기
주성분을 모두 추출했다면 처음 d개의 주성분으로 정의한 초평면에 투영하여 데이터셋의 차원을 d차원으로 축소할 수 있습니다. 이 초평면은 분산을 가능한 최대로 보존한 투영입니다.
초평면에 훈련 세트를 투영하기 위해서는 행렬 X와 첫 d개의 주성분을 담은(즉, V의 첫 d열로 구성된) 행렬 Wd를 점곱하면 됩니다.
Xd−proj=X⋅Wd
아래 파이썬 코드는 첫 두개의 주성분으로 정의된 평면에 훈련 세트를 투영합니다.
W2 = Vt.T[:, :2] X2D = X_centered.dot(W2)
여기까지 하면 PCA 변환이 완료되었습니다!
더 쉽게 PCA를 하는 방법 - 사이킷런 이용하기
사이킷런의 PCA 모델은 앞서 한 것처럼 SVD 분해 방법을 사용하여 구현합니다. 사이킷런의 PCA모댈은 자동으로 데이터를 중앙에 맞춰줘서 별도의 가공 없이 바로 사용할 수 있습니다.
from sklearn.decomposition import PCA pca = PCA(n_components = 2) X2D = pca.fit_transform(X)
'머신러닝 꿈나무 > 기본 개념' 카테고리의 다른 글
토큰화(tokenize)란? (0) | 2022.02.17 |
---|---|
[pyspark/빅데이터기초] Parquet(파케이) 파일 형식이란? (0) | 2021.11.17 |
[빅데이터기초] 스파크란? (0) | 2021.11.13 |
켄달타우란? - 비모수적 상관계수에 대해서 (0) | 2021.05.24 |
맥북에서 딥러닝 개발환경 구축하기 - 아나콘다, oh-my-zsh, iterm2, jupyter lab 테마 설정하기 (0) | 2021.01.13 |
댓글
이 글 공유하기
다른 글
-
[pyspark/빅데이터기초] Parquet(파케이) 파일 형식이란?
[pyspark/빅데이터기초] Parquet(파케이) 파일 형식이란?
2021.11.17파케이(parquet)이란 하둡에서 칼럼방식으로 저장하는 저장 포맷을 말합니다. 파케이는 프로그래밍 언어, 데이터 모델 혹은 데이터 처리 엔진과 독립적으로 엔진과 하둡 생태계에 속한 프로젝트에서 칼럼 방식으로 데이터를 효율적으로 저장하여 처리 성능을 비약적으로 향상시킬 수 있습니다. 열(Column)기반 압축을 하고있는데 이는 칼럼의 데이터가 연속된 구조로 저장되어 있다. Row 중심으로 저장되어있는 것과는 아래 사진을 보면 이해가 빠를 것 같습니다. 열을 기반으로 데이터를 처리하면 행 기반으로 압축했을때에 비해 데이터의 압축률이 더 높고, 필요한 열의 데이터만 읽어서 처리하는 것이 가능하기 때문에 데이터 처리에 들어가는 지원을 절약할 수 있습니다. 파케이는 하둡 에코시스템 안에서 언제든지 사용 가능한 … -
[빅데이터기초] 스파크란?
[빅데이터기초] 스파크란?
2021.11.13스파크란? 아파치 스파크는 마태자하리아가 UC 버클리에서 박사과정 논문의 일부로 개발한 강력한 오픈소스 처리 엔진입니다. 스파크는 오픈소스 분산 쿼리 및 처리 엔진으로, 유연성과 맵리듀스에 대한 확장성을 훨씬 빠른 속도로 제공하고 있습니다. 데이터가 메모리에 저장되어있을 경우에는 하둡보다 100배 빠르며, 디스크에 저장되어 있을 때에는 10배 빠릅니다. 스파크는 데이터를 읽고, 변형하고, 합계를 낼 수 있으며 복잡한 통계 모델들을 쉽게 학습하고 배포할 수 있다는 특징이 있습니다. 스파크 API는 자바, 스칼라, 파이썬, R, SQL을 이용해 접근할 수 있습니다. 어플리케이션을 빌드하는데 쓰일수도 있고, 여러 어플리케이션을 라이브러리로 묶어서 클러스터에 배포할수도 있으며, 파이썬 노트북을 통해 대화식으로 … -
켄달타우란? - 비모수적 상관계수에 대해서
켄달타우란? - 비모수적 상관계수에 대해서
2021.05.24켄달타우란? 순위 상관계수의 한 종류입니다. 두 변수들 간의 순위를 비교하여 연관성을 계산합니다. c.f > 상관계수 vs. 결정 계수 - 상관 계수 : 두 변수 간에 관계가 있는지만 확인 - 결정 계수 : 두 변수 간의 인과관계를 파악. 즉, 한 변수가 다른 변수에 영향을 미치는 지 확인 따라서 원인과 결과를 판단하기 위해서는 결정 계수를 사용하는 회귀 분석을 수행해야 합니다. 상관 계수의 해석 상관계수는 1에 가까울수록 양의 상관관계가 강하고 -1에 가까울수록 음의 상관 관계, 그리고 0에 가까울수록 상관관계가 없습니다. 상관계수는 이상치의 유무에 따라 값의 영향이 크니 이상치 처리가 중요합니다. 모수적 방법과 비모수적 방법 모수적 방법 (Parametic method) : 모수를 특정 분포로 가정하… -
맥북에서 딥러닝 개발환경 구축하기 - 아나콘다, oh-my-zsh, iterm2, jupyter lab 테마 설정하기
맥북에서 딥러닝 개발환경 구축하기 - 아나콘다, oh-my-zsh, iterm2, jupyter lab 테마 설정하기
2021.01.13
댓글을 사용할 수 없습니다.