머신러닝(군집화)

3 minute read

Clustering

클러스터링은 주어진 데이터들의 특성을 고려해 데이터 클러스터를 정의하고, 클러스터를 대표할 수 있는 대표점을 찾는 비지도 학습의 대표적인 알고리즘 입니다.
간단히 말해서, 비슷한 특성을 가진 데이터끼리 묶는다고 말할 수 있습니다.

1. k-Means 클러스터링

k-means 클러스터링은 대표적인 클러스터링 알고리즘 중 하나로, 각 클러스터에 할당된 데이터 포인트들의 평균 좌표를 이용해 중심점을 반복적으로 업데이트하며 클러스터를 형성하는 알고리즘 입니다.

k-means Clustering 알고리즘은 3가지 단계로 이루어집니다.
Step 1. 각 데이터 포인트 i 에 대해 가장 가까운 중심점을 찾고, 그 중심점에 해당하는 클러스터를 할당합니다.
가까운 중심점을 찾을 때는, 유클리드 거리를 사용합니다.
Step 2. 할당된 클러스터를 기반으로 새로운 중심점을 계산합니다. 중심점은 클러스터 내부 점들 좌표의 산술 평균(mean) 으로 합니다.
Step 3. 각 클러스터의 할당이 바뀌지 않을 때까지 반복합니다.

점가 점사이의 거리를 측정하는 방법

  1. Mangattan Distance - 각 축에 대해 수직으로만 이동하여 계산하는 거리 측정방식

  2. Euclidean Distance - 점과 점사이의 가장 짧은 거리를 계산하는 거리 측정 방식

준비

  1. min-max 정규화를 통해 조정해줍니다.

  2. 차원이 높으면 우리 눈으로 볼 수 있도록 표현하기 어려우므로 pca로 2차원으로 만들어 줍니다.

시작

     # 모델 불러오기 및 정의하기
    from sklearn.cluster import KMeans
    kmeans = KMeans(n_clusters=3)
    # 모델 학습하기(클러스터링을 통한 중심점 찾기)
    kmeans.fit(data)
    # 클러스터 할당
    cluster = kmeans.predict(data)
    # 결과 살펴보기
    plt.scatter(data[:, 0], data[:, 1], c=cluster, linewidth=1, edgecolor='black')
    plt.show()  

2. Hierarchical Clustering

Hierarchical Clustering은 거리(Distance) 또는 유사도(Similarity)를 기반으로 클러스터를 형성하는 알고리즘 입니다.
k-means Clustering과 다르게 클러스터의 수를 설정해 줄 필요가 없으며, 클러스터 형태를 시각적으로 표현해주는 덴드로그램을 통해 적절한 클러스터의 수를 선택할 수 있습니다.
Hierachichal Clustering에는 Bottom-Up 방식의 Agglomerative Method와 Top-Down 방식의 Divisive Method로 나뉩니다.
이번 단원에서는 Agglomerative Method를 사용해 실습을 진행합니다.

Agglomerative Method를 사용한 Hierarchical Clustering 알고리즘은 3가지 단계로 이루어집니다.
Step 1. 각 데이터 포인트를 클러스터로 할당합니다. (n개의 클러스터)
Step 2. 가까운 클러스터끼리 병합합니다.
Step 3. 1개의 클러스터가 될 때까지 반복합니다.

가장 가까운 클러스터를 찾을 수 있는 방법

  1. Single Linkage - 두 클러스터 내의 가장 가까운 점 사이의 거리

  2. Complete Linkage - 두 클러스터 내의 가장 먼 점 사이의 거리

  3. Average Linkage - 두 클러스터 내의 모든 점 사이의 평균 거리

    # 모델 불러오기 및 정의하기
    from sklearn.cluster import AgglomerativeClustering
    single_clustering = AgglomerativeClustering(n_clusters=3, linkage='single')
    # 모델 학습하기(클러스터링을 통한 중심점 찾기)
    single_clustering.fit(data)
    # 클러스터 할당
    single_cluster = single_clustering.labels_
    # 결과 살펴보기
    plt.scatter(data[:,0], data[:,1], c=single_cluster)
    plt.title('Sklearn Single Linkage Hierarchical Clustering')
    plt.show()  
complete와 average는 linkage안의 내용을 바꿔주면 된다.

클러스터링 결과 비교하기

  1. Single Linkage

    • 두 클러스터 내의 가장 가까운 점을 기준으로 클러스터를 합치기 클러스터 사이의 노이즈에 매우 민감한 특성과 구 형태가 아닌 데이터에 대해 클러스터를 잘 형성한다는 특성이 있습니다.
    • wine 데이터는 모든 데이터가 연결되어 있는 듯한 분포를 가지고 있기 때문에, 각 클러스터의 경계가 모호한 노이즈가 많은 형태를 띠고 있습니다.
      Single Linkage가 구 형태가 아닌 데이터에 대해 클러스터를 잘 형성한다는 특성이 있지만, 이러한 데이터의 경우 Single Linkage 방법을 사용하면 좋은 클러스터를 생성하기 어렵습니다.
  2. Complete Linkage

    • 두 클러스터 내에 가장 먼 점을 기준으로 클러스터를 합치기 때문에 클러스터 사이의 노이즈와 이상치에 민감하지 않은 특성이 있습니다.
    • 노이즈에 민감하지 않다는 특성을 가진 Complete Linkage가 좋은 성능을 보여주었습니다.
  3. Average Linkage

    • Single Linkage와 Complete Linkage의 중간쯤에 위치한 Average Linkage가 가장 정답에 가까운 클러스터를 형성한 것을 확인할 수 있습니다.

Evaluation

Silhouette

  • 실루엣 값은 한 클러스터 안의 데이터들이 다른 클러스터와 비교해서 얼마나 비슷한가를 나타냅니다.
  • 같은 클러스터 내의 점들간 거리는 가깝고(cohesion) 서로 다른 클러스터 간의 거리는 멀수록(separation) 높은 값을 얻을 수 있습니다.
  • 실루엣 값이 1에 근접한다는 것은 같은 클러스터 내의 평균거리가 다른 클러스터와의 평균거리보다 가깝다는 것을 의미합니다.
  • 일반적으로 실루엣 값이 0.5보다 크다면 데이터가 잘 클러스터링 되었다는 것을 나타냅니다.

Silhouette 스코어링은 Sklearn의 metrics 패키지에 있습니다.

    from sklearn.metrics import silhouette_score
    best_n = 1
    best_score = -1

    for n_cluster in range(2, 11):
    kmeans = KMeans(n_clusters=n_cluster)
    kmeans.fit(data)
    cluster = kmeans.predict(data)
    score = silhouette_score(data, cluster)
    
    print('클러스터의 수 : {}, 실루엣 점수 : {:.2f}'.format(n_cluster, score))
    if score > best_score :
        best_n = n_cluster
        best_score = score
        
    print('가장 높은 실루엣 점수를 가진 클러스터 수 : {}, 실루엣 점수 : {:.2f}'.format(best_n, best_score))

Leave a comment