티스토리 뷰
현실의 대부분의 데이터들은 특성을 적게는 수백 개에서 많게는 수백만 개를 가지고 있다. 특히 만약 데이터가 이미지라면 샘플 하나 당 가지고 있는 특성의 수는 이미지의 크기에 따라 기하급수적으로 늘어난다. 예를 들어 28 * 28 해상도의 저해상도 이미지만 해도 28 * 28 = 784개의 특성을 가지고 있다. 128 * 128 해상도의 이미지라면 총 16384개의 특성을 가지게 된다.
이렇게 수많은 수의 특성을 가지고 있는 데이터는 모델로 하여금 학습을 어렵게한다. 또한 샘플 하나 당 연산량이 많아 학습 속도도 느려지게 된다.
차원 축소
그렇다면 이 문제를 어떻게 해결할까? 방법은 여러가지가 존재하나 대표적으로 차원 축소() 알고리즘을 사용해 해결한다. 여기서 말하는 차원은 특성과 같다. 즉 특성의 수를 줄이는 것이다. 특성의 수를 줄이는 방법은 차원 축소 알고리즘 마다 다르다. 대표적으로 투영(Projection)개념이 사용된다.
투영
투영은 전체 특성 중 일부 특성이 강하게 연관되어있다는 가정하에 이루어진다. 때문에 고차원 공간의 데이터 셋을 저차원 공간으로 투영시켜도 원 데이터의 큰 손실없이 차원을 줄이는 결과를 얻을 수 있다.
예를 들어 위의 MNIST 데이터의 샘플을 보면, 주변부의 픽셀들은 대부분 흰색으로, 숫자를 나타내는 중앙 부근의 픽셀들은 검은색이다. 즉 주변부의 의미없는 픽셀들을 제거해도 본 샘플의 손실이 적다.
PCA
차원 축소에 투영 개념을 적용하는 대표적인 알고리즘으로 주성분분석(PCA)가 있다. 여기서 주성분은 원래 데이터에서 중요한 특성들을 선택해 벡터로 표현된다. 원래 데이터의 분산을 가장 크게 보존하는 벡터가 첫번째 주성분, 두번째로 크게 보존하는 벡터가 두번째 주성분이 된다. 784 차원의 데이터를 150 차원으로 축소하면 주성분의 수는 50이 된다. 주성분은 고유값 분해(SVD)를 통해 찾을 수 있다.
먼저, 데이터 행렬 X를 세 개의 행렬 곱셈으로 분해한다.
여기서 V가 주성분의 단위 벡터가 된다. 이후 주성분 벡터에 데이터 행렬 X를 행렬 곱셈하면 축소된 데이터를 얻는다.
코드로 설명하면,
평균이 0인 데이터 셋(PCA 알고리즘의 가정)에 넘파이의 svd()로 고유값 분해해 2개의 주성분 벡터를 구하고
이를 데이터 셋에 곱하면 2차원으로 축소된 데이터 셋을 얻는다.
3차원의 데이터 셋(X_centered)이 2차원 데이터 셋(X2D)으로 축소된 결과
사이킷런을 사용하면 아래와 같다.
설명된 분산의 비율(Explained variance ratio)
원래 데이터의 분산에 대한 각 주성분의 분산 비율을 “설명된 분산의 비율”이라 하는데, explained_variance_ratio_ 변수를 통해 각각의 비율을 확인할 수 있다. 축소할 차원 수는 임의로 정하는 것보다 충분한 분산(예를 들어 95%)이 될 때까지 더해야할 차원 수를 선택하는 것이 간단하다. 사이킷런에서는 간단하게 아래와 같이 보존하려는 분산의 비율을 매개변수로 지정하면 된다.
위의 코드에서, n_components로 0~1 까지의 수로 분산의 비율을 지정하거나 1 이상의 수를 지정하면 그 만큼의 차원으로 축소된다.
랜덤 PCA(Randomized PCA)
사이킷런은 랜덤 PCA라 부르는 확률적 알고리즘을 사용해 첫 d개의 주성분에 대한 근삿값을 찾는 메서드를 제공한다. pca 메서드의 svd_solver로 randomized를 지정하면 된다. 기본 값은 auto인데, 샘플의 수 혹은 특성의 수가 500보다 크거나 지정한 차원의 수가 샘플의 수 혹은 특성의 수의 80%보다 작다면 자동으로 svd_solver로 randomized를 지정한다.
*랜덤 PCA를 사용할 때는 n_components는 1에서 샘플의 수와 특성의 수 중 작은 것 사이가 되어야 한다. 예) 샘플의 수 60, 특성의 수 3일때 n_components는 1에서 3사이로 지정해야함.
그 외 다양한 차원 축소 알고리즘이 존재한다. 각 차원 축소 알고리즘으로 스위스 롤 데이터 셋을 시각화해본다.
먼저 데이터 셋을 불러온다.
다차원 스케일링(Multidimensional scaling)
샘플 간 거리를 보존하며 차원을 축소한다.
Isomap
각 샘플을 가장 가까운 이웃과 연결하는 식으로 그래프를 만들고, 지오데식 거리를 유지하며 차원을 축소한다.
t-SNE(t-distributed stochastic neighbor embedding)
비슷한 샘플은 가까이, 그렇지 않은 샘플은 멀리 유지하며 차원을 축소한다. 주로 고차원 공간에 있는 샘플의 군집을 시각화할 때 이용된다.
'Machine Learning' 카테고리의 다른 글
핸즈온 머신러닝 ㅡ 비지도 학습, Unsupervised learning (0) | 2020.12.21 |
---|---|
핸즈온 머신러닝 ㅡ 머신러닝 파이프라인 구축 (0) | 2020.12.20 |
핸즈온 머신러닝 ㅡ 학습 곡선, Learning curve (0) | 2020.12.18 |
핸즈온 머신러닝 ㅡ 다항 회귀, Polynomial regression (0) | 2020.12.18 |
핸즈온 머신러닝 ㅡ 앙상블 방법, Ensemble method (0) | 2020.12.18 |