본문 바로가기
projects

밀도가 집중된 위치 군집화 (DBSCAN)

by lillian11 2023. 5. 7.

머신러닝을 배우다보면 비계층적 군집분석 기법중에 가장 많이 접하는 것이 K-Means일 것이다.

계산 속도가 빠르고 클러스터링하기엔 가장 무난해서 분류가 필요한 플젝이나 문제를 풀 경우 그냥 습관처럼 처음에 K-Means를 일단 돌려보고 문제를 어떤 방식으로 풀 지 결정하는 편이다.

 

최근 풀어야 할 문제는 특정 구간에 집중한 것과 아닌 것을 분류하는 문제였다.

모든 데이터를 군집화 하는 K-Means는 해당 문제를 풀기엔 애매하다고 판단해서 특정 구간에 집중된 것을 파악하는 알고리즘을 찾다가 DBSCAN을 적용하였다.

 

밀도 기반의 클러스터링은 DBSCAN 뿐만 아니라 Mean Shift도 있어 K-Means, Mean Shift, DBSCAN 세가지 결과를 비교하며 차이점을 확인해보자.

 

일단 데이터의 분포도를 Scatter Plot으로 그려봤다. 

Scatter Plot으로 데이터 분포 확인

해당 데이터 중 아래 사진의 노란부분만 밀도가 많기 때문에 분류해내고 싶었다. 

문제에 대한 고민 전 1차로 Kmeans를 돌려보았다. 당연히 노란부분과 아닌부분들이 구분되야 하므로 클러스터의 수(K)를 2로 넣고 돌려봤다.

K = 2일때 K-Means 클러스터링

유클리디안 거리 계산 클러스터링 방식이기 때문에 노란 부분 이외에 우측 하단 영역이 모두 같이 클러스터링 되었다. 하지만 밀도가 집중되는 곳과 아닌곳을 걸러야 했었다.

따라서 밀도 기반 방식의 Mean Shift를 썼고, estimate_bandwidth함수를 통해 최적의 bandwidth를 계산하는 방식을 사용해 봤었다.

또한 20%의 데이터를 가지고 bandwidth를 구했으며 몇 %의 데이터를 가지고 할 것인지 여러번 실험해 봤으나 거의 동일한 수치가 나와 20% 그대로 사용했다. 해당 부분은 전체 속도에 영향을 미친다는 점을 염두하고 수치를 지정해야 할 부분이다. 대부분 0.2~0.3수준으로 코딩하는 예시를 많이 보았다.

Bandwidth = 4로 Mean Shift 클러스터링

Mean Shift가 밀도 기반 클러스터링이나 밀도가 높은 중심부터 이동을 한다는 점 때문에 상대적으로 밀도가 낮아 문제 해결엔 중요하지 않은 부분일지라도 군집화가 되는 현상이 생긴다. 이즈음부터 문제의 본질에 대해 진지하게 고민하기 시작했었는데, 해당 문제는 노란 부분 외 나머지 클러스터링 되는 영역이 중요하지 않았다는 걸 깨닫고 DBSCAN을 사용했다.

DBSCAN 결과

나는 넘파이 배열을 DBSCAN에 넣는 방식을 사용했었기에 클러스터링 된 결과를 보니 -1, 0뿐이었다. DBSCAN은 중심 위치로 판단하지 않는 영역을 -1로 지정한다.

또한 해당 정보에 명확한 지점을 파악할 수 있게 코드를 짜 위의 오렌지색 점 지점을 파악해보니 원래 분유하고자 한 노란색 영역과 같다는 것을 발견했다!

 

사실 기본적인 알고리즘들을 배우는 것보다 더 중요하다고 보는 것은 문제 혹은 프로젝트에 따라 어떤 방식으로 풀어나갈지를 경험해 체득하는 것 같다고 생각한다. 처음부터 해결방식이 다 떠오를 수 없으므로 1차 머신러닝 해결 방식을 구분하고(분류 vs 회귀) 가장 기본적인 알고리즘을 적용한 뒤 차차 고민해보는 것이 정말 현실적으로 중요하지 않을까 싶다~