Data Science/실습

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

에너지_2 2024. 12. 6. 00:21
728x90
반응형

12차시 비계층적 군집분석

k-means 

- 임의의 k개의 점을 기반으로 가까운 거리의 데이터를 묶는 것과 더불어 평균을 활용하는 군집분석 기법

- 군집 개수(k)를 확정하기 위해 여러 번의 시행착오 필요

- 결과 고정을 위해 seed 설정 필요

 


KMeans 모델링 전 보통 데이터 정규화를 많이 하기 때문에

MinMaxScaler / StandardScaler 먼저 설명한다.

# scikit-learn 패키지의 MinMaxScaler 클래스를 불러옵니다.
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
sklearn - MinMaxScaler()

- MinMax 정규화를 실시하는 함수

 - 데이터를 최소값과 최대값 사이의 특정 범위 (보통 [0, 1])로 스케일링합니다.

- MinMax  객체 생성 -> fit() 메서드로 규칙 모델을 만들고 -> transform() 함수로 변환을 실시

 

 

train_test_split와 MinMaxScaler 사용

더보기

문제 중에 train_test_split와 MinMaxScaler 사용하는 것이 있다.

 "평가 데이터 세트는 학습 데이터 세트 기반으로 정규화 하시오."

왜 train_test_split 이후에 정규화해야 하는가?

  1. 데이터 누수 방지:
    • 테스트 데이터를 기준으로 정규화하지 않도록 하기 위함입니다. 모델이 테스트 데이터의 정보를 사전에 알게 되는 것을 방지합니다.
    • 테스트 데이터는 학습 데이터로부터 독립적으로 다뤄야 하며, 학습 데이터로 계산한 정규화 기준만 사용해야 합니다.
  2. 일관성 유지:
    • 학습 데이터에서 계산한 스케일 기준 (최소값, 최대값)을 테스트 데이터에도 동일하게 적용하여 데이터 분포를 일관되게 만듭니다.
sklearn - StandardScaler()

- 표준화를 실시하는 함수

- 데이터를 평균이 0, 분산이 1이 되도록 변환

- fit() 메서드로 규칙 모델을 만들고 -> transform() 함수로 변환을 실시

from sklearn.preprocessing import MinMaxScaler, StandardScaler
import numpy as np

# 데이터 생성
data = np.array([[10], [20], [30], [40], [50]])

# MinMaxScaler 적용
minmax_scaler = MinMaxScaler()
data_minmax_scaled = minmax_scaler.fit_transform(data)
print("MinMaxScaler 결과:")
print(data_minmax_scaled)

# StandardScaler 적용
standard_scaler = StandardScaler()
data_standard_scaled = standard_scaler.fit_transform(data)
print("\nStandardScaler 결과:")
print(data_standard_scaled)

sklearn -  KMeans()

- k-means 군집분석 실시

- fit으로 모델을 학습시키고, transform으로 각 데이터 포인트와 클러스터 중심 간의 거리를 계산합니다.

- predict로 각 데이터 포인트의 클러스터 라벨을 할당합니다.

 

  • fit:
    • 데이터를 바탕으로 최적의 클러스터 중심(centroids)을 학습합니다.
    • 데이터의 변화는 없지만, 클러스터 중심이 점진적으로 이동하면서 수렴합니다.
  • transform:
    • 각 데이터 포인트와 클러스터 중심 간의 거리를 계산하여 새로운 특징(거리)을 반환합니다.
    • 원래 데이터에 변화가 발생하며, 데이터가 중심에서 얼마나 떨어져 있는지로 바뀝니다.
  • predict:
    • 학습된 클러스터 중심(centroids)을 바탕으로 각 데이터 포인트의 클러스터 할당을 예측합니다.
    • 데이터 포인트가 클러스터에 속하는지를 기준으로 시각화할 수 있습니다.

 

 

- KMeans 객체 생성 -> fit (X) 사용 -> cluster_centers_ (군집중심 mean), labels_ (각 행의 군집번호) 확인


from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 샘플 데이터 생성
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)

# KMeans 모델 생성
kmeans = KMeans(n_clusters=4, random_state=42)

# 1. fit: 데이터로 모델 학습 (군집 중심 계산)/ 입력 데이터의 군집 중심(centroid)을 찾는 과정
kmeans.fit(X)

# 2. transform: 각 데이터 포인트와 군집 중심 간의 거리 계산
# 반환 값은 "데이터 포인트별 각 클러스터와의 거리" 행렬
distances = kmeans.transform(X)  # 결과: (300 x 4) 크기의 배열 (300개의 샘플, 4개의 클러스터)

# 3. predict: 새로운 데이터 포인트가 어떤 클러스터에 속하는지 예측
cluster_labels = kmeans.predict(X)  # 결과: 각 데이터 포인트의 클러스터 레이블 (0, 1, 2, 3)

#  fit 이후 주요 속성
kmeans.cluster_centers_: 군집 중심의 좌표.
kmeans.labels_: 각 데이터 포인트의 클러스터 라벨.
kmeans.inertia_: 각 데이터 포인트와 해당 군집 중심 간 거리의 제곱합 (작을수록 좋음).

 

ex) 단계별 데이터 변

 

ex2

 

  • Step 1: Raw Data
    • 원본 데이터의 Glucose와 BMI 변수를 스케일링하여 시각화한 결과입니다.
  • Step 2: After fit (Centroids)
    • KMeans 모델을 학습시킨 후, 군집의 중심점(centroids)을 확인할 수 있습니다.
  • Step 3: After transform (Distances)
    • 각 데이터 포인트가 가장 가까운 군집 중심(centroid)까지의 거리를 색상으로 나타냈습니다. 가까울수록 파란색, 멀수록 빨간색입니다.
  • Step 4: After predict (Clustered Data)
    • predict를 통해 각 데이터가 어떤 군집에 속하는지를 예측한 결과입니다. 색상은 군집별로 구분되며, 중심점(centroids)은 빨간색 X로 표시됩니다.

 


Silhouette Score는 클러스터링의 품질을 측정하는 지표이다.

silhouette_score
  1. silhouette_score(X, labels)
  2. 데이터 (X): 클러스터링에 사용된 원본 데이터
  3. 레이블 (labels): 클러스터링 결과로 나온 클러스터 라벨

각 데이터 포인트가 속한 클러스터와 다른 클러스터 사이에서 얼마나 잘 분리되었는지를 나타냅니다.

  • 높은 점수 (~1): 데이터 포인트가 자신이 속한 클러스터에 잘 속해 있고, 다른 클러스터와 잘 분리되어 있습니다.
  • 낮은 점수 (~0): 데이터 포인트가 여러 클러스터의 경계에 가까이 있습니다.
  • 음수 점수: 데이터 포인트가 잘못된 클러스터에 배정되었을 가능성이 높습니다.

https://sometipsfor.tistory.com/49

 

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

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

sometipsfor.tistory.com

 

https://hanawithdata.tistory.com/entry/K-means-Clustering-with-Python

 

K-means Clustering with Python

데이터역량 키우는 하루하루의 기록

hanawithdata.tistory.com

반응형
300x250

 

728x90
반응형