본문 바로가기
머신러닝/비지도학습

[머신러닝(비지도)] #2 - Clustering_241021

by 황오독 2024. 10. 21.

<Clustering>

1. K-means

K-means 절차

 

 (1) KMeans 함수 사용

   - k : n_clusters

   - n_inti : 초기값은 무작위 지정하여 결과가 조금씩 차이가 남.

                 - 지정된 회수 만큼 수행하여 가장 좋은 군집모델 선택

                 - 'auto' 데이터 크기와 군집 수에 맞게 적정하게 지정 (권장사항)

   - 학습 시 x만 입력

# K means 학습
model = KMeans(n_cluster=2, n_init='auto')
model.fit(x)

# 예측
pred = model.predict(x)

 

 (2) 클러스터 개수(k) 지정

   ① Inertia value : 군집화가 된 후에, 각 중심점에서 군집의 데이터 간의 거리를 합산한 값

     - 값이 작을수록 군집화가 잘되어있음.

 

 

# k의 갯수에 따라 각 점과의 거리를 계산하여 적정한 k를 찾아 봅시다.
kvalues = range(1, 11)
inertias = []

for k in kvalues:
    model = KMeans(n_clusters=k, n_init = 'auto')
    model.fit(x)
    inertias.append(model.inertia_)
    
# Plot k vs inertias
plt.figure(figsize = (8, 6))
plt.plot(kvalues, inertias, marker='o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.grid()
plt.show()

 

적절한 k 값 : 4

 

   ② Silhouette_score (실루엣 점수) => 최소한 k가 2개 이상이어야 함.

     : 1에 근접할 수록 적절 (클러스트 간 거리는 멀고, 내부의 거리는 가까움)

       0에 근접 (클러스터 간 거리와 내부 거리 비슷_중첩)

       -1에 근접 (클러스터링 결과 부적절)

from sklearn.metrics import silhouette_score

# 클러스터 개수에 따른 실루엣 점수를 저장할 리스트
kvalues = range(2, 11) # 최소 2개 이상이어야 함.
sil_score = []

for k in kvalues:
    # KMeans 모델 생성
    model = KMeans(n_clusters=k, n_init = 'auto')

    # 모델을 학습하고 예측
    pred = model.fit_predict(x)

    # 실루엣 점수 계산
    sil_score.append(silhouette_score(x, pred))
    
# 실루엣 점수 시각화
plt.figure(figsize = (8, 6))
plt.plot(kvalues, sil_score, marker='o')
plt.xlabel('n_clusters')
plt.ylabel('Silhouette Score')
plt.grid()
plt.show()