본문 바로가기

Python/Machine Learning

Machine Learning : K-means 의 WCSS와 Elbow Method 설명

K-Means Clustering

Unsupervised Learning 이다.

k 개의 그룹을 만든다. 즉, 비슷한 특징을 갖는 것들끼리 묶는것.

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

 

알고리즘

 


Random Initialization Trap

다음과 같은 데이터 분포가 있다고 치자.

우리가 원하는 클러스터링 그룹화는, 아래와 같은 것이다.

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


Choosing the right number of clusters

몇개로 분류할지는 어떻게 결정하는가? K의 갯수를 정하는 방법

within-cluster sums of squares

 
 

 

 

센터가 원소들과의 거리가 멀수록 값이 커진다. 따라서 최소값에 가까워지는 갯수를 뽑되, 갯수가 너무 많아지면 차별성이 없어진다.

 


# Unsupervised learning

# 중심과의 거리가 짧을수록 비슷한 속성이다.

#WCSS

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sb

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

df.isna().sum()
CustomerID                0
Genre                     0
Age                       0
Annual Income (k$)        0
Spending Score (1-100)    0
dtype: int64
X = df.iloc[: , 3:]

kmeans = KMeans(n_clusters= 3 , random_state=42)
y_pred = kmeans.fit_predict(X)
X.shape

######### out 
(200, 2)

y_pred
######### out
array([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, 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, 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, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
       1, 2])
       
       
       
df['Group'] = y_pred

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


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

 

 

 

out

 

# 그룹의 개수를 3이 아니라 5개로 해줘야 함


sklearn.cluster 로 하는방법

# 적절한 K 값( 몇개그룹 )을 찾기위해서는, WCSS 값을 확인해야 한다!
# 따라서 K를 1부터 10까지 다 수행해보고 
# WCSS 값을 확인 해본다.
# 이 때, 엘보우 메소드를 이용해서, 최적의 k 값을 찾도록 한다.

from sklearn.cluster import KMeans

wcss = []
for k in range(2, 10+1):
    kmeans = KMeans(n_clusters= k , random_state = 42)
    kmeans.fit_predict(X)
    wcss.append(kmeans.inertia_)
    
    plt.plot(range(2, 10+1), wcss )
plt.title('The Elbos Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

 

 

out

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



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()

 

 

out