본문 바로가기
머신러닝 with Python

[머신러닝 with 파이썬] 군집화(클러스터링) : K-means & HDBSCAN / 시각화

by CodeCrafter 2023. 9. 27.
반응형

이번에는 클러스터링의 대표 알고리즘 중 하나인 K-means Clustering과 HDBSCAN에 대해 간략히 알아보겠습니다.

 

시각화를 기반으로 차이를 설명하겠으며, 각 모델별 자세한 내용들은 다음 포스팅에서 다뤄보겠습니다.

 

 

1. 군집화(Clustering, 클러스터링) 이란?

- 클러스터링은 비슷한 특성을 가진 데이터들을 그룹화하는데 쓰이는 데이터 분석 방법입니다.

 

- 데이터의 특성만을 기준으로 분류하기에, 비지도 학습(Unsupervised Learning)의 한 형태라 할 수 있습니다.

 * 비지도 학습(Unsupervised Learning) : 레이블(혹은 정답)이 지정되지 않은 데이터에서 유용한 정보를 추출하는데 사용되는 학습방법

 * 비지도학습이라는 점에서 분류(Classification)과 큰 차이를 가진다고 할 수 있습니다.

 

- 클러스터링을 사용하는 이유는 다음과 같이 크게 3가지로 요약할 수 있는데요

1) 유사한 데이터 그룹화: 데이터 내에서 서로 유사한 특성을 가진 데이터 포인트를 동일한 클러스터로 그룹

화합니다. 이를 통해 데이터를 더 이해하기 쉬운 형태로 정리할 수 있습니다.
2) 패턴 발견: 클러스터링을 통해 데이터 내에 숨겨진 패턴, 구조, 관계를 발견하고 이를 시각화하여 해석할 수

있습니다.
3) 데이터 감소 및 요약: 큰 데이터 세트를 클러스터로 나누면 데이터의 크기를 줄이고 각 클러스터를 대표하

는 중심 또는 대표 포인트를 사용하여 데이터를 요약할 수 있습니다.

 

- 클러스터링은 다음과 같이 크게 4가지 기반의 알고리즘을 분류해볼 수 있는데요

1) K-means 클러스터링: 데이터를 K개의 클러스터로 그룹화하는 알고리즘으로, 각 클러스터의 중심을 찾아

가면서 클러스터를 형성합니다.
2) 계층적 클러스터링: 계층적으로 클러스터를 형성하여 데이터를 나무 구조로 표현하는 방법입니다. 클러스

터를 분할하거나 병합할 수 있습니다.
3)밀도 기반 클러스터링: 데이터 포인트 주변의 밀도를 고려하여 클러스터를 형성하는 알고리즘입니다.

HDBSCAN이 이러한 종류의 알고리즘 중 하나입니다.
4)군집화 분석(Cluster Analysis): 클러스터 간의 거리나 유사성을 기반으로 클러스터링하는 방법입니다.

Agglomerative 클러스터링과 DBSCAN 등이 여기에 속합니다.

 

 

위 4가지 중 이번 포스팅에서는 K-means 클러스터링과 DBSCAN 기반의 HDBSCAN에 대해서 알아보겠습니다.

 

 

2. 파이썬을 활용한 K-means 클러스터링과 HDBSCAN 구현 및 시각화

 

- 분석을 위해 2가지 그룹의 2차원 데이터를 만들어 보겠습니다. 첫 번째는 중심을 가지고 랜덤으로 만들어진 데이터 군집, 두 번째는 원의 겹(Layer) 형태로 이루어진 데이터입니다.

 

1)  중심을 가지고 랜덤으로 만들어진 데이터 군집

 

* 분석을 위해 4개의 중심(centers=4)를 가지고 300개의 샘플 군집을 만들어 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
from sklearn.datasets import make_blobs
 
# 무작위 데이터 생성
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)
 
import matplotlib.pyplot as plt
 
plt.scatter(X[:, 0], X[:, 1], s=30)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Generated Data')
plt.show()
cs

 

 

* 먼저 K-Means 클러스터링으로 분류를 해보겠습니다.

* K-Means 클러스터링은 주어진 데이터를 K개의 클러스터(군집)으로 그룹화하는데 사용됩니다. 이때,  클러스터의 중심(Centroids)을 기준으로 클러스터링을 생성하며, 클러스터의 모습은 원형으로 가정되는 알고리즘입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.cluster import KMeans
 
# K-means 모델 생성
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans_labels = kmeans.fit_predict(X)
 
# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans_labels, s=30, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x', s=200, label='Centroids')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-means Clustering')
plt.legend()
plt.show()
cs

* 중심을 바탕으로 만들어진 4가지의 데이터 그룹이 색깔로서 잘 구분되어 있는 것을 알 수 있습니다. 위에서 X로 표시된 것은 원형 클러스터의 중심인 Centroids를 의미합니다.

 

 

 

* 다음은 똑같은 데이터를 HDBSCAN으로 구분한 것입니다.

* HDBSCAN은 데이터의 밀도를 고려하여 클러스터를 형성하는 밀도 기반 클러스터링 알고리즘 입니다. 따라서, 클러스터의 모양이 있는 K-means에 비해 클러스터의 모양에 상관없이 데이터의 밀도에 기반하여 클러스터를 식별합니다. 이러한 특성 때문에 원형으로 군집화되어있지 않은 데이터에 대해서도 군집화가 잘 되는 특징을 가지고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
!pip install hdbscan
 
import hdbscan
 
# HDBSCAN 모델 생성
hdbscan_clusterer = hdbscan.HDBSCAN(min_cluster_size=5, min_samples=5)
hdbscan_labels = hdbscan_clusterer.fit_predict(X)
 
# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=hdbscan_labels, s=30, cmap='viridis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('HDBSCAN Clustering')
plt.show()
 
cs

* HDBSCAN도 준수한 성능을 가지고 있지만, 파란색 점 하나가 분류가 적절하지 못한 것으로 보이며, 노란점 하나도 분류가 조금 애매해보입니다.

 

 

 

2) 이번에는 원 형태의 밀도를 가진 데이터를 생성해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
 
# 원형태의 데이터 생성
X, _ = make_circles(n_samples=300, noise=0.05, factor=0.5, random_state=42)
 
# 데이터 시각화
plt.scatter(X[:, 0], X[:, 1], s=30)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Generated Circular Data')
plt.show()
cs

 

 

* 원형의 데이터를 K-Means로 군집화한 결과입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.cluster import KMeans
 
# K-means 모델 생성
kmeans = KMeans(n_clusters=2, random_state=42)
kmeans_labels = kmeans.fit_predict(X)
 
# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=kmeans_labels, s=30, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='x', s=200, label='Centroids')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-means Clustering')
plt.legend()
plt.show()
cs

*  원 형태의 클러스터가 기반이기에 적절하게 외환과 내환으로 중첩되어 있는 원의 데이터를 분류하기에는 제한이 있어보입니다.

 

 

 

* HDBSCAN으로 분류한 결과입니다.

1
2
3
4
5
6
7
8
9
10
11
12
import hdbscan
 
# HDBSCAN 모델 생성
hdbscan_clusterer = hdbscan.HDBSCAN(min_cluster_size=5, min_samples=5)
hdbscan_labels = hdbscan_clusterer.fit_predict(X)
 
# 클러스터링 결과 시각화
plt.scatter(X[:, 0], X[:, 1], c=hdbscan_labels, s=30, cmap='viridis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('HDBSCAN Clustering')
plt.show()
cs

* 밀도기반인 HDBSCAN은 꽤나 데이터의 군집을 잘 분류해낸 모습을 알 수 있습니다. 

 

 

 

다음 포스팅에서는 각 클러스터링 알고리즘에 대해서 자세히 알아보도록 하겠습니다.

반응형

댓글