[머신러닝] K-Means Clustering
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()