본문 바로가기
AI & 머신러닝 coding skill

머신러닝 Clustering - Gaussian Mixture Model (GMM)

by 호빵님 2022. 5. 23.
반응형

Gaussian Mixture Model (GMM)

Gaussian Mixture Model(GMM)을 이용한 클러스터링은 데이터가 여러 개의 정규 분포를 가지고 있다고 가정한 후 클러스터링을 진행하는 방식입니다.

여러 개의 데이터 세트가 있다면 이를 구성하는 여러 개의 정규 분포 곡선을 추출하고, 개별 데이터가 이 중 어떤 정규 분포에 속하는지 결정합니다.

또한, GMM은 K-means 클러스터링과 달리 군집 중심점(clustering center)가 없으므로 군집의 개수(K)를 정해주면 됩니다.

이번 실습에서는 동일한 iris 데이터를 가지고 GMM을 이용한 클러스터링을 수행하고, 결과를 시각화하여 확인해보겠습니다.


GMM을 위한 사이킷런 함수/라이브러리

  • from sklearn.mixture import GaussianMixture : 사이킷런에 구현되어 있는 GMM 모델을 불러옵니다.
  • GaussianMixture(n_components, random_state)
    • n_components : 군집의 개수
    • random_state : 일관된 결과 확인을 위한 설정값
  • [Model].fit(data) : data에 대한 클러스터링 학습을 수행합니다.
  • [Model].predict(data) : data에 대한 클러스터링 예측을 수행하여 클러스터링 결과를 반환합니다.

 

 

import pandas as pd
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

from elice_utils import EliceUtils
elice_utils = EliceUtils()

# 데이터를 불러오고, 데이터 프레임 형태로 만든 후 반환하는 함수입니다.
def load_data():
    
    iris = load_iris()
    
    irisDF = pd.DataFrame(data = iris.data, columns = iris.feature_names)
    
    irisDF['target'] = iris.target
    
    return irisDF
    
"""
1. GMM 클러스터링을 
   수행하는 함수를 구현합니다.
   
   Step01. GMM 객체를 불러옵니다.
           
           군집의 개수는 3,
           일관된 결과 확인을 위해 
           random_state를 100으로 설정합니다.
           
   Step02. GMM 클러스터링을 수행합니다.
           
           클러스터링은 정답이 없는 데이터를
           사용하기 때문에 target 변수를 제거한
           데이터를 학습시켜줍니다.
           
   Step03. 군집화 결과를 
           iris 데이터 프레임에 추가합니다.
           
"""
def gmm_clus(irisDF):
    
    gmm = GaussianMixture(n_components=3, random_state=100)
    
    gmm.fit(irisDF.drop('target',axis=1))
    
    irisDF['cluster'] = gmm.predict(irisDF.drop('target',axis=1))
    
    # 군집화 결과를 보기 위해 groupby 함수를 사용해보겠습니다.
    iris_result = irisDF.groupby(['target','cluster'])['sepal length (cm)'].count()
    print(iris_result)
    
    return iris_result, irisDF

# 군집화 결과 시각화하기
def Visualize(irisDF):
    
    pca = PCA(n_components=2)
    print(irisDF.head())
    pca_transformed = pca.fit_transform(irisDF.drop('target',axis=1))

    irisDF['pca_x'] = pca_transformed[:,0]
    irisDF['pca_y'] = pca_transformed[:,1]

    # 군집된 값이 0, 1, 2 인 경우, 인덱스 추출
    idx_0 = irisDF[irisDF['cluster'] == 0].index
    idx_1 = irisDF[irisDF['cluster'] == 1].index
    idx_2 = irisDF[irisDF['cluster'] == 2].index
    
    # 각 군집 인덱스의 pca_x, pca_y 값 추출 및 시각화
    fig, ax = plt.subplots()
    
    ax.scatter(x=irisDF.loc[idx_0, 'pca_x'], y= irisDF.loc[idx_0, 'pca_y'], marker = 'o')
    ax.scatter(x=irisDF.loc[idx_1, 'pca_x'], y= irisDF.loc[idx_1, 'pca_y'], marker = 's')
    ax.scatter(x=irisDF.loc[idx_2, 'pca_x'], y= irisDF.loc[idx_2, 'pca_y'], marker = '^')
    ax.set_title('GMM')
    ax.set_xlabel('PCA1')
    ax.set_ylabel('PCA2')
    
    fig.savefig("plot.png")
    elice_utils.send_image("plot.png")


def main():
    
    irisDF = load_data()
    
    iris_result, irisDF = gmm_clus(irisDF)
    
    Visualize(irisDF)
    
    
if __name__ == "__main__":
    main()

 

 

 

*본 포스팅은 DX기업교육 플랫폼인 Elice academy의 머신러닝 심화 과정에서 실습한 코드를 이용해서 작성되었습니다.

https://elice.io/

 
 
 

올인원 디지털 교육 플랫폼 - 엘리스

우리 모두를 위한 교실, 엘리스와 함께 더 나은 기회를 만들어보세요

elice.io

 

 

반응형