본문 바로가기

카테고리 없음

1019 군집화 KMeans

군집화 KMeans

비지도 학습

kmeans = KMeans(n_clusters=3, #3개의 군집 중심점
                init = 'k-means++', 
                max_iter = 300, # 군집 이동을 최대 몇번 반복할건지                
                random_state = 0).fit(irisDF) #irisDF :정답값을 안넣음!!

n_cluster :  k의 수를 정하면 임의로 k개의 군집 중심점을 설정하게 됨

이렇게 찍고 나서 가까운 샘플들과의 거리를 구함, 그 후 군집 중심점이 이동함 (자기가 가깝다고 측정된 샘플들의 중심으로 )

그리고 샘플들과의 거리를 다시 구함 -> 그리고 중심점 다시 이동

> 이렇게 하다가 중심점을 이동하였지만 데이터들의 중심점이 바뀌지 않을 때까지 군집화 완료

max_iter : 군집 이동시 최대 반복 횟수

irisDF['target']= iris.target  #비교하기 위해서 타겟 불러옴
irisDF['cluster'] = kmeans.labels_

iris_result = irisDF.groupby(['target','cluster'])['sepal length'].count()
iris_result

 

차원축소

from sklearn.decomposition import PCA #차원축소

pca = PCA(n_components = 2)
pca_transformed = pca.fit_transform(iris.data)

irisDF['pca_x'] = pca_transformed[:,0]
irisDF['pca_y'] = pca_transformed[:,1]

iris.data 4개의 속성 중에 2개가 선택됨

# clsuter 값에 따라 index 추출
marker0_ind = irisDF[irisDF['cluster']==0].index
marker1_ind = irisDF[irisDF['cluster']==1].index
marker2_ind = irisDF[irisDF['cluster']==2].index

# cluster 값에따라 pca_x, pca_y 값 추출 marker 표시
plt.scatter(x=irisDF.loc[marker0_ind, 'pca_x'], y=irisDF.loc[marker0_ind, 'pca_y'], marker = 'o')
plt.scatter(x=irisDF.loc[marker1_ind, 'pca_x'], y=irisDF.loc[marker1_ind, 'pca_y'], marker = 's')
plt.scatter(x=irisDF.loc[marker2_ind, 'pca_x'], y=irisDF.loc[marker2_ind, 'pca_y'], marker = '^')

plt.xlabel('PCA 1')
plt.ylabel('PCA 2')

 

군집 평가

실제 데이터는 군집 개수를 알 수 없다.  > 군집평가가 정확한 결과인지 알 수 없어 이를 평가하기 위해 실루엣 분석을 사용함

==> 군집평가의 한계를 극복하기 위해 "실루엣 분석" 사용

 

실루엣 분석

각 군집간 거리가 얼마나 효과적으로 분리되어있는지 나타냄. 효율적으로 잘 분리되었다는 것은 다른 군집과의 거리는 멀리 떨어져있고 동일한 군집을 거리가 가까운 것임

실루엣 분석은 실루엣 계수를 기반으로 한다. 

실루엣 분석 개념

 

- 실루엣 계수는 -1 ~ 1 사이의 값을 가지며 1에 가까울수록 군집과 멀리 떨어져있는 것이고, 0과 가까울수록 근처 군집과 가까워짐 

* 음의 값일 경우 다른 군집에 할당되었음을 뜻한다

실루엣 계수가 -값이면 제대로 된 군집에 할당이 안된 것! 
예를 들어 s(1) 에서 1이 a 에 속했는데 -면 b 보다 a 거리가 큰 거니까, b에 있는 데이터들까지의 거리보다 a에 속한 데이터들까지의 거리가 큰 거임!!! 
 
# 실루엣 분석 metric 값을 구하기 위한 API 추가
from sklearn.metrics import silhouette_samples, silhouette_score

# iris 의 모든 개별 데이터에 실루엣 계수값을 구함. 
score_samples = silhouette_samples(iris.data, irisDF['cluster'])

irisDF['silhouette_coeff'] = score_samples  # 실루엣 계수 넣어주기