오랑우탄의 반란

[ML] 비지도학습 K-Means Clustering 군집화(클러스터링) 본문

PYTHON/머신러닝

[ML] 비지도학습 K-Means Clustering 군집화(클러스터링)

5&2 2024. 8. 14. 15:32
반응형

 

지금까지 머신러닝의 대표적인 지도학습인 회귀/분류를 살펴봤는데요

머신러닝의 다른 종류인 비지도학습과 그 대표적인 예시 K-Means Clustering을 알아보겠습니다. 

 

비지도학습이란? 

데이터의 유사성을 기반으로 레이블링해서 답을 지정하는 작업
정답이 없는 문제이기 때문에 주관적인 판단이 개입됨

예시) 고객 특성에 따른 그룹화 (헤비유저 vs 일반유저)

 

K-Means Clustering 이론

  1. K개의 군집 수 설정
  2. 임의의 중심점 선정
  3. 해당 중심점과 거리가 가까운 데이터를 그룹화 
  4. 데이터 그룹의 무게중심으로 중심점 이동
  5. 중심점을 이동했기 때문에 다시 거리가 가까운 데이터 그룹화 
  6. 위 과정 3~5번 반복

K=3 에 대한 데이터 군집화 프로세스

장점 - 일반적이고 적용이 쉬움
단점 - 거리 기반 가까움 측정이기 때문에 차원 많을수록 정확도 떨어짐
- 반복 횟수가 많을수록 느려짐
- K 개수 선정이 주관적임
- 중심점이 평균을 이용하기 때문에 이상치에 취약함

 

라이브러리 sklearn.cluster.KMeans
함수 입력값 n_cluster 군집화 갯수
max_iter 최대 반복 횟수
메소드

labels_ 각 데이터 포인트가 속한 군집 중심점 레이블
cluster_centers 각 군집 중심점의 좌표

 

 

iris 데이터로 군집화 

iris_df = sns.load_dataset('iris')

# 복사본 생성 
iris_df2 = iris_df[['sepal_length', 'sepal_width','petal_length','petal_width']]

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init= 'k-means++', max_iter=300, random_state=42)
kmeans.fit(iris_df2)

iris_df2['target'] = iris_df['species']
iris_df2['cluster'] = kmeans.labels_ # 0, 1, 2 로 그룹화

 

군집화를 진행했을 때 실제 원본 데이터에서는 species 가 어떻게 분류되어 있는지 간단하게 확인해줍니다. 

원본 데이터는 여러 기준으로 이미 species 가 분류된 것이기 때문에 군집화 결과가 틀렸다고 할 수는 없고 참고만 하겠습니다. 

plt.figure(figsize=(12,6))
plt.subplot(1,2,1)
sns.scatterplot(data= iris_df2, x='sepal_length',y='sepal_width',hue='target')
plt.title('Original')

plt.subplot(1,2,2)
sns.scatterplot(data= iris_df2, x='sepal_length',y='sepal_width',hue='cluster', palette='viridis')
plt.title('Clustering')
plt.show()

 

 

군집평가 지표 (실루엣 계수)

일반적으로 비지도학습은 정답이 없기 때문에 평가가 쉽진 않지만, 군집화가 잘 되어있는지 (다른 군집과의 거리가 멀고 동일한 군집과 가까이 있는지)는 평가가 가능합니다.

 

실루엣 분석 silhouette analysis

군집 내의 데이터는 잘 모여있고, 군집 간의 구분은 잘 되어있는지 측정 

 

 

실루엣 계수 silhouette coefficient  

 

b(i) - a(i) : 데이터 i에 대해 얼마나 떨어져 있는지 측정 (클수록 멀리 떨어짐)

max( a(i), b(i)​ ) : 단위 정규화를 위해 둘 중 큰 값으로 나눠주기 

 

실루엣 값이 1에 가까울수록개별 군집의 평균값의 편차가 작을수록 좋은 군집화가 됩니다. 

 

 

먼저 i에 대해 군집A 내에서 각 데이터와의 거리를 계산해줍니다.

 

다음 다른 군집 B, C 의 데이터와의 거리를 계산해줍니다. 

 

 

 

군집 A 와 인접한 군집은 군집 B 이기 때문에 군집 A = a(i) 군집 B = b(i) 로 정의해서 s(i) 를 계산해줍니다. 

 

라이브러리 sklearn.metrics.sihouette_score 전제 데이터의 실루엣 계수 평균 값 반환
함수 입력값 X 데이터셋
labels 레이블
metrics 측정 기준 (default euclidean)

 

 

 

반응형