Data Science/실습

KMeans와 Silhouette Score를 활용한 클러스터링 평가

에너지_2 2024. 12. 14. 09:53
728x90
반응형

2024.12.06 - [Data Science/실습] - DS 실습 12- 비계층적 군집분석(KMeans,MinMaxScaler,StandardScaler,shilhouette_score)

 

DS 실습 12- 비계층적 군집분석(KMeans,MinMaxScaler,StandardScaler,shilhouette_score)

12차시 비계층적 군집분석 GhatGPT 답:K-Means 군집분석은 데이터셋에서 **유사한 특성을 가진 그룹(클러스터)**을 찾기 위해 사용됩니다.이는 데이터 분석, 분류, 예측 등 여러 작업에 도움이 됩니

sometipsfor.tistory.com

 

KMeans를 사용하여 데이터를 클러스터링하고, Silhouette Score를 이용해 각 클러스터링 결과를 평가하는 예제

- KMeans: 주어진 데이터를 k개의 군집으로 묶는 알고리즘

- Silhouette Score: 값이 클 수록 좋고 최대값은 1. 다른 그룹과 충분히 떨어져 있는 지를 봄

 


 

데이터 전처리(정규화, 분할) + KMeans + Silhouette Score

이 예제에서는 아래 과정을 포함하여 KMeans와 Silhouette Score를 사용하는 방법을 설명합니다.

  1. 데이터 생성
  2. 데이터 전처리: MinMaxScaler 또는 StandardScaler를 사용하여 데이터를 정규화합니다.
  3. 데이터 분할: train_test_split로 데이터를 학습용과 테스트용으로 나눕니다.
  4. KMeans 클러스터링: 다양한 클러스터 개수에 대해 실행합니다.
    • fit으로 모델을 학습시키고, transform으로 각 데이터 포인트와 클러스터 중심 간의 거리를 계산합니다.
    • predict로 각 데이터 포인트의 클러스터 라벨을 할당합니다.
  5. Silhouette Score: 클러스터링 결과를 평가합니다.
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.model_selection import train_test_split

# 1. 데이터 생성 (DataFrame 타입)
np.random.seed(42)
data = {
    "Feature1": np.random.uniform(0, 100, 500),
    "Feature2": np.random.uniform(0, 200, 500),
    "Feature3": np.random.uniform(-50, 50, 500),
}
df = pd.DataFrame(data)

# 2. 데이터 전처리: 정규화 (MinMaxScaler 사용)
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)

# 3. 데이터 분할 (train/test split)
X_train, X_test = train_test_split(scaled_data, test_size=0.2, random_state=42)

# 4. KMeans 클러스터링
range_n_clusters = [2, 3, 4, 5, 6]
results = []

for n_clusters in range_n_clusters:
    # (a) KMeans 모델 생성 및 학습
    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    kmeans.fit(X_train)  # 모델 학습 (fit)
    transformed_data = kmeans.transform(X_train)  # 클러스터와의 거리 계산 (transform)
    
    # (b) 학습 데이터에 대해 클러스터 라벨 예측
    cluster_labels_train = kmeans.predict(X_train)  # 각 데이터 포인트의 클러스터 라벨을 할당
    score_train = silhouette_score(X_train, cluster_labels_train)
    results.append((n_clusters, score_train))
    print(f"Number of clusters: {n_clusters}, Silhouette Score (train): {score_train:.4f}")

# 5. 최적의 클러스터 개수 선택
optimal_n_clusters, optimal_score = max(results, key=lambda x: x[1])
print(f"\nOptimal number of clusters: {optimal_n_clusters}, Highest Silhouette Score: {optimal_score:.4f}")

# 6. 최적 클러스터 개수로 테스트 데이터 평가
kmeans_optimal = KMeans(n_clusters=optimal_n_clusters, random_state=42)
kmeans_optimal.fit(X_train)  # 모델 재학습
transformed_test_data = kmeans_optimal.transform(X_test)  # transform 사용
cluster_labels_test = kmeans_optimal.predict(X_test)  # 테스트 데이터 예측

# 테스트 데이터의 Silhouette Score 계산
test_score = silhouette_score(X_test, cluster_labels_test)
print(f"Silhouette Score (test): {test_score:.4f}")

# 7. 클러스터 중심 출력
print("\nCluster centers (scaled):")
print(kmeans_optimal.cluster_centers_)
반응형
300x250

 

728x90
반응형