[머신러닝]차원 축소

김태경 SMARCLE·2024년 11월 19일

머신러닝

목록 보기
8/9

핸즈온 297~322

아마 이번주, 다음주 못나올듯

차원 축소

데이터의 컬럼이나 특성이 많을 경우 오히려 좋은 결과를 내기 힘들면서, 연산도 느려짐. 이 문제를 해결하기 위해 우리가 캐글에서 한 것처럼 히트맵 그려서 유용한 것만 남기거나 하는 것.

이렇게 특성을 줄이는 걸 차원 축소라고 칭함.

데이터 시각화에도 유용하게 쓰이는데, 그래프를 보다 간결하고 요점만 보이게 그릴 수 있음. 보기도 편해지고, 군집 등을 파악하기에도 유리함.

투영

해당 차원에 대한 특정 평면(부분 공간이라고 함)을 기준으로 수직선을 내려버리는 것.
이러면 차원이 하나 줄어든다. ex)3D->2D

다만 스위스 롤 데이터셋처럼 데이터가 완전히 뭉개지는 경우도 있어 주의해야 한다.

매니폴드 학습

3D 이상의 데이터를 그 이하의 데이터가 해당 공간에 휘어지거나 뒤틀려 놓여있는 것으로 보는 방법.
예를 들어 스위스 롤 데이터셋의 경우 2D 매니폴드.

이걸 2D로 펴서 판단한다는 것이다.

단, 이 경우도 지도학습 모델에서의 결정 경계가 더 복잡하고 괴상하게 나오는 경우도 있다.

PCA

우리가 Fashion MNIST에서 썼던 그거.
데이터에 가장 가까운 초평면을 정의하고, 거기를 기준으로 투영시키는 방법.

분산 보존

투영 시, 데이터의 분산이 가능한 최대로 유지되는 초평면을 선택해야 한다.
분산이 유지되지 않는다면, 데이터가 뭉개져버린다는 뜻.

주성분

분산이 최대인 축을 찾고 나면, 여기에 대해 수직이면서 남은 분산을 가능한 보존하는 2번째 축을 찾는다.
이런 식으로 각 축에 수직하는 데이터의 차원 만큼의 축들을 찾는다.
예를 들어 스위스 롤 데이터셋이라면 3차원에 존재하는 2차원 데이터니까 2개.

여기서 n번째 축이 바로 이 데이터의 n번째 주성분이라고 칭해진다.
주성분의 경우 주로 특잇값 분해를 이용해서 찾게 된다.

투영 실행

이제 주성분 추출이 끝났으니 거기에 그대로 데이터를 투영하여 차원을 주성분 수의 차원으로 축소시킨다.

결과적으로, 데이터의 특징을 가능한 유지하면서도 차원이 줄어든 데이터를 반환받는다.

코드는 다음과 같다.

from sklearn.decomposition import PCA

X = 대충의 3차원 데이터
pca= PCA(n_components=2)
data2d = pca.fit.transform(X)

여기서 n_components는 줄이려는 목표 차원.

랜덤 PCA

svd_solver를 'randomized'로 설정한 경우.
줄이려는 차원 만큼의 주성분에 대한 근사값을 확률적 알고리즘을 이용해 빠르게 찾는다.

참고로 내부 시스템 상 svd_solver의 기본 값 중 하나인데, 정확히는 max(m, n)이 500 초과고 n_components가 min(m, n)의 80%보다 작을때 자동으로 랜덤 PCA로 실행된다.

랜덤 투영

랜덤 PCA보다 더 랜덤으로, 임의의 평면을 찾아 거기에 투영시키는 방법.
데이터가 이상해질 수도 있을 것 처럼 들리는 방식이지만, johnson_lindenstrauss_min_dim() 함수를 사용하면 랜덤하고 빠르면서도 꽤 괜찮은 결과물이 나온다.

LLE

일명 지역 선형 임베딩.
얘는 앞선 경우와 다르게 비선형 차원 축소 기술로, 매니폴드 기반으로 만들어준다.
원리는 KNN과 비슷.
특히나 잡음이 적고, 스위스 롤처럼 꼬인 메니폴드를 2d로 만들어주는데 유용하다.

MDS

다차원 스케일링.
샘플 간 거리를 보전하면서 차원을 축소하는 방법으로, 고차원 데이터에 특히 애용된다.

Isomap

각 샘플을 가장 가까운 이웃과 연결 후, 지오데식 거리를 유지하며 차원을 축소하는 방법.

t-SNE

비슷한 샘플들끼리 가까이 있도록 차원을 축소하는 방법. 시각화에 꽤나 유용하게 쓰인다.

LDA

선형 판별 분석. 클래스 사이를 가장 잘 구분하는 축을 찾아 초평면으로 쓰는 방법.
가능한 클래스들끼리 거리를 멀리 떨어지게 해 구분을 쉽게 해준다는 장점이 있다.

profile
네이버 블로그 업로드 전 개념정리용

0개의 댓글