핸즈 온 머신러닝 (Hands-On Machine Learning with Scikit-Learn & TensorFlow) / 오렐리앙 제론 지음 , 박해선 옮김
을 읽고, 추후 기억을 되살릴 수 있게끔 나만의 방법으로 내용을 리뷰한다. 따라서 리뷰의 내용 별 비중이 주관적일 수 있다.
챕터 8. 차원 축소
많은 경우 머신러닝 문제는 훈련 샘플 각각이 수백만개의 특성을 가지고 있는데, 이는 훈련을 느리게 하며 성능을 좋지 않게 만든다. 이를 curse of dimensionality 라고 한다. 예를 들어 MNIST 이미지에서는 이미지 경계에 주로 흰색 픽셀이 있으므로 완전히 제거해도 많은 정보를 잃지 않는다. 또한 인접한 픽셀을 합치는 과정을 진행해도 많은 정보를 잃지 않는다. 차원을 축소시키면 일부 정보가 유실되어 훈련 속도가 빨라질 수는 있지만 성능이 조금 나빠질 수 있다. 하지만 어떤 경우에는 잡음이나 불필요한 세부사항을 걸러내 성능이 좋아지기도 한다.
8.1 차원의 저주
2차원에서 무작위 점을 선택한다면 경계선에서 0.001 이내에 위치할 가능성은 0.4%이지만, 10000차원이라면 이 가능성이 99.999999%보다 크다. 따라서 대다수의 점은 경계와 매우 가까이 있다. 또한 임의의 두 점 사이의 거리는 2차원에서 평균 0.52가 되지만 1000000차원에서는 평균 428.25가 된다. 즉, 고차원의 데이터셋은 매우 희박한 상태이며 차원의 저주를 해결하려면 데이터셋을 늘리면 되지만 기하급수적으로 필요량이 많아지므로 차원을 축소해야한다.
8.2 차원 축소를 위한 접근 방법
8.2.1 투영
많은 경우 특성들이 강하게 연결되어있어, 훈련 샘플이 저차원 subspace에 놓여있다. 이 경우 훈련 샘플들을 잘 투영하여 저차원으로 만드는 것이 좋다.
하지만 어떤 경우 데이터가 Swiss roll 처럼 생겨 공간이 뒤틀려있는데, 이런 경우에는 투영하면 더 구분하기 어려워진다.
8.2.2 매니폴드 학습
스위스 롤은 2D 매니폴드의 한 예시이다. 많은 차원 축소 알고리즘이 훈련 샘플이 놓여있는 manifold를 모델링 하는 식으로 작동하며 이를 manifold learning이라고 한다. 예를 들어 MNIST 데이터에서 무작위로 점을 찍은 이미지는 숫자로 보이지 않을 것이며 아주 일부만 숫자로 보일텐데, 숫자 이미지의 자유도는 랜덤 이미지의 자유도보다 훨씬 낮다는 뜻이다. 따라서 manifold assumption을 도입하여 저차원의 manifold로 압축한다. 하지만 경우에 따라 매니폴드를 펴기 전이 더 간단한 결정 경계를 가질 수도 있다.
8.3 PCA
주성분 분석은 가장 인기 있는 차원 축소 알고리즘이다. hyperplane을 찾아 데이터를 투영시키는 방법이다.
8.3.1 분산 보존
데이터를 투영할 hyperplane을 찾을 때에, 투영된 데이터들 간의 거리가 멀 수록 좋다. 즉 분산을 최대화 하는 hyperplane을 찾아야 한다.
8.3.2 주성분
여러 개의 축을 찾을 때에, 우선 분산을 최대화 하는 첫 번째 축을 찾는다. 이후 첫 번째 축에 직교하고 남은 분산을 최대한 보존하는 두 번째 축을 찾는다. 이렇게 i개의 축을 찾는다. i번째 축을 정의하는 단위 벡터를 i번째 주성분 (PC) 라고 부른다.
분산을 최대화 하는 주성분을 찾을 때에는 행렬의 SVD 분해를 사용한다. X = U Sigma V^t 일 때, V의 행들이 주성분이다. numpy의 svd() 함수를 사용하면 된다.
8.3.3 d차원으로 투영하기
주성분을 모두 추출하였다면 이 중 최초 d개의 주성분(고윳값이 큰 순서)을 뽑아 데이터를 d차원으로 축소시킨다. 원래 데이터를 주성분들에 내적하면 데이터 변환이 완료된다.
8.3.4 사이킷런 사용하기
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
위 함수를 사용하여 간단하게 PCA 변환할 수 있다. components_ 변수를 사용하면 주성분을 확인할 수 있다.
8.3.5 설명된 분산의 비율
explaned_variance_ratio_ 변수에 저장된 주성분의 explaned variance ratio를 확인할 수 있다. 각각의 값은 해당 축이 데이터를 얼마나 설명해주는지 알려준다.
8.3.6 적절한 차원 수 선택하기
축소할 차원 수를 정하는 방법으로는, 설명된 분산의 합이 일정 수치(95% 등)이 될 때 까지 더하는 것이다. 데이터 시각화를 위한 축소에는 2개나 3개를 사용하는 것이 좋다. PCA의 n_components를 비율로 설정 할 수 있다.
8.3.7 압축을 위한 PCA
실제로 MNIST 데이터를 784개의 축에서 154개의 축으로 변환하면 눈으로 구분할 수 있다. 이를 역변환할 수 있지만, 100%의 데이터를 복구할 수는 없다. 재구성된 데이터와 실제 데이터 사이의 평균 제곱 거리를 reconstruction error라고 한다.
8.3.8 점진적 PCA
훈련 데이터 전체를 메모리에 올리지 않고 사용가능한 Incremental PCA 알고리즘이 있다.
https://scikit-learn.org/stable/auto_examples/decomposition/plot_incremental_pca.html
혹은 넘파이의 memmap 파이썬 클래스를 이용해 디스크의 데이터를 메모리에 올린 것 처럼 사용하여도 된다.
8.3.9 랜덤 PCA
PCA의 svd_solver를 "randomized" 로 지정하면 랜덤 PCA 알고리즘을 사용한다. 이는 확률적으로 첫 d개의 주성분에 대한 근삿값을 빠르게 찾는다. 계산 복잡도는 O(m n^2) + O(n^3) 에서 O(m d^2) + O(d^3) 이 된다.
8.4 커널 PCA
차원 축소 과정에서 선형 투영이 아닌 비선형에 대해 진행하는 것을 kernel PCA라고 한다.
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html
8.4.1 커널 선택과 하이퍼파라미터 튜닝
kPCA 중 좋은 커널과 하이퍼파라미터를 선택하기 위하여, 여러 값들에 대해서 분류를 해보고, 이를 파이프라인으로 만들어 GridSearchCV를 해보는 것이 좋다. 가장 낮은 재구성 오차를 만드는 커널과 하이퍼파라미터를 선택하는 방법도 있지만 재구성이 쉽지 않다. 재구성을 하는 방법 중 하나는 투영된 샘플을 훈련 세트로, 원본 샘플을 타깃으로하는 지도 학습을 진행하는 것이다. fit_inverse_transform = True로 지정하면 자동으로 수행한다.
8.5 LLE
지역 선형 임베딩 (Locally Linear Embedding)은 또 다른 비선형 차원 축소 기술이다. 각 훈련 샘플이 가장 가까운 이웃에 얼마나 선형적으로 연관되어있는지 측정하여 이 관계가 가장 잘 보존되는 저차원 표현을 찾는 것이다.
https://scikit-learn.org/stable/modules/generated/sklearn.manifold.LocallyLinearEmbedding.html
LLE는 크게 두 과정으로 이루어져 있다. 각 알고리즘이 훈련 샘플에 대해 가까운 k개의 샘플을 찾아 선형함수로 원 샘플을 재구성한다. 이 선형함수를 적용하여 오차가 최소가 되는 저차원 벡터들을 찾는다.
8.6 다른 차원 축소 기법
그 외에도 Multidimensional Scaling, Isomap, t-SNE, Linear Discriminant Analysis 방법 등이 있다.
'개발 인생 > ML' 카테고리의 다른 글
핸즈 온 머신러닝 :: 10. 인공 신경망 소개 (0) | 2020.01.19 |
---|---|
핸즈 온 머신러닝 :: 9. 텐서플로 시작하기 (0) | 2020.01.18 |
핸즈 온 머신러닝 :: 7. 앙상블 학습과 랜덤 포레스트 (0) | 2020.01.17 |
핸즈 온 머신러닝 :: 6. 결정 트리 (0) | 2020.01.17 |
핸즈 온 머신러닝 :: 5. 서포트 벡터 머신 (0) | 2020.01.16 |