1. Silhouette Score?
[STUDY/ML(Machine Learning)] - [ML] K-means clustering
[ML] K-means clustering
1. K-means clustering?데이터를 $K$개의 그룹(군집)으로 자동으로 나눠주는 비지도학습 알고리즘각 군집을 대표하는 중심점(centroid)을 그 군집에 속한 데이터들의 평균(mean) 위치로 잡아가면서 군집을
blog.chaenii.me
클러스터링은 비지도학습이라 "정답"이 없다. KMeans를 $K=10$으로 돌린 결과와 $K=70$으로 돌린 결과 중 뭐가 더 "좋은" 군집인지 어떻게 판단할까?
우선 좋은 군집화란: 같은 군집 안의 데이터끼리는 가깝고, 다른 군집과는 멀어야 한다
이 두 조건을 하나의 점수로 합쳐, 좋은 군집화의 표준 지표가 되는 것이 Silhouette Score다.
2. 계산
수식
데이터 포인트 하나(예: $x$)에 대해:
- $a$ = $x$와 같은 군집에 속한 다른 모든 점들까지의 평균 거리 ("내부 응집도" — 작을수록 좋음)
- $b$ = $x$와 가장 가까운 다른 군집에 속한 점들까지의 평균 거리 ("외부 분리도" — 클수록 좋음)
$$
s(x) = \frac{b - a}{\max(a, b)}
$$
- 전체 실루엣 스코어: 모든 데이터 포인트의 $s(x)$를 평균낸 값.
왜 분모가 $\max(a,b)$인가?
분모 역할은 분자 $(b-a)$를 $[-1,1]$ 범위로 정규화하는 것이다.
$a, b$ 둘 다 양수인 거리이고, 둘 중 큰 값보다 둘의 차이가 더 클 수 없으므로 $|b-a| \le \max(a,b)$가 항상 성립한다.
-> $\max(a,b)$로 나누면 자동으로 $-1 \le s(x) \le 1$ 범위에 들어온다.
굳이 $a+b$나 다른 값으로 나누지 않고 $\max(a,b)$를 쓰는 이유는,
둘 중 더 "안 좋은"(더 큰) 거리를 기준으로 잡아서 점수가 한쪽 극단에 치우치지 않게 균형을 맞추기 위함이다.
계산해보기
아주 작은 예시로 감을 잡아보자.
1차원 직선 위에 점 5개가 있고, 군집이 2개로 나뉘어 있다고 하자
군집 A = {1, 2, 3}, 군집 B = {8, 9}.
점 $x=2$ (군집 A 소속)를 기준으로 계산하면:
- $a$ = 같은 군집(A)의 다른 점들까지 평균 거리 = $\frac{|2-1| + |2-3|}{2} = \frac{1+1}{2} = 1$
- $b$ = 가장 가까운 다른 군집(B)의 점들까지 평균 거리 = $\frac{|2-8| + |2-9|}{2} = \frac{6+7}{2} = 6.5$
- $s(2) = \frac{b-a}{\max(a,b)} = \frac{6.5 - 1}{6.5} \approx 0.846$
자기 군집과는 가깝고(1) 다른 군집과는 멀어서(6.5), 점수가 1에 가깝게 나온다.
-> 군집이 잘 분리된 경우의 전형적인 모습.
같은 방식으로 모든 점에 대해 계산해서 평균을 내면 전체 실루엣 스코어가 나온다.

값 해석
- 1 \le s \le 1
- $s \approx 1$: $a \ll b$ — 자기 군집과는 아주 가깝고 다른 군집과는 멀다. 군집 분리가 잘 됨
- $s \approx 0$: $a \approx b$ — 군집 경계에 애매하게 걸쳐 있음
- $s \approx -1$: $a \gg b$ — 사실 다른 군집에 더 가까운데 잘못 배정됨
실전에서 0.7 이상이면 꽤 잘 분리된 것으로 보고, 0.5 이하면 군집 경계가 흐릿하다고 본다 (절대적인 기준은 아니고 도메인에 따라 다름).
3. 거리 메트릭 선택
$a$, $b$를 계산할 때 어떤 거리 함수를 쓰느냐를 고를 수 있다.(유클리드 거리, 코사인 거리 등.)
텍스트 기반 군집(TF-IDF 벡터 등)에는 코사인 거리를 쓰는 게 일반적이고,
이미 저차원으로 변환된 dense 벡터(SVD 적용 후)에는 유클리드 거리를 쓰는 경우가 많다.
같은 데이터라도 어떤 거리 메트릭을 쓰느냐에 따라 점수가 다르게 나올 수 있으니,
서로 다른 군집화 방법을 비교할 때는 같은 메트릭으로 맞춰서 비교해야 한다.
(혹은 메트릭이 다르다는 걸 명시해야 함)
4. 계산 비용과 샘플링
실루엣 스코어 계산은 모든 점 쌍 사이의 거리를 계산해야 한다.
-> 데이터가 $N$개면 $O(N^2)$ 비용
-> 데이터가 수만~수십만 건이면 이 계산이 너무 느려진다.
그래서 실전에서는 전체 데이터가 아니라 무작위로 뽑은 일부(예: 1만 개)에 대해서만 계산하고,
이를 "샘플링된 실루엣 스코어"라고 부른다.
전체를 정확히 대표하진 않지만 합리적인 근사치를 빠르게 얻을 수 있다.
5. 다른 평가 지표: empty cluster, 군집 크기 분포
실루엣 스코어 외에도 실전에서 중요하게 보는 것들:
- 빈 군집(empty cluster) 개수
- 목표가 $K$개일 때, 실제로 데이터가 하나도 배정 안 된 군집이 몇 개인지.
- 많으면 $K$를 잘못 잡았거나 알고리즘이 데이터 분포에 안 맞는다는 신호
- 군집 크기 분포(최대/최소/중간값)
- 한 군집에 데이터가 몰려있고 나머지는 텅 비어있다면 "균형 잡힌 군집화"가 아니다
이 두 지표는 KMeans와 SOM처럼 서로 다른 클러스터링 방법을 비교할 때 실루엣 스코어보다 오히려 더 직관적으로 차이를 보여줄 때가 많다.
예를 들어 격자가 고정된 SOM은 데이터 분포가 70개 칸에 균등하게 안 맞으면 빈 칸이 많이 생기는데, 자유롭게 움직이는 KMeans는 빈 군집이 거의 안 생긴다.
6. 마무리
- 실루엣 스코어 = "같은 군집과는 가깝고, 다른 군집과는 먼가"를 $-1$~$1$로 수치화한 지표
- $s(x) = (b-a)/\max(a,b)$ — 1에 가까울수록 잘 분리된 군집, 0이면 경계가 애매, 음수면 잘못 배정된 것
- 거리 메트릭(유클리드/코사인) 선택에 따라 점수가 달라지므로, 서로 다른 군집화 방법을 비교할 땐 메트릭을 통일해야 함
- 계산량이 $O(N^2)$이라 대용량에서는 샘플링해서 근사치를 구함
- 빈 군집 개수, 군집 크기 분포도 함께 보는 게 실전적
GitHub 댓글