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 이후에 정규화해야 하는가?
- 데이터 누수 방지:
- 테스트 데이터를 기준으로 정규화하지 않도록 하기 위함입니다. 모델이 테스트 데이터의 정보를 사전에 알게 되는 것을 방지합니다.
- 테스트 데이터는 학습 데이터로부터 독립적으로 다뤄야 하며, 학습 데이터로 계산한 정규화 기준만 사용해야 합니다.
- 일관성 유지:
- 학습 데이터에서 계산한 스케일 기준 (최소값, 최대값)을 테스트 데이터에도 동일하게 적용하여 데이터 분포를 일관되게 만듭니다.
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_: 각 데이터 포인트와 해당 군집 중심 간 거리의 제곱합 (작을수록 좋음).
- 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
- silhouette_score(X, labels)
- 데이터 (X): 클러스터링에 사용된 원본 데이터
- 레이블 (labels): 클러스터링 결과로 나온 클러스터 라벨
각 데이터 포인트가 속한 클러스터와 다른 클러스터 사이에서 얼마나 잘 분리되었는지를 나타냅니다.
- 높은 점수 (~1): 데이터 포인트가 자신이 속한 클러스터에 잘 속해 있고, 다른 클러스터와 잘 분리되어 있습니다.
- 낮은 점수 (~0): 데이터 포인트가 여러 클러스터의 경계에 가까이 있습니다.
- 음수 점수: 데이터 포인트가 잘못된 클러스터에 배정되었을 가능성이 높습니다.
https://sometipsfor.tistory.com/49
https://hanawithdata.tistory.com/entry/K-means-Clustering-with-Python
'Data Science > 실습' 카테고리의 다른 글
DS 실습 13~14- 단순/다중 회귀분석 (0) | 2024.12.07 |
---|---|
실기시험 준비 Python 기초 (3) | 2024.12.06 |
DS 실습 11- 상관분석(Pandas.corr, scipy) (0) | 2024.12.05 |
DS 실습9~10-데이터전처리(정렬 및 변환-crosstab, sort_values, melt/ def) (0) | 2024.12.01 |
DS 실습6~8- 데이터전처리(결측치,이상치,파생변수,데이터병합) (0) | 2024.11.24 |