머신러닝(14) K-Means Clustering으로 데이터를 분류하여 그룹화하자
K-Means Clustering은 정확도를 예측할수 없고 머신러닝이 수행한 값을 그대로 적용하는 비지도 학습의 머신러닝 모델로써 값을 예측하는것이 아니고 기존의 데이터들을 머신러닝의 임의에 기준으로 그룹화 시키는 방법이다.
원리는 이렇다
이러한 데이터를 두 그룹으로 나눈다 할때 컴퓨터는
이런식으로 임의점을 잡고 그점 사이의 선의 거리를 구한다.
그 선의 중심점에 선의 수직으로 또하나의 선을 긋는다.
수직선을 기준으로 데이터를 나눈다.
다시 임의의 점들은 영역이 나뉜 데이터의 중심으로 이동하고
다시 두점사이의 거리를 구하고 거리의 중심으로 수직선을 긋는다.
수직선이 바뀌어서 데이터의 영역도 변한다.
다시 그 중심으로 이동하며 위에 순서를 반복한다.
더이상 중복되지 않은 선이 나타나지 않을때까지 선을 그으며 반복한다.
특정으로는 y데이터가 없으며 얼마나 그룹을 형성할것인지 그룹의수를 정할 수 있다.
코드를 하나하나 알아보자
#데이터 프레임 함수 호출
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#데이터 불러오기
df=pd.read_csv('../data/Mall_Customers.csv')
df
카테고리컬데이터가 있나 체크한다.
df.isna().sum()
>>>CustomerID 0
Genre 0
Age 0
Annual Income (k$) 0
Spending Score (1-100) 0
dtype: int64
카테고리컬 데이터는 없다.
기존과정은 데이터를 가공하는 단계이나 차이점이 있다. y데이터 값이 없기 때문이다. 따라서 X값만 써준다.
X=df.loc[ : ,"Annual Income (k$)":]
X
X데이터가 저장 되었다면 다음은 정규화 과정을 거쳐야 되지만 비지도 학습인 K-Means Clustering에선 정규화 과정을 생략한다.
예측할수 없기 때문에 train,test데이터로도 나눌 필요가 없다.
데이터 학습으로 들어가자
#kmeans 함수 실행
from sklearn.cluster import KMeans
#변수에 함수 저장 n_clusters는 그룹화할 그룹수
kmeans=KMeans(n_clusters=5,random_state=2)
#X데이터를 그룹화
y_pred=kmeans.fit_predict(X)
#그룹화된 데이터를 Group컬럼으로 저장
df["Group"]=y_pred
df
데이터 프레임 컬럼에 새롭게 Group이 추가되었다. 데이터가 머신러닝의 기준대로 나눠지게 된다.
만약에 그룹화된 데이터가 이상하거나 대충 묶였다면 안되기 때문에 어디까지 그룹화를 해주면 안정적일지 나타내주는 지표를 찾을수 있는데 이방법을 Elbow Method라 한다.
Elbow Method란 K-Means Clustering 학습에 쓰이는 기법으로 K-Means Clustering를 반복문으로 반복실행한뒤 거기서 얻은 kcss값을 그래프로 나타내어 급격한 변화에서 완만한 변화가 있는 구간 즉 팔꿈치같은 구간에서 해당되는 그룹화 수를 찾아내는 방법이다. 이방법으로 정확도를 측정할수 없는 비지도 학습인 K-Means Clustering에서 안정적인 그룹화 수를 찾아 낼수 있다.
실제로 코드를 돌려서 찾아내보자
# 반복문으로 K-Means Clustering을 반복한다.
# 반복한 값을 wcss에 저장
wcss = []
for k in np.arange(1,10+1):
kmeans = KMeans(n_clusters=k ,random_state=5)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
이제 wcss값을 차트로 나타낸다.
x = np.arange(1,10+1)
plt.plot(x,wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('wcss')
plt.show()
차트상으로 볼때 안정적인 그룹화 수는 4나 5이다. 학습에 적용시켜보자
kmeans = KMeans(n_clusters=5 , random_state=5)
y_pred=kmeans.fit_predict(X)
df["Group"]=y_pred
scatter로 나타내보자
import seaborn as sb
sb.scatterplot(data=df, x='Annual Income (k$)',y='Spending Score (1-100)')
plt.show()
조금 잘 묶여보이는것을 알수 있다.