Skip to content

silhouette-score

TL;DR

  • Silhouette coefficient는 클러스터링 품질을 평가하는 지표임.
  • 각 샘플의 응집도와 분리도를 기반으로 계산하며, -1에서 1 사이 값을 가짐.
  • 클러스터링 결과를 비교하고 최적의 클러스터 수를 선택할 때 유용함.

Silhouette coefficient란?

  • 클러스터링 성능을 정량적으로 평가하는 지표임.
  • 데이터 포인트가 자신의 클러스터에 얼마나 적합한지와, 다른 클러스터와 얼마나 잘 분리되었는지를 측정함.
  • 값이 1에 가까울수록 응집도와 분리도가 높음을 나타냄.

계산 방법

Silhouette coefficient \( s(i) \)는 다음 공식을 기반으로 계산됩니다:

\[ s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} \]
  • a(i): 데이터 포인트 \( i \)와 같은 클러스터의 다른 모든 데이터 포인트 간 평균 거리.
  • b(i): 데이터 포인트 \( i \)와 가장 가까운 다른 클러스터의 모든 데이터 포인트 간 평균 거리.

수도코드

  1. 각 데이터 포인트 \( i \)에 대해:
    • Step 1: 자신의 클러스터 내에서의 평균 거리 \( a(i) \) 계산.
    • Step 2: \( i \)가 속하지 않은 클러스터와의 평균 거리 계산 후, 최소값을 \( b(i) \)로 선택.
    • Step 3: \( s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} \)로 Silhouette coefficient 계산.
  2. 모든 데이터 포인트에 대해 \( s(i) \)를 평균하여 클러스터링의 전체 Silhouette score 계산.

적용 시 유의사항

  1. 클러스터 수의 영향
    • 클러스터 수 \( k \)가 너무 크면, 각 클러스터에 소수의 포인트만 포함될 수 있음. 이 경우 \( a(i) \)가 매우 작아져 \( s(i) \)가 왜곡될 가능성이 있음.
    • \( k \)가 너무 작으면, \( b(i) \)가 클러스터 간 거리를 제대로 반영하지 못함.

: Elbow method나 Gap statistic을 병행하여 적정 \( k \)를 먼저 설정하세요.

  1. 클러스터링 알고리즘의 특성

    • K-Means는 구형 클러스터를 가정하므로, 복잡한 형태의 데이터에서는 Silhouette score가 낮을 수 있음.
    • DBSCAN처럼 밀도 기반 알고리즘에서는 \( b(i) \) 계산이 어려운 경우가 있을 수 있음.

    DBSCAN처럼 밀도 기반 알고리즘에서 b(i) 계산이 어려운 이유

    1. DBSCAN의 클러스터 구조 특성

    • DBSCAN은 데이터의 밀도를 기준으로 클러스터를 형성하며, 밀도가 낮은 영역의 데이터 포인트는 노이즈(Noise)로 간주합니다.
    • 노이즈 포인트는 어떤 클러스터에도 속하지 않기 때문에, 이 포인트들에 대해 \( b(i) \)를 계산하는 것이 모호해질 수 있습니다.
      • 노이즈 포인트가 다른 클러스터와 비교되지 않으므로 \( b(i) \)를 정의하기 어렵습니다.

    : 데이터 포인트 \( i \)가 노이즈일 경우, \( a(i) \)도 없고 \( b(i) \)도 정의되지 않음.

    2. 클러스터의 형태

    • DBSCAN은 비구형(non-spherical) 클러스터를 만들 수 있으며, 클러스터 내부의 밀도와 외부의 밀도가 크게 다를 수 있습니다.
    • 이런 경우, 클러스터 간의 "가장 가까운 다른 클러스터"를 계산하는 \( b(i) \) 값이 실제 클러스터링 품질을 정확히 반영하지 못할 가능성이 있습니다.

    : 클러스터가 비구형일 경우, 두 클러스터가 실제로 잘 분리되어 있음에도 불구하고 \( b(i) \)가 작게 나올 수 있음.

    3. 클러스터의 크기와 밀도 차이

    • DBSCAN에서는 클러스터의 크기와 밀도가 다를 수 있으며, 이로 인해 두 클러스터 간 거리 계산이 왜곡될 수 있습니다.
    • \( b(i) \)를 계산할 때 다른 클러스터의 모든 데이터 포인트와 거리를 고려해야 하는데, 클러스터의 밀도가 높고 크기가 크다면, 이 계산이 데이터 분포를 제대로 반영하지 못할 수 있습니다.

    :

    • 클러스터 A: 100개의 밀집된 데이터 포인트.
    • 클러스터 B: 10개의 분산된 데이터 포인트. \( b(i) \)가 클러스터 B의 분산된 몇 개 포인트에 의해 과대 또는 과소 평가될 수 있음.

    4. 노이즈와 경계 포인트의 애매한 거리 계산

    • DBSCAN에서는 클러스터 경계에 있는 포인트들이 다른 클러스터와 밀접하게 연결될 수 있습니다.
    • \( b(i) \) 계산 시 경계 포인트의 거리가 클러스터 간의 명확한 분리를 반영하지 않을 수 있습니다.

    :

    • \( i \)가 클러스터 A의 경계에 있고, 클러스터 B와 매우 가깝다면, \( b(i) \)가 작게 나올 수 있지만 실제로는 두 클러스터가 명확히 분리되어 있을 수 있음.

    5. 노이즈와 클러스터를 동시에 고려해야 하는 상황

    • Silhouette coefficient는 클러스터와 노이즈를 동시에 다룰 수 있는 명확한 규칙을 제공하지 않습니다.
    • 결과적으로, DBSCAN에서 생성된 클러스터와 노이즈를 평가하는 데 Silhouette coefficient는 적합하지 않을 수 있습니다.

    해결 방법

    DBSCAN 결과에서 Silhouette coefficient를 계산할 때, 다음 방법을 고려할 수 있습니다:

    1. 노이즈 포인트 제외: 클러스터에 속하지 않는 포인트를 제외하고 Silhouette coefficient를 계산.
    2. 커스텀 거리 계산: 클러스터 경계와 노이즈 포인트를 다룰 수 있는 별도의 거리 계산 방식을 사용.

    DBSCAN의 특성으로 인해 Silhouette coefficient는 일반적으로 K-Means와 같은 구형 클러스터링 알고리즘에서 더 적합합니다. 밀도 기반 알고리즘에는 Davies-Bouldin Index와 같은 다른 지표를 사용하는 것이 더 적합할 수 있습니다.

    지표 최적화의 자기충족적 문제

    1. 지표 최적화의 자기충족적 문제

    • 클러스터링 알고리즘이 Silhouette coefficient를 직접 최적화한다면, 알고리즘은 단순히 이 값을 높이는 데 초점을 맞추고, 데이터의 실제 구조를 반영하지 않을 가능성이 있습니다.

    • 예를 들어, Silhouette coefficient는 클러스터 간의 분리와 클러스터 내부의 응집도에 의존하기 때문에, 특정 조건(예: 구형 클러스터)에서는 지표를 인위적으로 높이는 클러스터링이 발생할 수 있습니다.

    결과: Silhouette coefficient는 더 이상 데이터의 자연스러운 구조를 평가하지 못하고, 단순히 알고리즘의 산출물을 정당화하는 도구가 됨.

    2. 지표의 설계와 데이터 구조 간 불일치

    • Silhouette coefficient는 클러스터 간 거리와 클러스터 내부 거리를 기반으로 설계되었습니다. 하지만 실제 데이터는 비구형, 밀집도 불균일 등 다양한 구조를 가질 수 있습니다.
    • 지표 중심으로 설계된 알고리즘은 데이터의 본질적인 구조를 왜곡하거나 무시할 수 있습니다.

    : 밀도 기반 클러스터링(DBSCAN)처럼 데이터 밀도를 반영한 클러스터링에서는 Silhouette coefficient가 낮게 나올 수 있지만, 실제 클러스터링 결과는 데이터 구조를 잘 반영한 것일 수 있음.

    3. 지표에 과적합된 클러스터링의 한계

    • Silhouette coefficient를 극대화하려는 알고리즘은 일반적으로 지표에 과적합(overfitting)될 수 있습니다.
    • 이는 모델이 테스트 데이터나 새로운 데이터에 대해 일반화 능력을 잃고, 특정 지표 값을 높이는 데만 최적화된 결과를 낳습니다.

    비유: 학생이 시험 점수를 높이기 위해 시험 문제만 반복적으로 외우는 것과 비슷합니다. 시험 점수는 높아질 수 있지만, 실제 실력(데이터 구조를 잘 반영한 클러스터링)은 낮을 수 있습니다.

    4. 클러스터링 평가의 본질적 문제

    • 클러스터링은 지도 학습(supervised learning)과 달리 정답 레이블이 없기 때문에, 평가 지표를 선택하는 것이 성능을 측정하는 데 핵심적인 역할을 합니다.
    • 하나의 지표(Silhouette coefficient)만으로 클러스터링의 품질을 평가하는 것은 데이터의 복잡한 구조를 제대로 반영하지 못할 가능성이 높습니다.

    5. 어떻게 대처해야 하는가?

    • 여러 지표 활용: Silhouette coefficient와 함께 다른 평가 지표(Davies-Bouldin Index, Calinski-Harabasz Index 등)를 사용하여 다양한 관점에서 클러스터링 품질을 평가.
    • 데이터 특성에 맞는 지표 선택: 데이터의 형태, 밀집도, 클러스터 간 관계에 따라 적합한 평가 지표를 선택.
    • 도메인 지식 활용: 평가 지표에 의존하지 않고, 도메인 지식을 활용해 클러스터링 결과의 의미를 검증.
    • 알고리즘의 목표 확인: 특정 알고리즘이 Silhouette coefficient를 높이는 방식으로 작동하는지 확인하고, 지표 최적화가 데이터 구조를 왜곡하지 않는지 검토.

    결론

    Silhouette coefficient를 높이는 클러스터링 알고리즘이 있다면, 해당 지표를 품질의 유일한 기준으로 사용하는 것은 무의미할 수 있습니다. 클러스터링은 지표 그 자체보다 데이터의 의미를 반영하는지가 중요하며, 이를 위해 다양한 평가 방법과 도메인 지식을 활용해야 합니다. 지표는 방향을 제시하는 도구일 뿐, 진리 자체는 아닙니다.

  2. 계산 비용

    • 데이터 포인트 개수가 많을수록 모든 점과 클러스터 간 거리를 계산해야 하므로, 계산 비용이 매우 높아질 수 있음.

: 대규모 데이터셋의 경우, 샘플링을 통해 일부 데이터 포인트에 대해서만 Silhouette score를 계산하세요.

  1. 클러스터 내 이상점(outliers)
    • 클러스터 내 이상점은 \( a(i) \)를 왜곡하여 \( s(i) \) 값이 비정상적으로 낮아질 수 있음.
    • 이러한 값은 전체 평균에 부정적인 영향을 미침.

: 이상점을 사전에 제거하거나, 이상점에 대한 별도의 클러스터를 설정하세요.

코드 예제
import numpy as np
from sklearn.metrics import pairwise_distances

# 데이터 생성
X = np.array([[1, 2], [2, 2], [5, 6], [6, 6], [1, 0], [7, 8]])
labels = np.array([0, 0, 1, 1, 0, 1])  # 클러스터 레이블

# 전체 Silhouette Score 계산 함수
def silhouette_score_manual(X, labels):
    n_samples = X.shape[0]
    silhouette_values = []

    for i in range(n_samples):
        # 같은 클러스터와의 평균 거리
        same_cluster = X[labels == labels[i]]
        a_i = np.mean(pairwise_distances([X[i]], same_cluster))

        # 다른 클러스터와의 평균 거리
        other_clusters = [X[labels == l] for l in np.unique(labels) if l != labels[i]]
        b_i = np.min([np.mean(pairwise_distances([X[i]], cluster)) for cluster in other_clusters])

        # Silhouette coefficient 계산
        s_i = (b_i - a_i) / max(a_i, b_i)
        silhouette_values.append(s_i)

    # 평균 Silhouette score 반환
    return np.mean(silhouette_values)

# 결과 계산
score = silhouette_score_manual(X, labels)
print(f"Silhouette Score: {score}")

마무리

  • Silhouette coefficient는 클러스터링 결과를 정량적으로 비교할 수 있는 유용한 지표임.
  • 하지만 \( k \) 설정과 계산 비용 문제를 해결하기 위한 전략이 필요함.
  • 최적의 클러스터 수를 결정하고, 다른 품질 지표와 함께 사용하면 더 나은 결과를 얻을 수 있음.