본문 바로가기
공부/핸즈온 머신러닝

핸즈온 머신러닝 2 chap 9 비지도 학습

by 계굴개굴 2021. 2. 26.

레이블이 없는 경우 사용하는 방법이 비지도 학습이다. 

 

군집 (clustering)

  비슷한 샘플의 클러스터(cluster)로 모은다. 데이터분석부터 준지도 학습, 차원축소까지 사용가능

 

이상치 탐지 (outlier detection)

  정상 데이터가 어떻게 보이는지 학습하고 비정상 샘플을 감지하는데 사용된다.

 

밀도 추정 (density estimation)

  데이터셋 생겅 확률 과정(random process) 의 확률밀도함수 (probability density function)PDF를 추정. 이상치 탐지에도 사용된다. 데이터 분석과 시각화에도 유용

 

8.1 군집

비슷한거 끼리 모아놓는걸 군집 이라고 한다.

알고리즘에 따라 센트로이드(centroid) 라고 부르는 특정 포인트를 찾기도 한다.

 

9.1.1 k-평균 (k-mean)

k-mean 은 k개의 군집을 찾는 알고리즘이다. 그래서 k 를 지정해야하는데 k 를 몇으로 지정할지 정하는것은 어려운 일이다.

일단 작동 과정부터 보자. 

1. 랜덤하게 센트로이드를 부여.

2. 이제 샘플들에게 레이블을 할당하고

3. 센트로이드를 update 한다.

(2~3 과정을 변화가 없을때까지 작동)

 

이 알고리즘은 수렴이 보장되기는 하지만 최적의 결과를 낸다고 보장할 수는 없다. 초기 랜덤값에 따라 다른 결과가 나올수 있기때문이다. 그래서 센트로이드를 적절히 잘 주는것도 중요하다.

 

센트로이드 초기화 방법

직접 지정 해서 주는 방법이 있다. 또 다른 방법은 여러번 실행해서 좋은 결과가 나온것을 활용하는 것이다. 

이제 이너셔 (inertia) 라는 값 즉 센트로이드 사이의 평균제곱거리 를 이용해 여러번 돌린후 이너셔가 낮은 모델을 반환하는 방법도 있다.

2006년 k-mean++이 나오기도했다. (기존보다 빠르게 학습)

이 논문에서는 다른 센트로아드와의 거리가 먼 센트로이드를 선택하는 초기화 단계를 사용했다. 이는 최적의 솔루션으로 갈 확률을 높여준다.

작동하는 순서를 보자.

1. 무작위로 균등하게 하나의 센트로이드를 선택한다. 

2. 특정확률의 샘플 x 를 새로운 센트로이드로 선택한다. 여기서 D(x(i)) 는 선택된 가장 가까운 센트로이드까지의 거리이다. 이 분포는 이미 선택한 센트로이드에서 멀리 떨어진 샘플을 다음 센트로이드로 선택할 가능성이 높다.

3. K 개의 센트로이드가 선택될 때까지 반복한다.

 

KMeans 를 사용하면 이 초기화 방법을 사용한다.

 

K-mean 속도 개선과 미니배치 k-mean

2013년 또 개선되었는데 이는 불필요한 거리계싼을 피함으로 속도를 높였다.

이를위해 삼각 부등식을 사용했다. (두 점사이의 직성은 항상 가장 짧은 거리가 된다는 것)

샘플과 센트로이드 사이의 거리를 위해 하한성과 상한선을 유지한다.

 

2010 년에는 전체 데이터셋을 사용하는것이 아니라 미니배치를 이용해 센트로이드를 이동(업데이트) 하는 방식을 사용했다.

 

데이터셋이 커서 메모리에 들어가지않으면 PCA 에서 했던것처럼 memmap 클래스를 사용해 메모리처럼 사용하는 방식을 사용할수도 있다.

미니배치사용시 이너셔가 제일 작게 한다고 할수는 없지만 훈련시간은 많이 줄어들은것을 볼수 있다.

 

최적의 클러스터 수 찾기

 

최적의 클러스터 수는 어떻게 찾을까? 이너셔가 제일 작게 선택하면 될까. 그건 아니다. k에 따른 이너셔를 그려보면 다음과 같다.

k 가 4부터는 줄어드는 속도가 확 줄어드는것을 볼수있는데 이 지점을 엘보라고 한다. 일반적으로 이 지점이 좋은 수가 된다.

또 다른 방법이 있는데 실루엣점수(silhouette score) 를 사용하는 방법이다.

이 값은 모든샘플에 대한 실루엣 계수(silhouette coefficient)의 평균이다.

 

(b-a)/max(a,b) 로 계산한다.

여기서 a 는 동일한 클러스터에 있는 다른 샘플까지의 평균거리, b는 가장 가까운 클러스터까지의 평군거리이다.

그러면 계수는 -1 ~ 1 까지의 값을 가진다.

1 이면 자신 클러스터에 잘 있고 다른클러스터와는 멀리 떨어져 있다는 뜻이고 -1 은 거꾸로 즉 다른 클러스터에 잘못들어가있다는 뜻이 된다.

k에 따른 실루엣 계수를 보면 아래와 같다.

여기서 보면 4 도 좋고 5도 좋다는게 보인다.

더 많은 정보를 볼수 있는게 실루엣 다이어그램(silhouette diagram) 인데 이는 클러스타마다 칼모양의 그래프가 그려진다.

이 그래프의 높이는 클러스터가 가지고 있는 샘플의 수이고 넓이는 실루엣 계수를 나타낸다. 즉 넓을수록 좋다.

 

9.1.2 k-평균의 한계

k-mean 은 일단 느리다(여러번 반복). 그리고 샘플의 모양을 클러스터로 모양을 잘 그려주지 못한다. 즉 데이터에따라 잘 작동하지 않는 모양들이 존재하게 된다.

 

9.1.3 군집을 사용한 이미지 분할

이미지 분할(image segmentation) 은 이미지를 세그먼트 (segment) 여러개로 분할하는 작업이다. 시맨틱 분할(semantic segmentation)에서는 동일한 종류의 물체에 속한 모든 픽셀은 같은 세그먼트에 할달된다. 이는 신경망을 사용할 수도 있지만 쉬운 방법으로는 색상 분할(color segmentation)이 있다. 즉 동일한 색상을 가진 픽셀을 같은 세그먼트에 할당하는 것이다. 

 

9.1.4 군집을 사용한 전처리

군집으로 효과적인 차원축소를 할수 있다. 책에서는 mnist 를 예제로 k-means 을 사용해 99 개읠 클러스터를 만들어서 학습했더니 2프로 적도가 오른것을 확인할 수 있다.

 

9.1.5 군집을 사용한 준지도 학습

준지도 학습이 가능한데 여기서 준지도 학습이란 semi supervied learning 즉 레이블이 없는 데이터가 많고 몇몇개만 레이블이 있을때 사용하는 방법이다. 클러스터로 군집을 만든후 있는 label 을 사용해 레이블을 만들고 학습한다. 이렇게 레이블을 주는방식을 레이블 전파(label propagation) 이라고 한다.

 

9.1.6 DSSCAN

디비스캔은 밀집된 연속적 지역을 클러스터로 정의하는 것이다.

작동 방식은 간단하다.

1. 각 샘플에서 작은거리인 ε 안에 몇개의 샘플이 있는지 본다. 이 지역의 샘플을 ε-이웃이라고한다,

2. ε-이웃 내에 적어도 min_samples 개의 샘플이 있으면 이를 핵심 샘플(core instance) 로 간주한다.

3. 핵심샘플내의 이웃에 있는 샘플은 다 같은 클러스터에 속한다. 이걸 이어서 나갈수 있다.

4. 핵심샘프도 아니고 이웃도 아닌 샘플은 이상치로 판단한다.

이런식으로 데이터 모양이 특이해도 분류가 가능해 진다는 장점이 있다. 또 하이퍼파라미터가 2개 뿐이다 (eps, min_samples) 단점은 클러스터간 밀도가 다르면 잘 안된다. 

계산 복잠도는 O(mlogm) 이라 데이터수에따라 선형적으로 증가한다. 사이킷런에선s eps 가 커지면 필요메모리는 O(m^2)가 필요하다.

 

9.1.7 다른 군집 알고리즘

 

병합군집

  각각의 샘플이 하나의 클러스터로 시작해서 병합해나가며 클러스터 크키를 키우며 수를 줄여나가는 방식. 가장 가까운 클러스터끼리 병합해 나간다. 

m*m 크기의 샘플끼리의 거리를 담은 행렬을 사용

 

BIRCH (balanced iterative reducing and clustering using hierarchies)

  특성수가 20개 이하면 k-mean 보다 빠르고 비슷한 결과를 만들어 낸다. 훈련과정에서 새로운 샘플은 클러스터에 빠르게 할당할 수 있는 정보를 담은 트리 구조를 이용해 만든다.

 

평균-이동

  각 샘플을 중심으로 원을 그리고 원안에 포함된 샘플들의 평균을 구하고 그 원의 중심을 이동시키는 방식. 원의 반경(bandwidth) 하나만 넣어주면 만들수 있는 간단한 알고리즘.

 

유사도 전파

  투표 방식을 사용하는 알고리즘. O(m^2) 라서 대규모 데이터에는 적합하지 않다.

 

스펙트럼 군집 (spectral clustering)

  샘플 사이의 유사도 행렬을 받아 저차원 임베딩을 만든다.(차원 축소) 그 저차원에서 또 다른 군집 알고리즘을 사용한다. 이 군집은 복잡한 클러스터 구조를 감지하고 그래프 컷을 찾는데 사용할 수 있다.

 

9.2 가우시안 혼합

가우시안 혼합 모델 (Gaussian mixture model) GMM 은 샘플이 파라미터가 알려지지 않은 여러개의 혼합된 가우시안 분포에서 생성되었다고 가정하는 확률 모델이다. 

하나의 가우시안 분포에서 생성된 모든 샘플은 하나의 클러스터를 형성한다고 생각하면 된다. 물론 모양 크기 밀집도 방향등 다 다르다. 이게 어떤 분포인지 또 분포의 파라미터가 무엇인지는 모른다.

 

일단 GaussianMixture 클래스에 있는 걸 먼저 보자. 여기선 분포의 개수 k 를 알아야 한다. 데이터셋 X가 다음 확률과정을 통해 생성되었다고 해보자.

 

1. 각 샘플을 k 개의 클러스터중 랜덤하게 하나로 선택된다. j 번쨰 클러스터를 선택학 확률은 클러스터 가중치 ∅^(j) 로 정의된다. i 번쨰 샘플을 위해 선택한 클러스터 인덱스는 z^(i) 로 표시한다.

 

2. z(i) = j 이면 즉 i 번째 샘플이 j 번째 클러스터에 할당되었다면 이 샘플의 위치 x(i) 는 μ(i) 가 평균이고 Σ(j) 의 공분산 을가진 가우시안 분포에서 랜덤하게 샘플링하게 됩니다. 이를 아래와 같이 쓴다.

확률변수 사이의 조건부 의존성의 구조

이걸로 뭘 하냐 X가 주어지면 가중치 Φ 와 전체 분포에 따라 μ(1) ~ μ(k) 까지와 Σ(1) ~ Σ(k) 까지 추정한다.

 

여기서 기댓값-최대화(expectation-maximization) EM 알고리즘을 사용한다.

먼저 샘플을 클러스터에 할당한다 -> E

클러스터를 update 한다 -> M

이는 소프트 클러스터 할당을 사용한다. 즉 매 단계에서 각 클러스터에 속할 확률을 예측한다. 그다음 M 에서 모든 샘플을 사용해 업데이트된다. 클러스터에 속할 추정 확률로 샘플의 가중치가 적용된다.

이 확률을 샘플에 대한 클러스터의 책임(responsibility) 이라고 부른다. 

업데이트시 책임이 가장 많은 샘플에 크게 영향을 받게 된다.

 

GMM 은 생성 모델(generative model) 이다. 즉 새로운 샘플을 만들수 있다.

또 주어진 위치에서 모델의 밀도를 추정할 수 있다. score_samples()을 사용하면 그 위치의 확률밀도함수 (PDF) 의 로그를 예측한다. 여기서 점수가 높을수록 밀도가 높다는 뜻이다.

PDF 이기에 특정 지역안에 속할 확률을 예측할려면 적분을 해야함.

 

9.2.1 가우시안 혼합을 이용한 이상치 탐지

이상치 탐지(outlier detection)은 이상한 놈을 찾는것이다. 이상한놈을 이상치 정상인 놈을 정상치 라고 한다.

쉽게 볼수 이쓴ㄴ데 밀도가 낮은 지역에 있는 샘플을 이상치로 보는것이다. 

그럼 어디서부터 낮은것으로 볼것이냐는 임계값을 정해야한다.

 

비슷하게 특이치 탐지 (novelty detection) 이 있다. 이는 이상치로 오염되지 않은 깨끗한 데이터에서 훈련하는 이상치 탐지와는 다르다.

 

9.2.2 쿨러스터 개수 선택하기

k-means 에서는 이너셔나 실루엣 점수를 사용해서 적절한 k 를 찾았다. 아쉽게도 여기선 쓸수없다. 왜냐면 이 지표들은 클러스터가 타원형이거나 크기가 다를때 안정적이지 않기 떄문이다. 

그래서 BIC(bayesian information criterion) 나 AIC(akaike information criterion) 와 같은 이론적 정보기준(theoretical information criterion)을 최소화 하는 모델을 찾는다.

m 은 샘플의 수

p 는 모델이 학습할 파라미터의 수

L^hat 은 모델의 기능도 함수(likelihood function) 의 최대값

 

BIC, AIC 모드 파라미터가 많은(클러스터가 많은) 모델에게 벌칙을 가하는 방식이다. 주로 결과는 같은데 다를경우 BIC 가 선택한게 더 간단한 경향이 있다.

k=3 일때 BIC 와 AIC 가 가장 낮음을 확인할 수 있다.

 

9.2.3 베이즈 가우시안 혼합 모델

최적읠 클러스터 개수를 수동으로 찾지 않고 불필요한 클러스터의 가중치를 0 으로 만드는 방법이 있다.

->BayesianGaussianMixture    클러스터 개수 n_componets를 최적읠 클러수터 개수보다 크다게 지정한다.

그러면 바로 몇개의 컬러스터가 필요한지 나온다.

 

이 모델은 클러스터 파라미터 (가중치, 평균, 공분산행렬 ...) 를 고정된 마파미터가 아니라 잠재 확률 변수로 취급한다.

즉 z는 컬러스터 파라미터와 클러스터 할당을 모두 포함한다.

 

베타분포 (beta distribution) 은 고정 범위안에 높인값을 가진 확률변수를 모델링 할떄 사용한다.

예를들어 SBP(stick-breaking process) 는 새로운 샘플은 클 클러스터에 속하게될 학률이 높다. 농도가 크면 Φ값이

0에 가까워지고 SBP 는 많은 클러스터를 만든다.

마지막으로 위샤트 분포(wishart distrobution) 을 사용해 공분산 행렬을 샘플링 한다. 이때 파라미터 d 와 V 가 분포 모양을 제어한다.

 

잠재변수 z 에 대한 사전지식이 사전확률(prior) 이라는 확률분포 p(z) 에 인코딩 될수 있다.

예를들어 클러스터가 적을것이라는 사전 믿음(prior belief) 을 가질수 있다. 이건 weoght_concentration_prior 로 조절할 수 있다. 

큰 차이가 나는 그래프를 그리려면 사전 믿음이 강하고 데이터는 적어야 된다.

 

아래 식은 데이터 X 를 관축 후 잠재변수에 대한 확률분포를 업데이트 하는 법이다. 이는 X 가 주어졌을때 z의 조건부 확률인 사후확률(posterior) 분포 p(z|X) 를 계산한다.

아쉽게도 사우시안 혼한 모델에서 분모인 p(X) 는 계산하기 힘들다. 왜냐면 모든 z 에대해 적분해야 하기 때문이다.

이건 베이즈 통계학에 있는 주요 문제이다. 이걸 해결하기 위한 몇가지 방법이 있다.

 그중 하나가 변분 추론(variational inference) 이다. 이 반식은 자체적인 변분 파라미터 람다(λ)를 가진 분포 패밀리 

q(z;λ) 를 선택한다. 그다음 q(z) 가 q(z|X) 에 좋은 근사랎이 되도록 파라미터를 최적화한다. q(z) 에서 p(z|X) 로의 KL발산 을 최소화 하는 λ 를 찾아 이를 해결한다.

 

이 식은 증거의 로그(log p(x) )에서 증거하한 (evidence lower bound) ELBO 을 뺀 식으로 다시 쓸 수 있다. 증거의 로그는 q 에 의존하지 않고 상수항 이므로 KL 발산을 최소화 하려면 ELBO를 최대화 해야 한다.

 

실전에서는 다른 방법으로 ELBO 를 최대화 한다. 평균장 변분 추론(mean field variational inference)에서 eLBO식을 계산할 수 있는 형태로 단순화 하기 위해 분포 패밀리 q(z;λ) 와 사전확률 p(z) 를 잘 선택하야 한다.

 

EBLO를 최대화하는 간단한 방법은 블랙박스확률적 변분 추론(black box stochastic variational inference) BBSVI이다. 

각 반복에서 샘플을 q 에서 뽑아 변분 파라미터 λ 에 대해 ELBO의 그레디언트를 추정하는데 사용한다. 그다음 경사 상습법 스텝에서 사용한다. 미분이가능하다면 어떤종류의 모델과도 베이즈 추런을 사용할 수 있게 한다. nn 포함.

 

9.2.4 이상치 탐지와 특이치 탐지를 위한 다른 알고리즘

 

PCA (그리고 inverse_transform() 메서드를 가진 다른 축소 기법)

 

  보통 정상의 재구성오차와 이상치의 재구성 오차를 비교하면 이상치샘플의 재구상 오차가 크다. 그걸 이요한 탐지방법

 

Fast-MCD

 

  데이터셋을 정제할때 사용된다. 보통 샘플이 하나의 가우시안 분포에서 생성되었다고 가정하고 이상치는 아니라고 가정한다. 그래서 이상치로 감지되면 그 샘플을 무시한다.

 

아이솔레이션 포레스트

 

  고차원 데이터셋에서 이상치 감지를 위한 효율적인 방법이다. 무작위로 성장한 결정트리로 구성된 랜덤 포레스트를 만들고 랜덤한 임계값을 골라 데이터 셋을 둘로 나눔. 이걸 반복함으로 데이터셋이 분리되고 다른샘플과 거리가 멀면 이상치로 본다.

 

LOF(local outlier factor)

  샘플 주위의 밀도와 이웃주위의 밀도를 비교.

 

one-class SVM

  커널 SVM 이 두 클래스로 분류하는것을 생각해보면 된다. 즉 한클래스(정상) 으로부터 이상치를 분류하는 것이다.