728x90
반응형
KMeans를 사용하여 데이터를 클러스터링하고, Silhouette Score를 이용해 각 클러스터링 결과를 평가하는 예제
- KMeans: 주어진 데이터를 k개의 군집으로 묶는 알고리즘
- Silhouette Score: 값이 클 수록 좋고 최대값은 1. 다른 그룹과 충분히 떨어져 있는 지를 봄
데이터 전처리(정규화, 분할) + KMeans + Silhouette Score
이 예제에서는 아래 과정을 포함하여 KMeans와 Silhouette Score를 사용하는 방법을 설명합니다.
- 데이터 생성
- 데이터 전처리: MinMaxScaler 또는 StandardScaler를 사용하여 데이터를 정규화합니다.
- 데이터 분할: train_test_split로 데이터를 학습용과 테스트용으로 나눕니다.
- KMeans 클러스터링: 다양한 클러스터 개수에 대해 실행합니다.
- fit으로 모델을 학습시키고, transform으로 각 데이터 포인트와 클러스터 중심 간의 거리를 계산합니다.
- predict로 각 데이터 포인트의 클러스터 라벨을 할당합니다.
- 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
반응형
'Data Science > 실습' 카테고리의 다른 글
A_1['B'].value_counts(nomalize = True) 와 pd.crosstab(A, B, nomalize = True) 가 다른 이유? (1) | 2024.12.09 |
---|---|
DataScience 예제, 샘플문항 (2) | 2024.12.08 |
DS 실습 18 - 의사결정나무 모델: 분류 및 회귀나무 (0) | 2024.12.08 |
DS 실습 17- KNN(K-Nearest Neighbor) (0) | 2024.12.07 |
DS 실습 16- 나이브 베이즈, 예측 확률값의 두번째 열이 1이 될 확률? (0) | 2024.12.07 |