최적의 클러스터 개수 찾기
일반적으로 k를 어떻게 설정할지 쉽게 알 수 없다. 만약 올바르게 지정하지 않으면 결과는 매우 나쁠 수 있다.
더 정확한 방법은 실루엣 점수(silhouette score)이다. 이 값은 모든 샘플에 대한 실루엣 계수의 평균이다. 샘플의 실루엣 계수는 (b-a)/max(a,b)로 계산한다. 여기에서 a는 동일한 클러스터에 있는 다른 샘플까지 평균 거리이다(즉 클러스터 내부의 평균 거리). b는 가장 가까운 클러스터까지 평균 거리이다(즉 가장 가까운 클러스터의 샘플까지 평균 거리, 샘플과 가장 가까운 클러스터는 자신이 속한 클러스터는 제외하고 b가 최소인 클러스터이다). 실루엣 계수는 -1에서 1까지 바뀔 수 있다. +1에 가까우면 자신의 클러스터가 안에 잘 속해 있고 다른 클러스터와는 멀리 떨어져 있다는 뜻이다. 실루엣 계수가 0에 가까우면 클러스터 경계에 위치한다는 의미이고 -1에 가까우면 이 샘플이 잘못된 클러스터에 할당되었다는 의미이다.
< 군집을 사용한 이미지 분할>
이미지 분할(image segmentation)은 이미지를 세그먼트 여러 개로 분할하는 작업이다. 시맨틱 분할(semantic segmentation)에서는 동일한 종류의 물체에 속한 모든 픽셀은 같은 세그먼트에 할당된다.
다음 코드는 이 배열을 RGB 색상의 긴 리스트로 변환한 다음 k-평균을 사용해 이 색상을 클러스터로 모은다.
군집은 지도 학습 알고리즘을 적용하기 전에 전처리 단계로 사용할 수 있다.
from sklearn.datasets import load_digits
X_digits,y_digits=load_digits(return_X_y=True)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X_digits, y_digits)
print(X_train.shape)
그다음 로지스틱 회귀 모델을 훈련한다.
from sklearn.linear_model import LogisticRegression
log_reg=LogisticRegression()
log_reg.fit(X_train,y_train)
log_reg.score(X_test,y_test)
기준값으로 95.7% 정확도를 얻었다. k-평균을 전처리 단계로 사용해 더 좋아지는지 확인해보겠다. 파이프라인을 만들어 먼저 훈련 세트를 50개의 클러스터로 모은다. 그런 다음 이미지를 50개 클러스터까지 거리로 바꾼다. 그다음 로지스틱 회귀 모델을 적용한다.
from sklearn.pipeline import Pipeline
from sklearn.cluster import KMeans
pipeline= Pipeline([
('kmeans',KMeans(n_clusters=50)),
('log_reg',LogisticRegression())
])
pipeline.fit(X_train,y_train)
pipeline.score(X_test,y_test)
성능이 더 좋아졌다.
'Machine Learning > Advanced (hands on machine learning)' 카테고리의 다른 글
31. 비지도학습 - 가우시안 혼합 (0) | 2021.05.30 |
---|---|
30. 비지도학습 - DBSCAN (0) | 2021.05.30 |
28. 비지도 학습 - 군집(K-평균(1)) (0) | 2021.05.26 |
26. 차원 축소 - 커널 PCA (0) | 2021.05.26 |
25. 차원 축소 - PCA (0) | 2021.05.26 |