개발학습일지

[AI] 머신러닝 Unsupervised _계층적 군집 Hierarchical Clustering 본문

AI/Machine Learning

[AI] 머신러닝 Unsupervised _계층적 군집 Hierarchical Clustering

처카푸 2024. 4. 16. 11:19

계층적 군집 Hierarchical Clustering

 : 데이터를 계층적으로 연결해가면서 가까운 군집끼리 군집을 구성해 가는 알고리즘이다

 

기초 라이브러리

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

기초 데이터 df

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

 

1. nan 확인

df.isna().sum()
>>>
    CustomerID                0
    Genre                     0
    Age                       0
    Annual Income (k$)        0
    Spending Score (1-100)    0
    dtype: int64

 

2. y 값이 없으므로 X 값만 구하기

X = df.loc[ : , 'Genre' : ]
X.head()

 

3. X 데이터에 오브젝트 컬럼 찾아서 숫자로 바꿔주기

X['Genre'].nunique()
# 2
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X['Genre'] = encoder.fit_transform(X['Genre'])
X['Genre'].unique()
# array([1, 0])

 

4. Dendrogram 을 그리고, 최적의 클러스터 갯수를 찾는다

- Hierarchical Clustering 사용 라이브러리 임폴트

import scipy.cluster.hierarchy as sch

- 댄드로그램 타이틀과 x, y 라벨 붙혀서 깔끔하게 만들고 저장까지 해본다

- sch.dendrogram(sch.linkage(X, method = ' * ') 사용 한다

   -- method : single, complete, average, centroid, ward linkage 방식이 존재한다

plt.figure(figsize=(15,10))
sch.dendrogram(sch.linkage(X, method = 'ward') )
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Distances')
plt.savefig('dendrogram.png')
plt.show()

- Distances  가 200에서 자르는게 가장 가까운 것끼리 모인 것 같다고 판단되어 5개의 군집으로 설정한다

5. 병합적 군집으로 처리 한다

- AgglomerativeClustering 라이브러리 임폴트

from sklearn.cluster import AgglomerativeClustering

- 인공지능을 만들어 군집을 형성하고 기초 데이터셋에 'Group'이라는 컬럼명으로 추가한다

- AgglomerativeClustering(n_clusters=*) 사용   n_clusters=* 별은 내가 댄드로그램을 보고 설정한 군집의 수를 적으면 된다

hc = AgglomerativeClustering(n_clusters=5)
y_pred = hc.fit_predict(X)
y_pred
>>>
    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)
df['Group'] = y_pred
df.head()

 

6. 원하는 그룹 정보만 가져올 수 있다

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