AI 이론/Clustering (unsupervised)

[머신러닝] K-Means Clustering

jasonshin 2021. 11. 25. 18:06

Unsupervised Learning 이다.

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

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

알고리즘

또다시 중심에 직교하는 선을 긋고, 자신의 영역안에 있는 것들을 자신의 색으로 바꾼다.

중심을 이동해서, 영역을 나눴는데, 나눈 영역안에 다른 카테고리가 더이상 나타나지 않으면, 끝낸다.

# 랜덤의 문제: 랜덤으로 초기값을 잡을 경우

Random Initialization Trap

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

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

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

위와 같은 문제는 해결한것이, K-Means++ 알고리즘이다.

Choosing the right number of clusters

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

within-cluster sums of squares

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

1. Nan확인

df.isna().sum()

 

2. X값 세팅 (Unsupervised learning이므로 y값은 없다)

X = df.iloc[:, 3:]

 

3. 모델링

from sklearn.cluster import KMeans 

kmeans = KMeans(n_clusters= 3, random_state=42)

kmeans.fit_predict(X)  <= df 행의 그룹정보를 하나씩 다 가져와서 3가지로 분류(0,1,2)

y_pred = kmeans.fit_predict(X)

 

# y_pred 값은 각 행(사람)의 그룹정보를 가지고있다. 따라서 이 그룹정보를 원래의 df에 추가를 해줘야 이용할 수 있다. 

df['Group'] = y_pred

 

4. 적절한 k값을 찾기 위해 k를 1~10 까지 다 수행해서 WCSS값은 리스트에 저장한다. 

wcss= []
for k in range(1, 10+1) : 
    kmeans = KMeans(n_clusters= k, random_state=42)
    # wcss값만 확인 할거니까 fit 함수만 이용하면 된다.
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

 

5. elbow method를 이용하기 위해서 차트로 표시

plt.plot(range(1, 10+1), 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

 

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

6. Visualising the clusters
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()

(데이터 분석)

1) 그룹이 3인 사람들의 데이터를 가져오세요

df['Group']==3

df3 = df.loc[df['Group'] == 3,  ]

 

2) 그룹이 3인 사람들의 수입 평균은 얼마입니까?

df3['Annual Income (k$)'].mean()

 

3) 그룹별 Spending Score를 나타나되, 평균값과 최대값을 한꺼번에 보여주세요.

df.groupby('Group')['Spending Score (1-100)'].agg([np.mean, np.max])

 

4) 각 그룹별 수입과 소비지표의 평균을 구하세요.

df.groupby('Group')[['Annual Income (k$)', 'Spending Score (1-100)']].mean()

반응형