[빅데이터 직무연구회] 5회차 모임 정리
모임 요일 : 5월 17일 목요일 저녁 6시
Chapter 3. 비지도 학습과 데이터 전처리
비지도 학습 : 알고 있는 출력값이나 정보 없이 학습 알고리즘을 가르쳐야 하는 모든 종류의 머신러닝
3.1 비지도 학습의 종류
이번 장에서 배울 것
- 비지도 변환(unsupervised transformation)
- 군집(clustering)
비지도 변환 : 데이터를 새롭게 표현하여 사람이나 다른 머신러닝 알고리즘이 원래 데이터보다 쉽게 해석할 수 있도록 만드는 알고리즘. 데이터를 구성하는 단위나 성분을 찾기도 한다.
비지도 변환 예 : 차원 축소
차원 축소(dimensionality reduction) : 특성이 많은 고차원 데이터를 특성의 수를 줄이면서 꼭 필요한 특징을 포함한 데이터로 표현하는 방법
차원 축소의 예 : 시각화를 위해 데이터셋을 2차원으로 변경, 텍스트 문서에서 주제를 추출
군집 알고리즘 : 데이터를 비슷한 것끼리 그룹으로 묶는 것
3.2 비지도 학습의 도전 과제
뭔가 유용한 것을 학습했는지 평가하는 것이 가장 어려운 일이다. 보통 레이블이 없는 데이터에 적용하기 때문에 무엇이 올바른 출력인지 모른다.
따라서 데이터 과학자는 데이터를 더 잘 이해하고 싶을 때 탐색적 분석 단계에서 많이 사용한다. 또는 지도 학습의 전처리 단계에서 많이 이용한다. 비지도 학습의 결과로 새롭게 표현된 데이터를 사용해 학습하면 지도 학습의 정확도가 좋아진다. 그리고 메모리와 시간을 절약할 수 있다.
3.3 데이터 전처리와 스케일 조정
3.3.1 여러가지 전처리 방법
데이터를 기준이 되는 범위로 변환하는 네 가지 scikit-learn의 방법은 다음과 같다.
- StandardScaler
- 각 특성의 평균을 0, 분산을 1로 변경하여 모든 특성이 같은 크기를 가지게 한다.
- 최솟값과 최댓값 크기를 제한하지 않는다.
- RobustScaler
- 특성들이 같은 스케일을 갖는다.
- 평균과 분산 대신 중간 값(median)과 사분위 값(quartile)을 사용한다.
- 전체 데이터와 아주 동떨어진 데이터 포인트(이상치(outlier))에 영향을 받지 않는다.
- MinMaxScaler
- 모든 특성이 정확하게 0과 1 사이에 위치하도록 데이터를 변경한다.
- 2차원 데이터셋일경우 0<=x<=1, 0<=y<=1 인 사각 영역에 담기게 된다.
- Normalizer
- 특성 벡터의 유클리디안 길이가 1이 되도록 데이터 포인트를 조정한다.
- 지름이 1인 원(3차원일 땐 구)에 데이터 포인트를 투영
- 각 데이터 포인트가 다른 비율로(길이에 반비례하여) 스케일이 조정
- 특성 벡터의 길이는 상관치 않고 데이터의 방향(또는 각도)만이 중요할 때 많이 사용
3.4 차원 축소, 특성 추출, 매니폴드 학습
비지도 학습을 사용해 데이터를 변환하는 이유는 여러가지다.
일반적으로, 시각화하거나, 데이터를 압축하거나, 추가적인 처리(지도 학습에 사용할)를 위해 정보가 더 잘 드러나는 표현을 찾기 위해서다. 주로 사용하는 알고리즘은 다음과 같다.
- 주성분 분석(principal component analysis, PCA) : 가장 간단하고 흔히 사용하는 알고리즘
- 비음수 행렬 분해(non-negative matrix factorization, NMF) : 특성 추출에 널리 사용
- t-SNE(t-distributed stochastic neighbor embedding) : 2차원 산점도를 이용해 시각화 용도로 많이 사용
3.4.1 주성분 분석(PCA)
분산이 가장 큰 방향을 찾는다. 이 방향이 데이터에서 가장 많은 정보를 담고 있는 방향이다. 특성들의 상관관계가 가장 큰 방향이다.
그 다음, 첫 번째 방향과 직각인 방향 중 가장 많은 정보를 담은 방향을 찾는다. 2차원에서는 직각인 방향이 하나 뿐이지만 고차원에서는 (무한히) 많은 직각 방향이 존재할 수 있다.
일반적으로 특성 개수만큼의 주성분이 있음. PCA는 주성분의 일부만 남기는 차원 축소 용도로 사용할 수 있다.
PCA의 단점은 두 축을 해석하기가 쉽지 않다.
주성분은 원본 데이터에 있는 어떤 방향에 대응하는 여러 특성이 조합된 형태다. 보통 이런 조합들이 매우 복잡하다. PCA 객체가 fit 메소드로 학습될 때 components_ 속성에 주성분이 저장된다.
PCA는 특성 추출에도 이용한다. 특성 추출은 원본 데이터 표현보다 분석하기에 더 적합한 표현을 찾을 수 있으리란 생각에서 출발한다. 이미지는 적색, 녹색, 청색(RGB)의 강도가 기록된 픽셀로 구성된다.
책의 예제에서는 얼굴 이미지에서 특성을 추출하는 예제들이 있다.
얼굴 이미지 특성 추출 시, 분류하려는 얼굴가 가장 비슷한 얼굴 이미지를 찾는 1-최근접 이웃 분류기를 사용할 수 있다. 정확도는 23%로 나온다. 클래스 62개를 분류하는 문제에선 나쁘지도 좋지도 않은 결과다. (무작위로 분류하는 정확도는 1/62 = 1.6% 이다. )
PCA로 주성분으로 변환해 거리를 계산하면 정확도가 상승된다. PCA의 화이트닝(whitening, 백색화) 옵션을 사용해 주성분의 스케일이 같아지도록 조정한다. 모델의 정확도는 23%에서 31%로 크게 향상된다.
따라서 주성분이 데이터를 더 잘 표현했다고 할 수 있다.
PCA 모델에서 추출한 몇 개의 주성분들을 사용해 원본 데이터를 재구성 해볼 수 있다.
3.4.2 비음수 행렬 분해 (NMF)
유용한 특성을 뽑아내기 위한 또 다른 비지도 학습 알고리즘이다. PCA와 비슷하고 차원 축소에도 사용할 수 있다.
PCA와 다르게 NMF는 다음과 같이 작동한다.
음수가 아닌 성분과 계수 값을 찾는다. 주성분과 계수가 모두 0보다 크거나 같아야 한다.
음수 아닌 가중치 합으로 데이터를 분해하는 기능은 여러 사람의 목소리가 담긴 오디오 트랙이나 여러 악기로 이뤄진 음악처럼 독립된 소스를 추가하여(덮어써서) 만들어진 데이터에 특히 유용하다. 섞여 있는 데이터에서 원본 성분을 구분할 수 있다.
성분이 둘인 NMF는 데이터셋의 모든 포인트를 양수로 이뤄진 두 개의 성분으로 표현할 수 있다.
성분이 아주 많다면(즉 특성 개수만큼 많다면), 알고리즘은 데이터의 각 특성에 끝에 위치한 포인트를 가리키는 방향을 선택할 것이다.
입력 데이터가 X, 변환 데이터가 W, 성분이 H일 때, X = WH를 만족하는 W, H 행렬을 구하는 방식이다. 행렬의 L2 노름인 프로베니우스 노름(Frobenius norm)의 제곱으로 만든 목적 함수
을 좌표 하강법으로 최소화한다. 구해진 성분 H는 NMF 객체의 components_ 속성에 저장된다.
하나의 성분만을 사용한다면, NMF는 데이터를 가장 잘 표현할 수 있는 평균으로 향하는 성분을 만든다. PCA와는 다르게 성분 개수를 줄이면 특정 방향이 제거되고 전체 성분이 완전히 바뀐다. 그리고 모든 성분을 동등하게 취급한다. 첫 번째, 두 번째 비음수 성분이란 없다.
NMF에서 기본 초기화 방식은 SQRT(MEAN / N) 을 구하고, 정규분포의 난수를 발생시켜 앞에서 구한 제곱근을 곱해 H와 W 행렬을 만든다. 이는 데이터 평균값을 각 성분과 두 개의 행렬에 나누어 놓는다.
3.4.3 t-SNE를 이용한 매니폴드 학습
매니폴드 학습 알고리즘이라고 하는 시각화한 알고리즘들은 훨씬 복잡한 매핑을 만들어 더 나은 시각화를 제공한다. 그 중 t-SNE 알고리즘을 아주 많이 사용한다.
보통 시각화가 목적이라 3개 이상의 특성을 뽑는 경우는 거의 없다. 훈련 데이터를 새로운 표현으로 변환시킨다. 그러나 새로운 데이터에는 적용하지 못한다. 따라서 탐색적 데이터 분석에 유용하지만 지도 학습용으로는 사용하지 않는다.
t-SNE의 아이디어는 다음과 같다. 데이터 포인트 사이의 거리를 가장 잘 보존하는 2차원 표현을 찾는 것이다.
각 데이터 포인트를 2차원에 무작위로 표현한 후 원본 특서 공간에서 가까운 포인트는 가깝게, 멀리 떨어진 포인트는 멀어지게 만든다.
가까이 있는 데이터 포인트에 더 많은 비중을 두어, 이웃 데이터 포인트에 대한 정보를 보존하려 노력한다.
scikit-learn 에서는 쿨러-라이블러 발산( Kullback-Leibler divergence) 목적 함수를 최적화하기 위해 모멘텀을 적용한 배치 경사 하강법을 사용한다. TSNE의 method 매개변수의 기본값은 'barnes_hut'로 그래디언트(gradient) 계산의 복잡도를 O(N^2)에서 O(NlogN)으로 낮춰주는 반스-헛(Barnes-Hut) 방법이다. 'exact' 옵셔은 정확한 계산을 하지만 느리므로 대량의 데이터에는 적합하지 않다.
3.5 군집
데이터셋을 클러스터(cluster)라느 그룹으로 나누는 작업을 해준다. 한 클러스터 안의 데이터 포인트끼리는 매우 비슷하다. 다르 클러스터의 데이터 포인트와는 구분되도록 해준다.
3.5.1 k-평균 군집(k-Means Clustering)
가장 간단하고 널리 사용하는 군집 알고리즘이다. 데이터의 어떤 영역을 대표하는 클러스터 중심(cluster center)을 찾는다.
알고리즘은 다음 두 단계를 반복한다.
데이터 포인트를 가장 가까운 클러스터 중심에 할당한다.
클러스터에 할당된 데이터 포인트의 평균으로 클러스터 중심을 다시 지정한다.
클러스터에 할당되는 데이터 포인트에 변화가 없을 때 알고리즘이 종료된다.
KMeans(n_clusters=1) scikit-learn에서 k-평균 알고리즘을 사용할 수 있다. fit() 메소드로 훈련 데이터를 구분한다. kmeans.labels_ 속성에서 할당된 레이블들을 확인할 수 있다.
세 개의 클러스터를 지정했으면 각 클러스터는 0~2까지의 번호가 붙는다. predict 메소드로 새로운 데이터의 클러스터 레이블을 예측할 수 있다. 가장 가까운 클러스터 중심을 할당한다. 기존 모델을 변경하지 않는다.
분류와 비슷해보이지만, 정답을 모르며 레이블 자체에 어떤 의미가 있지 않다.
k-평균 알고리즘이 실패하는 경우
데이터셋의 클러스터 개수를 정확하게 알고 있더라도 k-평균 알고리즘이 항상 이를 구분해낼 수 있는 것은 아니다. 각 클러스터를 정의하는 것이 중심 하나 뿐이다. 둥근 형태로 나타난다. 비교적 간단한 형태만을 구분할 수 있다. k-평균은 모든 클러스터의 반경이 똑같다고 가정한다. 클러스터에서 모든 방향이 똑같이 중요하다고 가정한
다.
벡터 양자화 또는 분해 메서드로서의 k-평균
k-평균은 PCA와 NMF와 다르게 클러스터 중심으로 각 데이터 포인트를 표현한다. 즉, 하나의 성분으로 표현된다. 이를 벡터 양자화(vector quantization)라고 한다.
k-평균은 비교적 이해하기 쉽고 구현도 쉬울 뿐만 아니라 비교적 빠르기 때문에, 가장 인기 있는 군집 알고리즘이다. 대용량 데이터셋에도 잘 작동한다. scikit-learn은 아주 큰 대규모 데이터셋을 처리할 수 있는 MiniBatchKmeans도 제공한다. 이는 전체 데이터에서 일부를 무작위로 선택해(미니 배치) 클러스터의 주심을 계산한다. 미니 배치의 크기는 batch_size 매개변수로 기본값은 100이다.
3.5.2 병합 군집(Agglomerative Clustering)
- ward : 기본값인 ward 연결(linkage)은 모든 클러스터 내의 분산을 가장 작게 증가시키는 두 클러스터를 합친다. 크기가 비교적 비슷한 클러스터가 만들어진다.
- average : 클러스터 포인트 사이의 평균 거리가 갖아 짧은 두 클러스터를 합친다.
- complete : 최대 연결이라고도 하며, 클러스터 포인트 사이의 최대 거리가 가장 짧은 두 클러스터를 합친다.
병합 군집은 계층적 군집(hierarchical clustering)을 만든다. 하지만 이는 2차원 데이터일 때 적절하다.
계층 군집을 시각화하는 또 다른 도구인 덴드로그램은 다차원 데이터셋을 처리할 수 있다. scikit-learn 에서는 덴드로그램을 지원하지 않는다. SciPy를 사용해 덴드로그램을 만들 수 있다.
덴드로그램에서 데이터 포인트는 맨 아래 나타난다. 이 포인트들을 잎(leaf)으로 하는 트리가 만들어지며 새로운 부모 노드는 두 클러스터가 합쳐질 때 추가된다.
덴드로그램의 y 축은 클러스터 거리다. 가지의 길이는 합쳐진 클러스터가 얼마나 멀리 떨어져 있는지를 보여준다. 세 개에서 두 개에서의 가지가 길다는 뜻은, 꽤 먼 거리의 포인트를 모은다는 뜻이다.
병합 군집 역시, k-평균 알고리즘과 마찬가지로 two_moons 데이터셋과 같은 복잡한 형상을 구분하지 못한다.
3.5.3 DBSCAN
DBSCAN(density-based spatial clustering of applications with noise)은 아주 유용한 군집 알고리즘이다.
주요 장점은 클러스터의 개수를 미리 지정할 필요가 없다. 복잡한 형상도 찾을 수 있다. 어떤 클래스에도 속하지 않는 포인트를 구분할 수 있다. 앞서 살펴 본 병합 군집이나 k-평균보다는 다소 느리지만 비교적 큰 데이터셋에도 적용할 수 있다.
특성 공간에서 가까이 있는 데이터가 많아 붐비는 지역의 포인트를 찾는다. 이 지역을 특성 공간의 밀집 지역(dense region)이라 한다. DBSCAN은 데이터의 밀집 지역이 한 클러스터를 구성하며 비교적 비어있는 지역을 경계로 다른 클러스터와 구분된다는 것이다.
밀집 지역에 있는 포인트를 핵심 샘플(또는 핵심 포인트)라고 한다. min_samples와 eps 매개변수가 있다. eps 거리 안에 데이터가 min_samples 개수만큼 들어 있으면 이 데이터 포인트를 핵심 샘플로 분류한다.
eps보다 가까운 핵심 샘플은 DBSCAN에 의해 동일한 클러스터로 합쳐진다. ( 거리를 재는 방식은 metric 매개변수에서 설정할 수 있다. 기본값은 유클리안 거리를 나타내는 'euclidean' 이다. )
알고리즘이 시작할 때 무작위로 포인트를 선택한다. 그 포인트에서 eps 거리 안의 모든 포인트를 찾는다.
eps 거리 안에 있는 포인트 수가 min_sampels 보다 적다면 그 포인트는 어떤 클래스에도 속하지 않는 잡음(nosie)으로 레이블한다.
eps 거리 안에 min_samples 보다 많은 포인트가 있다면 그 포인트는 핵심 샘플로 레이블하고 새로운 클러스터 레이블을 할당하다. 그런 다음 그 포인트의 (eps 거리 안의) 모든 이웃을 살핀다.
어떤 클러스터에도 아직 할당되지 않았다면 바로 전에 만든 클러스터 레이블을 할당한다. 핵심 샘플이면 그 포인트의 이웃을 차례로 방문한다.
위 과정들을 eps 거리 안에 더 이상 핵심 샘플이 없을 때 까지 반복한다.
포인트는 다음 세 가지다.
핵심 포인트, 경계포인트(핵심 포인트에서 eps 거리 안에 있는 포인트), 잡음 포인트
알고리즘을 여러 번 실행해도 핵심 포인트의 군집은 항상 같고 매번 같은 포인트를 잡음으로 레이블한다. 그러나 경계 포인트는 한 개 이상의 클러스터의 핵심 샘플의 이웃일 수 있다. 따라서 경계 포이트가 어떤 클러스터에 속할지는 포인터를 방문하는 순서에 따라 달라진다. 보통 경계 포인트는 많지 않아 받는 영향이 적다.
3.5.4 군집 알고리즘의 비교와 평가
타깃값으로 군집 평가하기
타깃값 없이 군집 평가하기
ARI나 NMI 같은 방법들은, 군집 알고리즘에선 비교할 타깃값이 없다. 애플리케이션의 성능 평가가 아닌 이런 알고리즘들을 개발할 때나 평가할 수만 있습니다.
타깃값이 필요 없는 군집용 지표로는 실루엣 계수(silhouette coefficient)가 있다. 실제로 잘 동작하진 않는다. 이는 클러스터의 밀집 정도를 계산한다. 높을 수록 좋으며 최대 점수는 1이다. 모양이 복잡할 때는 밀집도를 활용한 평가가 잘 들어맞지 않는다.
클러스터 평가에 더 적합한 전략은 견고성 기반(robustness-based)의 지표다.
데이터에 잡음 포인트를 추가하거나 여러 가지 매개변수 설정으로 알고리즘을 실행하고 그 결과를 비교하는 것이다. 매개변수와 데이터에 변화를 주며 반복해도 결과가 일정하다면 신뢰할 만 하다고 할 수 있다. scikit-learn 에서는 구현되어 있지 않는다.
예제 소스의 길이가 커서 한 포스팅에 들어가지 않습니다. 분할하여 링크로 올립니다.
'인공지능' 카테고리의 다른 글
[빅데이터 직무연구회] 5회차 모임 예제 소스 (2) (0) | 2018.05.19 |
---|---|
[빅데이터 직무연구회] 5회차 모임 예제 소스 (1) (0) | 2018.05.19 |
[빅데이터 직무연구회] 4회차 모임 정리 (0) | 2018.05.18 |
[빅데이터 직무연구회] 3주차 모임 정리 (0) | 2018.05.04 |
[빅데이터 직무연구회] 2주차 모임 정리 (0) | 2018.05.03 |
댓글