머신러닝(군집화)
Clustering
클러스터링은 주어진 데이터들의 특성을 고려해 데이터 클러스터를 정의하고, 클러스터를 대표할 수 있는 대표점을 찾는 비지도 학습의 대표적인 알고리즘 입니다.
간단히 말해서, 비슷한 특성을 가진 데이터끼리 묶는다고 말할 수 있습니다.
1. k-Means 클러스터링
k-means 클러스터링은 대표적인 클러스터링 알고리즘 중 하나로, 각 클러스터에 할당된 데이터 포인트들의 평균 좌표를 이용해 중심점을 반복적으로 업데이트하며 클러스터를 형성하는 알고리즘 입니다.
k-means Clustering 알고리즘은 3가지 단계로 이루어집니다.
Step 1. 각 데이터 포인트 i 에 대해 가장 가까운
중심점을 찾고, 그 중심점에 해당하는 클러스터를 할당합니다.
가까운 중심점을 찾을 때는, 유클리드 거리를 사용합니다.
Step 2. 할당된 클러스터를 기반으로 새로운 중심점을 계산합니다.
중심점은 클러스터 내부 점들 좌표의 산술 평균(mean)
으로 합니다.
Step 3. 각 클러스터의 할당이 바뀌지 않을 때까지 반복합니다.
점가 점사이의 거리를 측정하는 방법
-
Mangattan Distance - 각 축에 대해 수직으로만 이동하여 계산하는 거리 측정방식
-
Euclidean Distance - 점과 점사이의 가장 짧은 거리를 계산하는 거리 측정 방식
준비
-
min-max 정규화를 통해 조정해줍니다.
-
차원이 높으면 우리 눈으로 볼 수 있도록 표현하기 어려우므로 pca로 2차원으로 만들어 줍니다.
시작
# 모델 불러오기 및 정의하기
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
# 모델 학습하기(클러스터링을 통한 중심점 찾기)
kmeans.fit(data)
# 클러스터 할당
cluster = kmeans.predict(data)
# 결과 살펴보기
plt.scatter(data[:, 0], data[:, 1], c=cluster, linewidth=1, edgecolor='black')
plt.show()
2. Hierarchical Clustering
Hierarchical Clustering은 거리(Distance) 또는 유사도(Similarity)를 기반으로 클러스터를 형성하는 알고리즘 입니다.
k-means Clustering과 다르게 클러스터의 수를 설정해 줄 필요가 없으며, 클러스터 형태를 시각적으로 표현해주는 덴드로그램을 통해 적절한 클러스터의 수를 선택할 수 있습니다.
Hierachichal Clustering에는 Bottom-Up 방식의 Agglomerative Method와 Top-Down 방식의 Divisive Method로 나뉩니다.
이번 단원에서는 Agglomerative Method를 사용해 실습을 진행합니다.
Agglomerative Method를 사용한 Hierarchical Clustering 알고리즘은 3가지 단계로 이루어집니다.
Step 1. 각 데이터 포인트를 클러스터로 할당합니다. (n개의 클러스터)
Step 2. 가까운 클러스터끼리 병합합니다.
Step 3. 1개의 클러스터가 될 때까지 반복합니다.
가장 가까운 클러스터를 찾을 수 있는 방법
-
Single Linkage - 두 클러스터 내의 가장 가까운 점 사이의 거리
-
Complete Linkage - 두 클러스터 내의 가장 먼 점 사이의 거리
-
Average Linkage - 두 클러스터 내의 모든 점 사이의 평균 거리
# 모델 불러오기 및 정의하기
from sklearn.cluster import AgglomerativeClustering
single_clustering = AgglomerativeClustering(n_clusters=3, linkage='single')
# 모델 학습하기(클러스터링을 통한 중심점 찾기)
single_clustering.fit(data)
# 클러스터 할당
single_cluster = single_clustering.labels_
# 결과 살펴보기
plt.scatter(data[:,0], data[:,1], c=single_cluster)
plt.title('Sklearn Single Linkage Hierarchical Clustering')
plt.show()
complete와 average는 linkage안의 내용을 바꿔주면 된다.
클러스터링 결과 비교하기
-
Single Linkage
- 두 클러스터 내의 가장 가까운 점을 기준으로 클러스터를 합치기 클러스터 사이의 노이즈에 매우 민감한 특성과 구 형태가 아닌 데이터에 대해 클러스터를 잘 형성한다는 특성이 있습니다.
- wine 데이터는 모든 데이터가 연결되어 있는 듯한 분포를 가지고 있기 때문에, 각 클러스터의 경계가 모호한 노이즈가 많은 형태를 띠고 있습니다.
Single Linkage가 구 형태가 아닌 데이터에 대해 클러스터를 잘 형성한다는 특성이 있지만, 이러한 데이터의 경우 Single Linkage 방법을 사용하면 좋은 클러스터를 생성하기 어렵습니다.
-
Complete Linkage
- 두 클러스터 내에 가장 먼 점을 기준으로 클러스터를 합치기 때문에 클러스터 사이의 노이즈와 이상치에 민감하지 않은 특성이 있습니다.
- 노이즈에 민감하지 않다는 특성을 가진 Complete Linkage가 좋은 성능을 보여주었습니다.
-
Average Linkage
- Single Linkage와 Complete Linkage의 중간쯤에 위치한 Average Linkage가 가장 정답에 가까운 클러스터를 형성한 것을 확인할 수 있습니다.
Evaluation
Silhouette
- 실루엣 값은 한 클러스터 안의 데이터들이 다른 클러스터와 비교해서 얼마나 비슷한가를 나타냅니다.
- 같은 클러스터 내의 점들간 거리는 가깝고(cohesion) 서로 다른 클러스터 간의 거리는 멀수록(separation) 높은 값을 얻을 수 있습니다.
- 실루엣 값이 1에 근접한다는 것은 같은 클러스터 내의 평균거리가 다른 클러스터와의 평균거리보다 가깝다는 것을 의미합니다.
- 일반적으로 실루엣 값이 0.5보다 크다면 데이터가 잘 클러스터링 되었다는 것을 나타냅니다.
Silhouette 스코어링은 Sklearn의 metrics 패키지에 있습니다.
from sklearn.metrics import silhouette_score
best_n = 1
best_score = -1
for n_cluster in range(2, 11):
kmeans = KMeans(n_clusters=n_cluster)
kmeans.fit(data)
cluster = kmeans.predict(data)
score = silhouette_score(data, cluster)
print('클러스터의 수 : {}, 실루엣 점수 : {:.2f}'.format(n_cluster, score))
if score > best_score :
best_n = n_cluster
best_score = score
print('가장 높은 실루엣 점수를 가진 클러스터 수 : {}, 실루엣 점수 : {:.2f}'.format(best_n, best_score))
Leave a comment