본문 바로가기
데이터관련공부/Machine Learning

K-Means Clustering

by 자유롭고 싶은 키털트 2023. 3. 13.

클러스터링 (Clustering)비지도 학습의 대표적인 알고리즘으로 클러스터링 적용의 대표적인 예시로는 일련의 고객 데이터를 공통의 특성에 따라 분류하는 고객 세그멘테이션 작업을 들 수 있다. 

 

클러스터링은 데이터셋 내 서로 비슷한 특징을 갖는 개체들의 집단인 클러스터 (Cluster) 를 찾는 프로세스이다. 여기서 같은 클러스터 내 개체들은 서로가 매우 유사한 특징을 지니지만, 다른 클러스터 내 개체와는 매우 다른 특징을 지닌다. 이상값 (Outlier) 이나 중복값 등은 어떤 클러스터에도 속하지 못한 채 발견되기도 하여 이러한 특이값을 찾는데 클러스터링이 사용되기도 한다. 

 

각 클러스터 내 고객들은 서로 유사한 특징을 지니며, 각 클러스터의 공통 특성을 고려하여 각 그룹의 프로필을 만들 수 있다.

예를 들어 클러스터링 기법을 이용하여 묶어보니 그룹1 은 경제적 여유가 있는 중년 고객으로 구성, 그룹 2는 교육 수준이 높은 젋은 고객, 그룹 3는 젊은 저소득층 고객 등으로 나뉘는 특징을 찾을 수가 있다. 

 

그렇다면 클러스터링 (Clustering) 과 분류(Classfication) 의 차이는 무엇일까?

 

  • 분류(Classfication) 는 사전에 즉, 미리 정의된 범주형 카테고리로 분류 (예시 - 채무 이행 혹은 불이행 여부) 하는 것이며, 정답이 주어지는 지도 학습의 범주에 속한다고 볼 수 있다. 
  • 클러스터링은 이와 달리 데이터 레이블이 사전에 지정되지는 않고 (즉, 결과값에 대한 레이블 선택지가 사전에 주어지지는 않음), 프로세스 자체도 비지도 학습의 유형에 속한다. 즉, 정답이 없는 상태에서 관측값들 자체의 유사성만을 기준으로 묶이게 된다. 

 

클러스터링이 적용되는 예로는:

  • 리테일 혹은 출판, 엔터테인먼트 쪽에서 고객의 구매 패턴을 찾거나, 신규 고객에게 추천 알고리즘을 적용
  • 보험이나 금융 분야에서 신용 카드 부정 사용 혹은 보험 사기 적발 (클러스터링을 통해 아웃라이어나 튀는 수치, 중복값 등을 찾는다)
  • 헬스케어 혹은 생명공학 쪽에서 유사한 유전자 정보 그룹화 

또, 클러스터링 알고리즘 종류에는 크게  다음과 같은 유형이 있다. Partition based Clustering 의 경우 주로 클러스터링의 모양이 타원형에 가깝고, 중간 혹은 대규모 데이터셋에 효율적인 특징이 있다. Density-based Clustering 은 좀 더 모양이 임의적이다. 

 

 

이 중 대표적인 클러스터링인 k-Means 에 대해 살펴보자. 

 

  • k-Means 는 클러스터 내 거리는 최소화 (Intra-cluster, minimized), 클러스터 간 거리 (Distance) 는 최대화 하는 방식 (Inter-cluster, maximized) 으로 클러스터링을 한다. 참고로, 여기서 k 는 클러스터의 개수를 의미한다. k 가 클수록 모형의 정확도는 개선되지만, k 값이 너무 커지면 선택지가 많아 지므로 분석의 의미가 줄어든다. 
  • 그렇다면 개체 간 유사성(Similarity) 혹은 비유사성 (Dissimilarity) 을 기반으로 하는 거리 (Distance) 는 도대체 어떻게 계산되는 것일까? 이 때, 유클리드 거리 (Euclidean distance) 를 사용한다. (다른 방법도 있지만 가장 보편적인 방법을 기준으로 하자)

 

예를 들어, 나이가 54살, 소득이 190인 고객와 나이가 50이며, 소득이 200 인 고객이 있을 때, 두 고객의 비유사성은 Euclidean Distance 를 사용하여 하기와 같이 계산될 수 있다. 

 

 

k-Means 에서 가장 중요한 포인트는 각 클러스터 내 Central point 를 임의로 설정하는 것이다. 그리고, 클러스터의 개수를 의미하는 k 를 정하는 것 역시 k-Means 적용에 있어서 까다로운 파트 라고 할 수 있다. 

 

k-Means 의 프로세스는 다음과 같다:

  1. 초기에 클러스터의 중심 (Central point) 설정 관련, 일단은 중심 (Central point) 을 데이터셋 내 데이터에서 임의로 선택하거나, 아님 아예 특정 지점을 임의로 지정하는 방법이 있다. 
  2. 그 후, 각 데이터들을 가장 가까운 중심 (Centroid) 이 속한 클러스터로 할당한다. Distance Matrix 를 통해 각 데이터 관측값 별로 각 중심 까지 거리를 구함으로써 가장 가까운 중심을 찾고, 해당 중심이 속한 클러스터에 할당한다. 
  3. 그런데 처음에 이 중심(Central point) 을 임의로, 즉, 무작위로 선택했기 때문에 2까지의 프로세스가 반드시 최적화된 클러스터 라고 말할 수는 없다. 이상적인 클러스터링은 SSE (각 데이터 관측값과 각 중심간의 거리의 제곱) 를 최소화 하는 클러스터링이다. 즉, 모든 클러스터 내 구성 개체와 중심 (Central point) 사이의 총 거리를 최소화 하는 방식으로 클러스터를 만들어야 하는 것이다.  
  4. 클러스터 내 데이터 관측값과 중심 사이의 총 거리를 최소화 해야 하기 때문에, 각 클러스터 내 데이터 관측값의 평균으로 중심(Central point) 또한 이동하게 된다. 
  5. 클러스터 내 중심(Central point) 이 이동 하였기 때문에 새로운 중심과 클러스터 내 모든 점 (관측 데이터) 사이의 거리는 다시 계산된다. 
  6. 클러스터 내 중심(Central point) 이 더 이상 이동 되지 않을 때까지 이 과정은 계속 반복된다. k-Means 는 반복적인 프로세스 이며, 최소 오차를 갖는 (즉, 밀도가 가장 높은) 클러스터가 생성될 때까지 이루어진다. 

 

 

 

k-means 의 성능은 어떻게 검증할까? 지도 학습 (Supervised Learning) 처럼 정답이 주어져서 정답과 모델을 통한 예측값을 비교할 수 있는 것도 아니다. 

 

내부적인 방법으로 같은 클러스터 내 각 관측값과 해당 클러스터 내 중심(Centroid) 사이의 평균 거리를 측정하는 방법이 있다. 이는 최적의 k 값을 찾는 방법이기도 하다. (엘보 메소드 (Elbow Method)

 

  • 하기 스크린샷을 살펴보자. x 축인 k 값에 증가에 따라 y 축인 각 관측값과 중심 사이의 평균 거리는 항상 감소함을 알 수 있다. 일반적으로 k 값을 증가시킬수록 중심과 관측값 내 평균 거리는 항상 감소할 수 밖에 없다.
  • 그렇기 때문에 균 거리 감소율이 급격하게 바뀌는 엘보 포인트 (Elbow point) 를 찾는다. 
  • 하기의 경우, k = 5 인 지점이다. 즉, 해당 클러스터링 모델의 경우 이상적인 클러스터링의 개수는 5개 라고 할 수 있다. 

 

k-Means 라이브러리 및 실행 코드 예시는 하기와 같다. 

 

from sklearn.cluster import KMeans # sklearn 라이브러리에서 KMeans 모듈 가져오기
 
k_means = KMeans(init='k-means++', n_clusters=4, n_init=12
 
# 파라미터 설명:
# init: 중심 관련 초기값 설정 인 듯 하다..
# n_clusters: 클러스터 및 중심 개수
# n_init: KMeans 알고리즘이 중심을 달리 하며 run 하는 횟수
 
# 모델 학습

k_means.fit(X)
 
'''
KMeans(n_clusters=4, n_init=12)
''' 
 
# 모델 내 모든 datapoint 에 대해 label 이 나타나며, 이를 k_means_labels 개체에 할당 (4개 클러스터 여서, 0, 1, 2, 3, 중 하나)
 
k_means_labels = k_means.labels_
k_means_labels
 
'''
array([2, 0, 3, ..., 2, 2, 3])
'''
 
# 각 클러스터 중심 위치를 k_means_cluster_centers 개체에 할당
 
k_means_cluster_centers = k_means.cluster_centers_
k_means_cluster_centers
 
'''
array([[ 0.96929057,  0.99313096],
       [ 4.02212758,  3.94242713],
       [ 1.99920353, -2.98619999],
       [-2.00162795, -1.0172451 ]])
'''
cs

 

클러스터링 결과 Plotting..

 

# 비주얼라이제이션 사이즈 지정
 
fig = plt.figure(figsize=(1010))
 
# set(k_means_labels) 는 결과가 4
# np.linspace(0, 1, 4) 임.. -> 0 부터 1 까지 3개의 간격으로 숫자를 만들라는 것-> (0, 0.33, 0.67, 1)
# plt.cm.spectral 을 써서 특정 칼라에 대한 array 생성
 
colors = plt.cm.Spectral(np.linspace(01len(set(k_means_labels))))
 
# plot 생성
ax = fig.add_subplot(111)
 
 
for k, col in zip(range(len([[4,4], [-2-1], [2-3], [11]])), colors):
    
    my_members = (k_means_labels == k) # k_means 라벨이 0 부터 3까지 있는데, 각각 0 인 애들, 1인 애들을 분류해 놓는 것
    
    cluster_center = k_means_cluster_centers[k] # 각 클러스터 센터 4가지를 iteration 시킴
    
    ax.plot(X[my_members, 0], X[my_members, 1], 'w', markerfacecolor=col,  marker='.'# 바로 위의  my_members 에서 각각 라벨을 0, 1, 2, 3 으로 분류해 놓은 X 데이터의 칼럼 0번째 원소를 X 축에, 칼럼 1번째 원소를 y 축에 plotting
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6# 바로 위에서 iteration 시킨 클러스터 중 칼럼 0 번째 원소를 x 축에, 칼럼 1 번째 원소를 y 축에 plotting
 
    
ax.set_title('KMeans'# 비주얼라이제이션 제목 지정
 
ax.set_xticks(()) # x축 tick 삭제
 
ax.set_yticks(()) # y축 tick 삭제
 
plt.show()
cs

 

 

본 포스팅은 하기 Coursera 강의 및 정보 문화사의 파이썬 머신러닝 판다스 데이터분석 책을 함께 참고 하였습니다. 

https://www.coursera.org/learn/machine-learning-with-python/lecture/Ky5Wf/intro-to-k-means

 

Intro to k-Means - Clustering | Coursera

Video created by IBM 기술 네트워크 for the course "Python을 통한 머신 러닝". In this module, you will learn about clustering specifically k-means clustering. You learn how the k-means clustering algorithm works and how to use k-means clusterin

www.coursera.org

 

반응형