ML (MachineLearning)

하이라키 클러스터링(Hierarchical Clustering) : 계층적 군집

567Rabbit 2024. 4. 16. 12:28

머신러닝의 비지도(unsupervised)학습

 

1. 평할/분할 기반의 군집 (Partition-based Clustering)

- 비슷한 특징을 갖는 데이터끼리 묶는것이다

주어진 데이터에 대해 미리 정의된 수의 군집을 형성하며, 데이터를 해당 군집에 할당하는 방식으로 동작한다

ex ) K-Means Clusterin

 

 

2. 계층적 군집 (Hierarchical Clustering)

- 데이터를 순차적 또는 계층적으로 그룹화하는 알고리즘

- 데이터 포인트 간의 거리 또는 유사도를 기반으로 계층 구조를 형성하여 군집을 형성

계층적인 구조를 가지고 있어 군집화 결과를 다양한 수준에서 살펴볼 수 있으며, 시각적으로 표현하기 쉽다

- 사전에 군집의 개수를 지정할 필요가 없어 편리

- 큰 데이터셋에 대해서는 계산 비용이 증가할 수 있고, 특정 수준에서의 군집화 결과를 해석하는 것이 어려울 수 있다

ex ) 병합 군집화 (Agglomerative Clustering) , 분할 군집화 (Divisive Clustering)

 

 

 

 

 

하이라키 클러스터링(Hierarchical Clustering) : 계층적 군집

 

- 점점 넓혀가면서 비슷한 개체를 군집으로 만들어나가는 형태이다

- 데이터 포인트 간의 거리나 유사성을 기반으로 계층적인 트리 구조를 형성

- 가장 짧은 거리를 가진 클러스터를 결합하여 더 큰 클러스터를 만든다

 

 

 

df

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100)
0 1 Male 19 15 39
1 2 Male 21 15 81
2 3 Female 20 16 6
3 4 Female 23 16 77
4 5 Female 31 17 40
... ... ... ... ... ...
195 196 Female 35 120 79
196 197 Female 45 126 28
197 198 Male 32 126 74
198 199 Male 32 137 18
199 200 Male 30 137 83

 

 

 

X = df.iloc[ : , 1 : ]

X
  Genre Age Annual Income (k$) Spending Score (1-100)
0 Male 19 15 39
1 Male 21 15 81
2 Female 20 16 6
3 Female 23 16 77
4 Female 31 17 40
... ... ... ... ...
195 Female 35 120 79
196 Female 45 126 28
197 Male 32 126 74
198 Male 32 137 18
199 Male 30 137 83

 

 

 

 

 

문자열 숫자로 바꾸기

 

X['Genre'].unique()

array(['Male', 'Female'], dtype=object)

 

'Male'과 'Female' 2개이므로 0과 1로만 바꾸면 되기때문에, 원핫인코딩(3개 이상)이 아닌 라벨 인코딩으로 하면 된다 

 

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()

X['Genre'] = encoder.fit_transform(X['Genre'])

 

 

X

  Genre Age Annual Income (k$) Spending Score (1-100)
0 1 19 15 39
1 1 21 15 81
2 0 20 16 6
3 0 23 16 77
4 0 31 17 40
... ... ... ... ...
195 0 35 120 79
196 0 45 126 28
197 1 32 126 74
198 1 32 137 18
199 1 30 137 83

 

 

 

sorted(X['Genre'].unique())

['Female', 'Male']

 

'Female'이 0, 'Male'이 1이라는 것을 알 수 있다.

 

 

 

 

하이라키 클러스터링은 피쳐스케일링 단계를 거치지 않는다

 

 

 

 

 

 

Dendrogram 그리기

 

유클리드 거리를 사용해서 와드 연결을 계산하고 덴그로그램을 사용하여 시각화 한다
덴그로그램 계층구조를 도식화한 그림을 덴그로그램이라 한다

 

import scipy.cluster.hierarchy as sch

sch.dendrogram( sch.linkage(X, method='ward') )#linkage : 연결을 어떻게 시킬것인가? 'ward' 메소드가 가장 일반적

plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Distance')
plt.show()

 

ward 메소드는 계층적 군집화에서 사용되는 거리 측정 방법 중 하나이며 거리 측정 방법을 사용하여 계층적 군집화를 실행하는 Python 코드이다. 비교적 안정적이며 군집 간의 크기 차이에 민감하지 않아 널리 사용된다. 주어진 데이터셋에 대한 거리 행렬을 계산한 후에, 이를 사용하여 계층적 군집화를 수행할 수 있다.

 

from sklearn.cluster import AgglomerativeClustering    

#AgglomerativeClustering는 병합적 군집화이다


hc = AgglomerativeClustering(n_clusters=5)

 

y_pred = hc.fit_predict(X)
df['Group'] = y_pred

 

 

df

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100) Group
0 1 Male 19 15 39 4
1 2 Male 21 15 81 3
2 3 Female 20 16 6 4
3 4 Female 23 16 77 3
4 5 Female 31 17 40 4
... ... ... ... ... ... ...
195 196 Female 35 120 79 2
196 197 Female 45 126 28 1
197 198 Male 32 126 74 2
198 199 Male 32 137 18 1
199 200 Male 30 137 83 2

 

 

 

 

df.loc[df['Group'] == 4, ]

 

  CustomerID Genre Age Annual Income (k$) Spending Score (1-100) Group
0 1 Male 19 15 39 4
2 3 Female 20 16 6 4
4 5 Female 31 17 40 4
6 7 Female 35 18 6 4
8 9 Male 64 19 3 4
10 11 Male 67 19 14 4
12 13 Female 58 20 15 4
14 15 Male 37 20 13 4
16 17 Female 35 21 35 4
18 19 Male 52 23 29 4
20 21 Male 35 24 35 4
22 23 Female 46 25 5 4
24 25 Female 54 28 14 4
26 27 Female 45 28 32 4
28 29 Female 40 29 31 4
30 31 Male 60 30 4 4
32 33 Male 53 33 4 4
34 35 Female 49 33 14 4
36 37 Female 42 34 17 4
38 39 Female 36 37 26 4
40 41 Female 65 38 35 4
42 43 Male 48 39 36 4
44 45 Female 49 39 28 4