본문 바로가기

Machine Learning

Machine Learning - K-Means Clustering (wcss & elbow method)

반응형
K-Means Clustering

 

 

 

Unsupervised Learning이다.

 

 

 

K개의 그룹을 만든다.

 

즉, 비슷한 특징을 갖는 것들끼리 묶는 것.

 

 

다음을 두개, 세개 네개 그룹 등등 원하는 그룹으로 만들 수 있다.

 

 

알고리즘

 

 

또 다시 중심에 직교하는 선을 긋고,

 

자신의 영역안에 있는 것들을 자신의 색으로 바꾼다.

 

 

중심을 이동해서, 영역을 나눴는데,

 

나눈 영역안에 다른 카테고리가 더 이상 나타나지 않으면

 

끝낸다.

 

 

Random Initialization Trap

 

다음과 같은 데이터 분포가 있다고 가정했을때

 

 

우리가 원하는 클러스터링 그룹화는,

 

아래와 같은 것이다.

 

 

원치 않는 그룹화가 되어버렸다.

 

 

위와 같은 문제는 해결한 것이

 

K-Means++ 알고리즘이다.

 

 

Choosing the right number of clusters

 

몇개로 분류 할 지는 어떻게 결정하는가?

 

K개의 갯수를 정하는 방법

 

 

within-cluster sums of squares

 

 

센터가 원소들과의 거리가 멀수록 값이 커진다.

 

따라서 최소값에 가까워지는 갯수를 뽑되,

 

갯수가 너무 많아지면 차별성이 없어진다.

 

 

 

 

 

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

%matplotlib inline

 

df.isna().sum()

X = df.iloc[ : , 3 : ]

X

 

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters= 3, random_state=42)

X.head(3)

 

y_pred = kmeans.fit_predict(X)
y_pred

df['Group'] = y_pred

df.loc[df['Group'] == 1]

 

sb.scatterplot(data=df, x= 'Annual Income (k$)', y='Spending Score (1-100)' )
plt.show()

 

 

적절한 k 값(몇개 그룹)을 찾기 위해서는,

 

WCSS 값을 확인해야 한다.

 

따라서 K를 1부터 10까지 다 수행해보고나서

 

WCSS 값을 확인해 본다.

 

이때, 엘보우 메소드를 이용해서, 최적의 K값을 찾도록 한다.

 

 

wcss=[]
for k in range(1, 11) :
    kmeans = KMeans(n_clusters= k, random_state=42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
    
wcss

plt.plot(range(1,11), wcss)

plt.title('The Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')

plt.show()

 

kmeans = KMeans(n_clusters= 5 , random_state=42)
y_pred = kmeans.fit_predict(X)
df['Group'] = y_pred
df

plt.figure(figsize=[12,8])
plt.scatter(X.values[y_pred == 0, 0], X.values[y_pred == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X.values[y_pred == 1, 0], X.values[y_pred == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X.values[y_pred == 2, 0], X.values[y_pred == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X.values[y_pred == 3, 0], X.values[y_pred == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X.values[y_pred == 4, 0], X.values[y_pred == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형