✅ 5주차: 클러스터링 요약
1. 📘 클러스터링이란?
- 데이터를 유사한 특성끼리 묶는 것
- 같은 클러스터 안에서는 비슷, 다른 클러스터와는 다름
- 비지도 학습(Unsupervised Learning) 에 해당 (정답 없음)
2. 🔍 분류와의 차이
분류 (Classification)클러스터링 (Clustering)
정답(label)이 주어짐 | 정답 없음 |
지도학습(Supervised) | 비지도학습(Unsupervised) |
3. 🧠 클러스터링 알고리즘 종류
알고리즘설명
K-means | 중심점(k개)을 기준으로 데이터를 군집화 |
DBSCAN | 밀도 기반 군집화. 잡음(noise) 데이터도 처리 가능 |
4. 📏 평가 지표 – 실루엣 계수 (Silhouette Score)
- a: 같은 클러스터 내 거리의 평균 (작을수록 좋음)
- b: 다른 클러스터와의 거리 평균 (클수록 좋음)
- 실루엣 계수 = (b - a) / max(a, b)
5. ✅ 실습 과제
- DBSCAN 클러스터링 실습 → 결과 제출
- K-means 클러스터링 실습
→ k 값 여러 개로 실행, 실루엣 계수로 성능 비교
# 필요한 라이브러리 불러오기
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import numpy as np
# Iris 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target
# 특성 스케일링
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 범위 내 클러스터 개수를 탐색하며 실루엣 계수 계산
max_clusters = 10
silhouette_scores = []
for i in range(2, max_clusters + 1):
kmeans = KMeans(n_clusters=i, random_state=42)
kmeans.fit(X_scaled)
labels = kmeans.labels_
silhouette_avg = silhouette_score(X_scaled, labels)
silhouette_scores.append(silhouette_avg)
# 실루엣 계수 시각화
plt.plot(range(2, max_clusters + 1), silhouette_scores, marker='o')
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Score for Each Cluster')
plt.show()
# 최적 클러스터 개수 결정
optimal_n_clusters = np.argmax(silhouette_scores) + 2 # index 보정
print("Optimal number of clusters:", optimal_n_clusters)
# 최적 군집 개수로 K-means 클러스터링 수행
kmeans = KMeans(n_clusters=optimal_n_clusters, n_init=10)
kmeans.fit(X_scaled)
labels = kmeans.labels_
# 군집 시각화 (2D 특성 사용)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
c='r', marker='x', label='Cluster Centers')
plt.xlabel('Feature 1 (scaled)')
plt.ylabel('Feature 2 (scaled)')
plt.title('K-means Clustering with Optimal Number of Clusters')
plt.legend()
plt.show()
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import numpy as np
# 1. 데이터 준비
iris = load_iris()
X = iris.data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 2. k=3 클러스터링 (비최적)
kmeans_3 = KMeans(n_clusters=3, random_state=0)
labels_3 = kmeans_3.fit_predict(X_scaled)
score_3 = silhouette_score(X_scaled, labels_3)
# 3. k=5 클러스터링 (다른 값)
kmeans_5 = KMeans(n_clusters=5, random_state=0)
labels_5 = kmeans_5.fit_predict(X_scaled)
score_5 = silhouette_score(X_scaled, labels_5)
# 4. 시각화 - k=3
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels_3, cmap='viridis')
plt.scatter(kmeans_3.cluster_centers_[:, 0], kmeans_3.cluster_centers_[:, 1],
c='red', marker='x', label='Cluster Centers')
plt.title(f'k=3 Clustering (Silhouette={score_3:.2f})')
plt.xlabel('Feature 1 (scaled)')
plt.ylabel('Feature 2 (scaled)')
plt.legend()
# 5. 시각화 - k=5
plt.subplot(1, 2, 2)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels_5, cmap='viridis')
plt.scatter(kmeans_5.cluster_centers_[:, 0], kmeans_5.cluster_centers_[:, 1],
c='red', marker='x', label='Cluster Centers')
plt.title(f'k=5 Clustering (Silhouette={score_5:.2f})')
plt.xlabel('Feature 1 (scaled)')
plt.ylabel('Feature 2 (scaled)')
plt.legend()
plt.suptitle('K-means Clustering with Different k')
plt.tight_layout()
plt.show()
반응형