MACHINE LEARNING/Machine Learning Library

ML(머신러닝) : Hierarchical Clustering (Dendrogram을 그리고 Agglomerative Clustering 활용)

신강희 2024. 4. 26. 00:36
728x90

< Hierarchical Clustering >

 

- 데이터 포인트들을 계층적으로 그룹화하는 클러스터링 방법

- 복잡한 데이터 구조를 가진 데이터 세트에서 패턴이나 관계를 파악하는 데 유용

- Hierarchical Clustering의 결과는 트리 형태로 나타낼 수 있으며, 이를 덴드로그램(dendrogram)이라고 한다.

- 덴드로그램은 각 클러스터의 병합 순서와 유사도를 시각적으로 표현하고, 클러스터의 수를 사전에 지정할 필요가 없으므로, 클러스터의 개수를 자유롭게 선택할 수 있어 매우 유연하게 사용할 수 있다.

묶인 클러스터를 점 하나로 보고, 반복하여 가까운것끼리 묶는다.

 

< 예제문을 통해 실제 코딩해 보자 >

# Library 임포트

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

 

# dataset 읽어오기

df = pd.read_csv('../data/Mall_Customers.csv')

df

 

# 비어있는셀 확인

df.isna().sum()

CustomerID                0
Genre                     0
Age                       0
Annual Income (k$)        0
Spending Score (1-100)    0
dtype: int64

 

# 클러스터링 이므로 X 데이터만 메모리에 업로드

X = df.iloc [ : , 1 : ]

X

 

# 문자열이 있으므로 인코딩 필요
# 2개니까 레이블 인코딩
X['Genre'].nunique()

2

 

X['Genre']

0        Male
1        Male
2      Female
3      Female
4      Female
        ...  
195    Female
196    Female
197      Male
198      Male
199      Male
Name: Genre, Length: 200, dtype: object

 

from sklearn.preprocessing import LabelEncoder

 

# 변수로 저장할때 함수명 뒤에 () 빼먹지 말고 꼭 써서 저장해야 동작됨!!
encoder = LabelEncoder()

 

encoder.fit_transform( X['Genre'] )

array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1,
       0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
       0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1,
       0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0,
       0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1,
       1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1,
       0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,
       0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0,
       1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
       1, 1])

 

# 인코딩된 데이터를 X 데이터에 다시 메모리 업로드

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

X

 

< Dendrogram 을 그리고, 최적의 클러스터 갯수를 찾아보자. >

import scipy.cluster.hierarchy as sch

 

sch.dendrogram( sch.linkage(X , method= 'ward') )
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Distances')
plt.show()

ㄴ 대략 5개일 때가 가장 비율이 맞아 보인다. (좀더 기준치를 위로 올려서 4개로 해도되고 그건 개인 자유)

 

< Training the Hierarchical Clustering model >

# 이제 나눌 개수도 정하였으니 인공지능을 생성하여 학습시키고 예측을 시켜 보자.

from sklearn.cluster import AgglomerativeClustering

 

# K-Means 때와 동일하게 학습과 예측을 동시에 진행

hc = AgglomerativeClustering(n_clusters= 5)

hc.fit_predict(X)

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 0, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0,
       4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 1, 2, 1, 2, 1, 2,
       0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
       1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
       1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
       1, 2], dtype=int64)

 

# 예측정보 저장
y_pred = hc.fit_predict(X)

 

# 그룹분리된 갯수가 일정한지 확인하기위하여 원본데이터에 예측값을 신규 컬럼으로 삽입

df['Group'] = y_pred

ㄴ 이제 원하는 그룹숫자인 행을 가져와서 데이터가 각각 몇개인지 구분할수 있다.

 

다음 게시글로 계속

반응형