계층적 군집화 란? (Hierarchical Clustering)
계층적 군집화는 데이터 포인트를 계층 구조(hierarchy)로 그룹화하는 비지도 학습 기법입니다.
클러스터의 수를 사전에 정의할 필요 없이, 데이터 간의 유사도를 기반으로 그룹화 과정을 시각적으로 표현할 수 있습니다.
이 방법은 병합형(Agglomerative)과 분할형(Divisive) 두 가지 주요 방식으로 나뉩니다.
1. 병합형 군집화 (Agglomerative Clustering)
- Bottom-up 접근법을 사용하여 모든 데이터 포인트를 각각 하나의 클러스터로 시작합니다.
- 각 반복 단계에서 가장 가까운 두 클러스터를 합치며, 최종적으로 하나의 클러스터가 될 때까지 진행합니다.
2. 분할형 군집화 (Divisive Clustering)
- Top-down 접근법을 사용하여 전체 데이터를 하나의 클러스터로 시작합니다.
- 점진적으로 클러스터를 나누어 데이터를 세분화합니다.
- 계산량이 많아 병합형에 비해 덜 사용됩니다.
군집 간 유사도 측정 방법 (링케이지 방법)
군집화 과정에서 클러스터 간 거리를 측정하는 방법에는 다음과 같은 기준이 있습니다.
- 단일 연결 (Single Linkage):
- 두 클러스터 간 가장 가까운 데이터 포인트 간의 거리를 기준으로 합니다.
- 복잡한 형태의 클러스터를 발견할 수 있지만, 노이즈에 민감하고 긴 체인 형태로 연결될 위험이 있습니다.
- 완전 연결 (Complete Linkage):
- 두 클러스터 간 가장 먼 데이터 포인트 간의 거리를 기준으로 합니다.
- 더 밀집된 클러스터를 찾는 데 적합하지만, 긴 형태의 클러스터는 잘 감지하지 못합니다.
- 평균 연결 (Average Linkage):
- 클러스터 내 모든 데이터 포인트 간 평균 거리를 기준으로 합니다.
- 단일 연결과 완전 연결의 절충안입니다.
- 중심 연결 (Centroid Linkage):
- 각 클러스터의 중심점(centroid) 간의 거리를 기준으로 합니다.
- 와드 연결 (Ward’s Method):
- 두 클러스터를 합쳤을 때 증가하는 SSE를 기준으로 합니다.
- 가장 일반적으로 사용되며, 밀집된 클러스터를 찾는 데 효과적입니다.
덴드로그램 (Dendrogram)
- 계층적 군집화 결과를 시각적으로 표현하는 트리 구조.
- 축의 의미:
- x축: 데이터 포인트.
- y축: 클러스터 병합 시점의 거리(또는 유사도).
- 덴드로그램을 사용해 원하는 클러스터의 수를 결정할 수 있습니다. 특정 y축 값을 기준으로 덴드로그램을 자르면 클러스터를 형성합니다.
장점
- 클러스터 개수를 사전에 정의할 필요가 없습니다.
- 덴드로그램을 통해 데이터의 계층 구조를 시각화할 수 있습니다.
- 다양한 거리와 연결 기준을 적용할 수 있어 유연성이 높습니다.
단점
- 대규모 데이터셋에 대해 계산 비용이 높습니다.
- 클러스터가 병합되면 되돌릴 수 없습니다(탐욕적 접근).
- 데이터의 스케일에 민감하며, 적절한 전처리가 필요합니다.
실생활 응용
- 문서 분류: 텍스트 문서 간의 유사도를 기반으로 분류.
- 유전자 분석: 유전자 간 유사성을 기반으로 그룹화.
- 고객 세분화: 고객 데이터를 계층적으로 분류하여 구매 패턴 분석
예시
- 데이터 로드 및 전처리
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
import scipy.cluster.hierarchy as sch
# 데이터셋 불러오기
df = pd.read_csv('Mall_Customers.csv')
# 데이터 확인
print(df.head())
# 필요한 열만 선택
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]
# 데이터 정규화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- 덴드로그램 생성
# 덴드로그램 생성
plt.figure(figsize=(10, 7))
dendrogram = sch.dendrogram(sch.linkage(X_scaled, method='ward'))
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Euclidean distances')
plt.show()
- 계층적 군집화 모델 구현
# 계층적 군집화 모델 생성
hc = AgglomerativeClustering(n_clusters=5, metric='euclidean', linkage='ward')
# 모델 학습 및 예측
y_hc = hc.fit_predict(X_scaled)
# 결과 시각화
plt.figure(figsize=(10, 7))
plt.scatter(X_scaled[y_hc == 0, 0], X_scaled[y_hc == 0, 1], s=100, c='red', label='Cluster 1')
plt.scatter(X_scaled[y_hc == 1, 0], X_scaled[y_hc == 1, 1], s=100, c='blue', label='Cluster 2')
plt.scatter(X_scaled[y_hc == 2, 0], X_scaled[y_hc == 2, 1], s=100, c='green', label='Cluster 3')
plt.scatter(X_scaled[y_hc == 3, 0], X_scaled[y_hc == 3, 1], s=100, c='cyan', label='Cluster 4')
plt.scatter(X_scaled[y_hc == 4, 0], X_scaled[y_hc == 4, 1], s=100, c='magenta', label='Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Age')
plt.ylabel('Annual Income (k$)')
plt.legend()
plt.show()
- 모델 평가
from sklearn.metrics import silhouette_score
# 실루엣 점수 계산
silhouette_avg = silhouette_score(X_scaled, y_hc)
print(f'Silhouette Score: {silhouette_avg}')
- 실루엣 스코어
- -1 부터 1까지
- 1 에 가까울수록 성능이 좋음
'AI > ML' 카테고리의 다른 글
[ML] 비지도학습 - 차원축소 (PCA) (0) | 2024.12.29 |
---|---|
[ML] 비지도학습 - 군집화모델 (DBSCAN) (0) | 2024.12.29 |
[ML] 비지도학습 - 군집화모델 (K-means Clustering) (0) | 2024.12.29 |
[ML] 지도학습 - 분류모델 (의사결정나무) (2) | 2024.12.29 |
[ML] 지도학습 - 분류모델 (나이브 베이즈) (0) | 2024.12.29 |