군집화 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 # 실루엣 계수 넣어주기