areum

[ML] K-Means Clustering (K-평균 군집) 본문

Programming/Machine Learning

[ML] K-Means Clustering (K-평균 군집)

armmy 2023. 3. 17. 14:02
728x90

K-평균 군집분석 정의

군집 수만큼(k개) 초기값을 지정하고, 각 데이터를 가까운 초기값에 할당하여 군집을 형성한 뒤, 각 군집의 평균을 재계산하여 초기값을 갱신.

갱신된 값에 대해 위의 할당과정을 반복하여 k개의 최동군집을 형성.

 K-Means algorithm 사용하여 분석하기


1. 필요한 라이브러리 및 예제 csv파일을 불러옵니다.

import matplotlib.pyplot as plt      #시각화를 위한 설치
import matplotlib.font_manager as fm    # 한글 폰트
import matplotlib                   #시각화를 위한 설치
import os, warnings  
import pandas as pd                #구조 변경 및 결합을 하기 위한 설치
import seaborn as sns              #시각화를 위한 설치
import plotly.express as px        
from sklearn.datasets import make_blobs
import math
import scipy as sp


warnings.filterwarnings('ignore')

pd.set_option('display.max_rows', None)         #모든 행을 다 보여주라는 명령
pd.set_option('display.max_columns', None)      #모든 열을 다 보여주라는 명령

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
matplotlib.rcParams['axes.unicode_minus'] = False
## 한글 폰트 적용 ( 안하면 한글 깨짐 )
f_name = fm.FontProperties(fname="C:/Windows/Fonts/malgunbd.ttf").get_name()
plt.rc('font', family=f_name)

# 예제에서 사용할 csv파일입니다.
cluster=pd.read_csv('VitalSign_Sample.csv',encoding='ANSI')

2. 데이터 형태 파악하기

위 자료의 데이터는 공공데이터포털의 의료데이터를 추출해온 자료입니다.

3. pairplot 시각화

데이터에 들어있는 각 컬럼들의 상관 관계를 출력하기 위한  과정입니다.

sns.pairplot(cluster_f,hue='fm')

4. KMeans 파라미터 정하기

  • 파라미터 살펴보기
파라미터 의미
n_clusters  k-means의 k를 의미하는 군집형성의 개수
n_jobs scikit-learn의 기본적인 병렬처리로 내부적으로 멀티프로세스를 사용하는 것 (CPU 코어의 수 확인 후 증설)
random_state 학습결과의 동일성을 위해 난수를 고정init 
init  k-means가 중심점(centroid)를 기준으로 군집을 형성하는데 있어서 초기중심점을  random으로 설정
n_init 초기중심점 선택의 반복 횟수
max_iter 학습의 최대 반복횟수
tol
inertia 이 지정해준 tol만큼 줄어들지 않으면 조기에 종료시킨다는 것
from sklearn.cluster import KMeans

ks=range(1,10)
inertias=[]

for k in ks:
    model=KMeans(n_clusters=k)
    model.fit(cluster_f)
    inertias.append(model.inertia_)
    
plt.figure(figsize=(4,4))
plt.plot(ks,inertias,'-o')
plt.show()

위 출력된 그래프를 통해 n_clusters의 수를 정할 수 있습니다. 값이 급격하게 하강하면서 2부터는 변화의 폭이 크지 않은것을 볼 수 있습니다. 그렇기에 해당 데이터는 2~ 개의 클러스터로 분류하는 것이 적절하다고 판단할 수 있습니다.

 

5.모델 적용하여 군집화해보기

clust_model=KMeans(n_clusters=2)
clust_model.fit(cluster_f)

centers=clust_model.cluster_centers_
pred=clust_model.predict(cluster_f)

clust_df=cluster_f.copy()
clust_df['clust']=pred

clust_df.columns = ['x', 'y', 'z','clust']

#원본데이터 시각화
sns.scatterplot(x=clust_df.iloc[:,0],y=clust_df.iloc[:,1],data=clust_df,hue='z',palette='coolwarm')

#kmeans예측 군집화 시각화
sns.scatterplot(x=clust_df.iloc[:,0],y=clust_df.iloc[:,1],data=clust_df,hue='clust',palette='coolwarm')

#원본데이터 시각화
#kmeans예측 군집화 시각화

clust_df.to_dict('records')