K-means 클러스트링 군집 갯수 정하는 방법은?!

2020. 1. 29. 17:00

알고리즘은 숫자를 가지고 계산되지만, 이를 위해서는 사람이 결정하고 입력해줘야 하는 값들이 있다. 이 중에는 애매한 값들을 사람이 입력해줘야 하는 경우도 있다. KMeans 클러스트링 알고리즘의 군집 갯수도 이와 같다.

오늘은 KMean 클러스트링 알고리즘의 군집 갯수를 정하는 방법에 대해서 알아보도록 하겠다.


클러스트링



KMeans알고리즘은 대표적인 비지도 학습 알고리즘의 하나이다. 그래서 군집의 갯수를 알고리즘에 알려줘야 한다. 그럼 군집의 갯수를 어떻게 정해야 할까.


군집의 갯수를 정하는 가장 대표적인 방법은 감이다.

이런 감을 업무 용어로 비지니스 지식이라고 한다. 도메인 지식이라고도 부르는 이 영역을 필자는 감이라고 부른다. 해당 업무를 오래 한 사람은 그 동안의 업무 경험과 지식을 가지고 해당 데이터는 이 정도 갯수가 적당하지 않을까 하고 말할 수 있다. 그리고 이 방법이 사실 제일 좋은 것 같다.



감



하지만, 사람들은 감을 싫어한다.

왜 3개인지 4개는 안 되는지에 대해 물어보면 답할 말이 없다. 자신의 일은 감으로 처리하는 게 많지만 뭔가 알고리즘이고 모델이라서 그런지 유달리 이 쪽 영역으로 오면 듣는 사람은 감을 싫어하는 것 같다.

갑자기 예전에 애매한 것을 정해주던 애정남이 생각난다. 사람들은 뭔가를 결정하는 것에 두려움을 갖는다. 그래서 알고리즘이 필요한 걸 지도 모르겠다.



알고리즘의 갯수를 가이드해 주는 방법은 있다.

군집 갯수를 수학적으로 정하는 방법을 찾아보니 Elbow method라는 방법이 있다. 군집을 추가로 늘려가면서 군집내 변동성이 급감하는 군집 갯수를 찾는 것이라고 한다. 군집내 변동성이 급감했다는 것은 유사한 녀석들끼리 잘 묶였다는 뜻이기 때문이다. 이것도 하나의 가이드일 뿐 무조건 이 기준으로 정해서는 안 된다고 한다. 하지만, 누군가에게 설명하기 좋은 방법인 건 분명한다.


Elbow method를 테스트 해보기 위해 샘플 데이터를 만들어 보았다. 누가 보아도 극명하게 3개의 그룹으로 묶이는 데이터셋이다.


1
2
3
4
5
6
7
8
9
10
 
import numpy as np
import seaborn as sns
 
x= np.concatenate((np.random.uniform(0.1,0.3,50), 
                   np.random.uniform(0.4,0.7,50), 
                   np.random.uniform(0.9,1,50)), 0)
 
sns.distplot(x, bins=50)
 
cs



데이터_분포

( 데이터 분포 )



3개의 군집으로 클러스트링을 해 보았다. fit를 하고나서 score함수를 이용하면, elbow method에 사용하는 군집의 변동성을 확인하는 지표를 산출할 수 있었다.

1
2
3
4
5
6
7
 
from sklearn.cluster import KMeans
 
model = KMeans(n_clusters=3)
model.fit(x.reshape(-1,1))
print(model.score(x.reshape(-1,1)))
 
cs



Out[1]: -0.49197957396021536



군집의 갯수별로 이렇게 학습을 시키고, score함수를 이용해서 비교해도 된다. 하지만, yellow brick이라는 패키지를 이용하면 더 쉽게 Elbow Method를 활용해 볼 수 있다.  옐로우 브릭은 머신러닝 시각화를 지원해주는 패키지이다. 이전에 ROC 커브를 그릴 때 이 패키지를 이용했다.

( 참조: 파이썬 사이킷런(sklearn) 패키지에서 ROC곡선 쉽게 그리는 방법 )


yellow brick이라는 패키지를 이용하면 쉽게 시각화까지 할 수 있다. 코드도 어렵지 않다.


1
2
3
4
5
6
7
 
from yellowbrick.cluster import KElbowVisualizer
 
model = KMeans()
visualizer = KElbowVisualizer(model, k=(1,10))
visualizer.fit(x.reshape(-1,1))
 
cs



엘보우_메소드

(옐로우 브릭으로 그린 엘보우 메소드)



파란선이 그룹의 변동성을 확인하는 지표이다. 군집의 갯수가 1에서 2로 늘어날 때 변동성이 급감하지만, 군집의 갯수가 3개 이후에는 거의 변동성이 없다. 3개가 가장 적당한 것을 눈으로 확인할 수 있다. 세로 점선으로 최적의 군집 개수도 표시해준다.

녹색 점선이 좀 재밌는데, 이것은 군집을 학습할 때 걸린 시간이다. 군집이 3개일 때 걸리는 시간이 가장 적다. 군집이 갯수가 늘어날수록 학습 시간이 오래 걸릴 것 같기는 한데, 군집의 갯수가 2개일 때 3개보다 더 시간이 오래 걸린다. 자세한 방법은 알 수 없지만, 클러스트링이 잘 될 때 학습 시간도 적게 걸리는 듯 하다.

참고로 싸이킷런 패키지로 계산한 값에 마이너스를 곱해야 옐로우 브릭에서 구한 값이 된다. 그러니까 두 패키지 값의 부호가 다르다. 하나는 양수, 다른 하나는 음수이다.


군집의 갯수를 설명하기 애매할 때 확실한 설명기준이 될 수는 있을 듯 하다.


3개로 그룹핑한 결과는 아래와 같다. 당연하 애기지만, 클러스트링이 잘 되었다.


클러스트링_결과

( 클러스트링 결과 )



오늘은 이렇게 K-means 클러스터링 군집 갯수를 정하는 방법에 대해서 알아보았다. 엘보우 메소드를 통해서 군집내 변동성의 변화로 군집의 갯수를 정할 수 있었다. 절대적인 기준은 아니지만, 참고지표로 충분히 사용이 가능할 듯 하다.


댓글()