본문 바로가기

ML with SckitLearn

머신러닝, 클러스터 가우시안 가상데이터 생성하는 make_blobs를 이용한 K-means 실습 (Elbow Method 사용)

반응형

make_blobs 함수는 가우시안 정규분포를 이용해 가상 데이터를 생성합니다. make_blobs는 일반적으로 클러스링 가상데이터를 생성하는데 사용합니다.  클러스터 알고리즘인 K-Means의 실습을 편하게 하기 위해 사용하면 도움이 됩니다.

 

make_blobs 함수의 인수와 반환값은 다음과 같다.

 

  • Input Parameter
    • n_samples : 표본 데이터의 수, 디폴트 100
    • n_features : 독립 변수의 수, 디폴트 20
    • centers : 생성할 클러스터의 수 혹은 중심, [n_centers, n_features] 크기의 배열. 디폴트 3
    • cluster_std: 클러스터의 표준 편차, 디폴트 1.0
    • center_box: 생성할 클러스터의 바운딩 박스(bounding box), 디폴트 (-10.0, 10.0))
    • shuffle: TRUE하면 숫자를 랜덤으로 섞어주는 역할을 한다.

 

  • Return Parameter:
    • X : [n_samples, n_features] 크기의 배열: 독립 변수
    • y : [n_samples] 크기의 배열: 종속 변수

 


make_blobs를 이용한 K-Means 실습


 

샘플데이터를 만들기 위해 make_blobs를 사용한 후 그에 따른 그래프를 그려봅니다.

 

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

X, y = make_blobs(
    n_samples=150,
    n_features=2,
    centers=3,
    cluster_std=0.5,
    shuffle=True,
    random_state=0
)

plt.scatter(
    X[:, 0],
    X[:, 1],
    c='white',
    marker='o',
    edgecolors='black',
    s=50
)

plt.show()

 

 

 

K-means를 이용하여 상기 Random Data를 적용하고 분포를 이미지로 그려봅니다.

from sklearn.cluster import KMeans

km = KMeans(n_clusters=3, init='random', n_init=10, max_iter=300, tol=1e-04, random_state=0)
y_km = km.fit_predict(X)

plt.scatter(X[y_km==0,0], X[y_km==0, 1], s=50, c='lightgreen', marker='s', edgecolors='black', label='cluster 1')
plt.scatter(X[y_km==1,0], X[y_km==1, 1], s=50, c='orange', marker='o', edgecolors='black', label='cluster 2')
plt.scatter(X[y_km==2,0], X[y_km==2, 1], s=50, c='lightblue', marker='v', edgecolors='black', label='cluster 3')
plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:,1], s=250, marker='*', c='red', edgecolors='black', label='centroid')
plt.legend(scatterpoints=1)
plt.grid()
plt.show()

K-Means의 단점은 최적의 Cluster 수인 K가 몇개의 클러스터가 최적인지 알 수 없고 직접 지정을 해야 한다는 것입니다. 만약 잘못된 Cluster를 정하면 데이타 왜곡이 발생할 수 있습니다.

 

 

이를 보완하기 위해 Elbow Method는 매우 좋은 방법이 될 수 있습니다.  주어진 모델에 대한 최적 군집 수 K를 추정하는 데 유용한 그래픽 도구입니다.  Elbow Method의 개념은 왜곡이 가장 빠르게 감소하기 시작하는 K값을 식별하는 하는 것입니다.

 

여기서는 Elbow의 기울기가 급격하게 줄어드는 3을 Cluster 갯수로 지정하면 됩니다.

distortions = []
for i in range(1,11):
    km = KMeans(
        n_clusters=i,
        init='random',
        n_init=10,
        max_iter=300,
        tol=1e-04,
        random_state=0
    )
    km.fit(X)
    distortions.append(km.inertia_)

plt.plot(range(1,11), distortions, marker='o')
plt.xlabel('Number of Cluster')
plt.ylabel('Distortion')
plt.show()

 

반응형