TIL/머신러닝

비지도학습 K-Means Clustering 군집화

jojoon2786 2024. 8. 20. 14:48

머신러닝의 비지도 학습과 K-Means에 대해서 학습하였다.

 

비지도학습

  • 데이터의 '유사성'을 기반으로 레이블링해서 답(y)를 지정하는 작업
  • 정답이 없는 문제이기 때문에 주관적인 판단이 개입된다.
  • ex) 고객 특성에 따른 그룹화 (헤비 vs 일반)

K-Means Clustering 이론

1. K개의 군집 수 설정

2. 임의의 중심점 선정

3. 해당 중심점과 거리가 가까운 데이터를 그룹화

4. 데이터 그룹의 무게중심으로 중심점 이동

5. 중심점을 이동했기 때문에 다시 거리가 가까운 데이터 그룹화

6. 위 3~5 과정을 계속 반복

 

1~3 과정
4~5 과정

위 그림에선 K 군집 수를 3으로 설정하였다.

 

장점

  • 일반적이고 적용하기 쉽다.

단점

  • 거리 기반으로 가까움을 측정하기 때문에 차원이 많을 수록 정확도가 떨어진다.
  • 반복 횟수가 많을 수록 시간이 느려진다.
  • 몇 개의 군집(K)을 설정할 지 주관적이다.
  • 평균을 이용하기 때문에(중심성) 이상치에 취약하다.

라이브러리

● sklearn.cluster.KMeans

> 함수 입력값

  • n_cluster : 군집화 갯수
  • max_iter : 최대 반복 횟수

> 메소드

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

군집평가 지표

실루엣 계수란 ?

  • 군집 간의 거리가 얼마나 효율적으로 분리되어 있는가 ?

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 : 측정 기준


 

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)    # 비지도 학습이기 때문에 x 값만 넣어줘도 됨

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

target 컬럼에 species를 넣어 cluster와 간단하게 비교해주고

원본 데이터와 비교해보자.

 

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()