min

[ML][비지도학습][군집화][k-means clustering] 본문

머신러닝

[ML][비지도학습][군집화][k-means clustering]

나눈밍짱이 2023. 3. 2. 03:09
본 글은 https://www.youtube.com/watch?v=9TR54u08IGU 강의를 수강하고 정리한 내용입니다. 

 

  • k-means clustering 단계 
  1. 데이터 준비 
  2. 클러스터 개수 정하기 
  3. 센트로이드(centroid) 선택 ( 무작위 / 지정 / k-mean++) 
  4. 가장 가까운 클러스터에 데이터 포인트 지정 
  5. 그것들의 클러스트의 중심으로 센트로이드 이동시키기 
  6. 4번과 5번 과정을 더 이상 클러스터의 이동이 없을 때 까지 반복
  • 무작위로 센트로이드가 지정된 상황에서의 클러스터링 예시

 

 

  • 파이썬 실습 
class sklearn.cluster.KMeans(n_clusters=8, 
init='k-means++', n_init=10, max_iter=300, 
tol=0.0001,precompute_distances='deprecated', 
verbose=0, random_state=None, copy_x=True, 
n_jobs='deprecated', algorithm='auto)

n_clusters : 군집화 할 개수 (군집 중심점의 갯수)

- init : 초기에 군집 중심점의 좌표를 설정할 방식을 말하며 임의로 중심을 설정하지 않고,일반적으로 k-means++ 방식을 최초로 설정

max_iter : 최대 반복 횟수, 이 횟수 이전에 모든 데이터의 중심점 이동이없으면 종료


- lables_ : 각 데이터 포인트가 속한 군집 중심점 레이블 

cluster_centers_ : 각 군집 중심점 좌표(Shape는 [군집개수, 피처개수])

 

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
df = pd.DataFrame(columns=['x', 'y'])

df.loc[0] = [3,1]
df.loc[1] = [4,1]
df.loc[2] = [3,2]
df.loc[3] = [4,2]
df.loc[4] = [10,5]
df.loc[5] = [10,6]
df.loc[6] = [11,5]
df.loc[7] = [11,6]
df.loc[8] = [15,1]
df.loc[9] = [15,2]
df.loc[10] = [16,1]
df.loc[11] = [16,2]
df.head(20)

# visualize data point
sns.lmplot('x', 'y', data=df, fit_reg=False, 
scatter_kws={"s": 200}) # x-axis, y-axis, data, no line, marker size

# title
plt.title('kmean plot')

# x-axis label
plt.xlabel('x')

# y-axis label
plt.ylabel('y')
data_points = df.values #데이터프레임의 값을 numpyarray로 변환

kmeans = KMeans (n_clusters=3).fit (data_points) #클러스터지정
#센트로이드 미지정시 k-means++ 자동으로

kmeans.labels_
>> array ( [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32)
kmeans.cluster_centers_ #센트로이드 출력
>> array([[3.5, 1.5],
[ 10.5, 5.5],
[ 15.5, 1.5]])

df [ 'cluster_id'] = kmeans.labels_
df.head
sns.lmplot('x', 'y', data=df, fit_reg=False,  
# x-axis, y-axis, data, no line
           scatter_kws={"s": 150}, # marker size
           hue="cluster_id") # color

# title
plt.title('after kmean clustering')

 

  • k-means의 특징
  • 일반적인 군집화에서 가장 많이 활용되는 알고리즘
  • 쉽고 간결
  • 거리 기반 알고리즘으로 속성의 개수가 매우 많을 경우 군집화의 정확도가 떨어짐 -> PCA 고려
  • 반복을 수행하는데, 반복 횟수가 많을 경우 수행 시간이 매우 느려짐
  • 몇 개의 군집을 선택해야 할 지 스스로 판단 해야함 
  • k-means의 k값을 결정하는 기준

1. Elbow Method

: 가장 보편적으로 이용되는 방법으로 클러스터 내의 총 변동을 설명하는 WCSS(Within Clusters Sum of Squares)를 이용

WCSS= ∑Pi in Cluster1 distance (Pi C1)2 +∑Pi in Cluster2distance (Pi C2)2+∑Pi in CLuster3 distance (Pi C3)2

1. 사용하고자 하는 클러스터 범위를 지정

2. 각 클러스터를 WCSS방법으로 계산

3. WCSS값과 클러스터 K 갯수에 대한 커브선 그림

4. 뾰족하게 구부러진 부분이나 특정 지점이 팔처럼 굽어지는 부분을 K로 지정

 

def visualize_elbowmethod(data, param_init='random', param_n_init=10, param_max_iter=300):
    distortions = []
    for i in range(1, 10):
        km = KMeans(n_clusters=i, init=param_init, n_init=param_n_init, max_iter=param_max_iter, random_state=0)
        km.fit(data)
        distortions.append(km.inertia_)

    plt.plot(range(1, 10), distortions, marker='o')
    plt.xlabel('Number of Cluster')
    plt.ylabel('Distortion')
    plt.show()

 

2. Silhouette Score

실루엣 값: 체가 다른 클러스터에 비해 자신의 클러스터와 얼마나 유사한 지 측정

실루엣 범위: -1에서 +1까지, 값이 높으면 자체 클러스터와 일치, 인접 클러스터와 잘 일치하지 않음을 나타냄

대부분의 개체에 높은 값이 있으면 클러스터링 구성이 적합 ( 많은 포인트의 값이 낮거나 음수이면 클러스터링 구성에 클러스터가 너무 많거나 적을 수 있음)

예시는 가장 높은 실루엣값이 있는 0.374에 매핑되는 클러스터 K=3이 적정

Comments