250x250
Link
λ‚˜μ˜ GitHub Contribution κ·Έλž˜ν”„
Loading data ...
Notice
Recent Posts
Recent Comments
관리 메뉴

Data Science LAB

[Python] KMeans Clustering(K-평균 ꡰ집화) λ³Έλ¬Έ

πŸ›  Machine Learning/Clustering

[Python] KMeans Clustering(K-평균 ꡰ집화)

γ…… γ…œ γ…” γ…‡ 2022. 2. 28. 18:28
728x90

KMeans Clusteringμ΄λž€?

κ°€μž₯ 자주 μ‚¬μš©λ˜λŠ” ꡰ집화 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, 데이터셋을 K개의 κ΅°μ§‘μœΌλ‘œ κ΅°μ§‘ν™”ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

μž„μ˜μ˜ ꡰ집 쀑심점 개수(K)λ₯Ό μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή 쀑심에 κ°€μž₯ κ°€κΉŒμš΄ 데이터λ₯Ό μ„ νƒν•œλ‹€. ꡰ집 쀑심점은 μ„ νƒλœ λ°μ΄ν„°μ˜ 평균 μ§€μ μœΌλ‘œ μ΄λ™ν•˜κ³ , μ΄λ™λœ μ€‘μ‹¬μ μ—μ„œ λ‹€μ‹œ κ°€κΉŒμš΄ 포인트λ₯Ό 선택, λ‹€μ‹œ 쀑심점을 평균 μ§€μ μœΌλ‘œ μ΄λ™ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό 반볡적으둜 μˆ˜ν–‰ν•œλ‹€. 더이상 μ€‘μ‹¬μ μ˜ 이동이 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅μ„ κ³„μ†ν•œλ‹€. 

 

 

 

 

 

 

 

 

KMeans Process

 

 

 

1. κ΅°μ§‘ν™”μ˜ 기쀀이 λ˜λŠ” 쀑심을 κ΅¬μ„±ν•˜λ €λŠ” κ΅°μ§‘μ˜ 개수만큼 μž„μ˜μ˜ μœ„μΉ˜μ— κ°€μ Έλ‹€ λ†“μŒ

 

 

2. 각 λ°μ΄ν„°λŠ” κ°€μž₯ κ°€κΉŒμš΄ 곳에 μœ„μΉ˜ν•œ 쀑심점에 μ†Œμ†

 

 

3. 각 λ°μ΄ν„°μ˜ μ†Œμ†μ΄ κ²°μ •λ˜λ©΄ ꡰ집 쀑심점을 μ†Œμ†λœ λ°μ΄ν„°μ˜ 평균 μ€‘μ‹¬μœΌλ‘œ 이동

 

 

4. 바뀐 μ€‘μ‹¬μ μ˜ μœ„μΉ˜μ— 맞좰 μ†Œμ† λ³€κ²½

 

 

5. λ‹€μ‹œ 쀑심점을 μ†Œμ†λœ λ°μ΄ν„°μ˜ 평균 μ€‘μ‹¬μœΌλ‘œ 이동

 

 

6. μ†Œμ† 변경이 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜κ³  μ’…λ£Œ

 

 

 

 

 

 

 

KMeans μž₯점

1. κ°€μž₯ 많이 ν™œμš©λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 쉽고 κ°„κ²°

 

2. 비지도 ν•™μŠ΅μ΄κΈ° λ•Œλ¬Έμ— 데이터에 λŒ€ν•œ 사전 ν•™μŠ΅μ΄ ν•„μš”ν•˜μ§€ μ•ŠμŒ

 

 

 

KMeans 단점

1. 거리기반 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ†μ„±μ˜ κ°œμˆ˜κ°€ 맀우 λ§Žμ„ 경우 ꡰ집화 정확도가 떨어짐(PCA μ°¨μ›κ°μ†Œ 적용으둜 ν•΄κ²°)

 

2. 반볡 νšŸμˆ˜κ°€ 많으면 μˆ˜ν–‰ μ‹œκ°„μ΄ 맀우 느렀짐

 

3. κ΅°μ§‘μ˜ 개수(K)λ₯Ό κ²°μ •ν•˜κΈ° 어렀움

 

 

 

 

 

KMeans Parameter

μ‚¬μ΄ν‚·λŸ° νŒ¨ν‚€μ§€μ˜ KMeans ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같은 νŒŒλΌλ―Έν„°λ₯Ό 가지고 μžˆλ‹€.

Parameter default μ„€λͺ…
n_clusters   ꡰ집화할 개수(μ€‘μ‹¬μ μ˜ 개수,k)
init k-means++ 초기 ꡰ집 μ€‘μ‹¬μ μ˜ μ’Œν‘œ μ„€μ • 방식
n_init 10 초기 ꡰ집 쀑심점 λͺ‡ 번 μ„€μ •
max_iter   μ΅œλŒ€ 반볡 횟수, 이 횟수 이전에 λͺ¨λ“  데이터 이동이 λλ‚˜λ©΄ μ’…λ£Œ
algorithm 'auto' auto, full, elkan

 

 

 

 

 

 

 

KMeans μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•œ iris 데이터 μ…‹ ꡰ집화

ν•„μš” λͺ¨λ“ˆκ³Ό 데이터셋 λ‘œλ“œ

from sklearn.preprocessing import scale
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline

iris = load_iris()
df = pd.DataFrame(data = iris.data, columns =['sepal_length','sepal_width','petal_length','petal_width'])
df.head()

μ‚¬μ΄ν‚·λŸ°μ˜ load_iris()λ₯Ό μ΄μš©ν•˜μ—¬ 뢓꽃 데이터λ₯Ό μΆ”μΆœν•˜κ³ , DataFrameν˜•μ‹μœΌλ‘œ λ³€κ²½ν•˜μ—¬ 데이터 핸듀링을 νŽΈν•˜κ²Œ ν•  수 μžˆλ‹€. 

 

 

 

 

 

3개의 그룹으둜 ꡰ집화

kmeans = KMeans(n_clusters=3,init = 'k-means++',max_iter=300,random_state = 0)
kmeans.fit(df)
print(kmeans.labels_)

k=3, μ΅œλŒ€ 반볡 νšŒμˆ˜λŠ” 3000으둜 μ„€μ •ν•˜κ³  각 데이터가 μ–΄λ–€ κ΅°μ§‘μœΌλ‘œ λΆ„λ₯˜λ˜μ—ˆλŠ”지 좜λ ₯ν•΄ λ³΄μ•˜λ‹€. 

label 값이 0,1,2둜 κ΅¬μ„±λ˜μ–΄ 있으며 각각 첫 번째, 두 번째, μ„Έ 번째 ꡰ집에 μ†ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 

 

 

 

 

 

df['target'] = iris.target
df['cluster'] = kmeans.labels_
iris_result = df.groupby(['target','cluster'])['sepal_length'].count()
print(iris_result)

λΆ„λ₯˜ 타깃이 0인 데이터듀은 λͺ¨λ‘ 1번 κ΅°μ§‘μœΌλ‘œ 잘 κ·Έλ£Ήν™”λ˜μ—ˆμ§€λ§Œ, 타깃 1κ³Ό 2λŠ” λΆ„μ‚°λ˜μ–΄μ„œ ꡰ집화 λ˜μ—ˆμŒμ„ 확인할 수 μžˆμ—ˆλ‹€. 

 

 

 

 

 

 

μ‹œκ°ν™”

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca_transformed=pca.fit_transform(iris.data)
df['pca_x'] = pca_transformed[:,0]
df['pca_y'] = pca_transformed[:,1]
df.head()

2차원 평면상에 κ°œλ³„ λ°μ΄ν„°μ˜ ꡰ집화λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ 

속성이 4개인 데이터 셋을 2개둜 차원 μΆ•μ†Œν•˜μ˜€λ‹€. 

X,y μ’Œν‘œλ‘œ κ°œλ³„ 데이터λ₯Ό ν‘œν˜„ν•  수 있게 λ˜μ—ˆλ‹€.

 

 

 

 

 

 

#ꡰ집 값이 0,1,2인 κ²½μš°λ§ˆλ‹€ λ³„λ„μ˜ 인덱슀둜 μΆ”μΆœ
marker0 = df[df['cluster'] == 0].index
marker1 = df[df['cluster'] == 1].index
marker2 = df[df['cluster'] == 2].index

#ꡰ집 κ°’ 0,1,2에 ν•΄λ‹Ήν•˜λŠ” 인덱슀둜 각 ꡰ집 레벨의 pca_x, pca_yκ°’ μΆ”μΆœ.o,s,^둜 마컀 ν‘œμ‹œ
plt.scatter(x=df.loc[marker0,'pca_x'],y=df.loc[marker0,'pca_y'],marker='o')
plt.scatter(x=df.loc[marker1,'pca_x'],y=df.loc[marker1,'pca_y'],marker='s')
plt.scatter(x=df.loc[marker2,'pca_x'],y=df.loc[marker2,'pca_y'],marker='^')


plt.xlabel('PCA 1')
plt.ylabel('PCA 2')
plt.title("3 clusters visulaization by 2 PCA Components")
plt.show()

ꡰ집값에 따라 마컀 ν‘œμ‹œλ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ‹œκ°ν™”ν•˜μ˜€λ‹€. 

 

 

 

 

 

 

 

ꡰ집화 μ•Œκ³ λ¦¬μ¦˜ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 데이터 생성

μ‚¬μ΄ν‚·λŸ°μ€ λ‹€μ–‘ν•œ ꡰ집화 μ•Œκ³ λ¦¬μ¦˜μ„ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ κ°„λ‹¨ν•œ 데이터 생성기λ₯Ό μ œκ³΅ν•œλ‹€.

λŒ€ν‘œμ μΈ κ΅°μ§‘ν™”μš© 데이터 μƒμ„±κΈ°λ‘œλŠ” make_blobs()와 make_classification() APIκ°€ μžˆλ‹€. 

두 APIλŠ” λΉ„μŠ·ν•˜κ²Œ μ—¬λŸ¬ ν΄λž˜μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 데이터 셋을 λ§Œλ“ λ‹€. 

make_blobs()λŠ” κ°œλ³„ κ΅°μ§‘μ˜ 쀑심점과 ν‘œμ€€ 편차 μ œμ–΄ κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄ 있고,

make_classification()은 λ…Έμ΄μ¦ˆλ₯Ό ν¬ν•¨ν•œ 데이터λ₯Ό λ§Œλ“œλŠ” 데에 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

 

 

 

데이터셋 생성

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
%matplotlib inline

X,y = make_blobs(n_samples=200, n_features = 2, centers=3, cluster_std = 0.8, random_state=0)
print(X.shape,y.shape)

#y target의 뢄포 확인
unique, counts =np.unique(y,return_counts=True)
print(unique,counts)

 

생성할 λ°μ΄ν„°μˆ˜λŠ” 200, λ°μ΄ν„°μ˜ ν”Όμ²˜ κ°œμˆ˜λŠ” 2, 쀑심점은 3, ν‘œμ€€νŽΈμ°¨λŠ” 0.8둜 μ„€μ •ν•˜μ—¬ 데이터셋을 μƒμ„±ν•˜μ˜€λ‹€. 

 

ν”Όμ²˜ 데이터셋 Xμ—λŠ” 200개의 λ ˆμ½”λ“œμ™€ 2개의 ν”Όμ²˜,

타깃 데이터셋 yμ—λŠ” 200개의 λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•œλ‹€. 

3개의 cluster 값은 [0,1,2] 이며 각각 [67,67,66]개둜 κ· μΌν•˜κ²Œ κ΅¬μ„±λ˜μ–΄μžˆλŠ” 것을 확인 ν•  수 μžˆλ‹€. 

 

 

 

 

 

 

데이터λ₯Ό λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜

import pandas as pd

cluster = pd.DataFrame(data=X,columns=['ftr1','ftr2'])
cluster['target'] = y
cluster.head()

 

 

 

 

 

 

데이터셋이 μ–΄λ–€ ꡰ집화 뢄포λ₯Ό 가지고 λ§Œλ“€μ–΄μ‘ŒλŠ”μ§€ 확인

target_list = np.unique(y)

#각 타깃별 μ‚°μ λ„μ˜ λ§ˆμ»€κ°’
markers = ['o','s','^','P','D','H','X']

#3개의 ꡰ집 μ˜μ—­μœΌλ‘œ κ΅¬λΆ„ν•œ 데이터 셋을 μƒμ„±ν–ˆμœΌλ―€λ‘œ target_listλŠ” [0,1,2]
for target in target_list:
    target_cluster = cluster[cluster['target'] == target]
    plt.scatter(x=target_cluster['ftr1'],y = target_cluster['ftr2'],edgecolor='k',marker=markers[target])
    
plt.show()

 

 

 

 

 

 

 

KMeans ꡰ집화 ν›„ μ‹œκ°ν™”

#KMeans ν΄λŸ¬μŠ€ν„°λ§ μˆ˜ν–‰
kmeans = KMeans(n_clusters=3,init='k-means++',max_iter=200,random_state=0)
cluster_labels = kmeans.fit_predict(X)
cluster['kmeans_label'] = cluster_labels


#cluster_centers_λŠ” κ°œλ³„ ν΄λŸ¬μŠ€ν„°μ˜ 쀑심 μœ„μΉ˜ μ’Œν‘œ μ‹œκ°ν™”λ₯Ό μœ„ν•΄ μΆ”μΆœ
centers = kmeans.cluster_centers_
unique_labels = np.unique(cluster_labels)

#κ΅°μ§‘ν™”λœ label μœ ν˜•λ³„λ‘œ iterationν•˜λ©΄μ„œ marker 별 scatter plot μˆ˜ν–‰
for label in unique_labels:
    label_cluster = cluster[cluster['kmeans_label'] == label]
    center_x_y = centers[label]
    plt.scatter(x=label_cluster['ftr1'],y=label_cluster['ftr2'],edgecolor='k',marker=markers[label])
    
    #ꡰ집별 μ€‘μ‹¬μœ„μΉ˜ μ’Œν‘œ μ‹œκ°ν™”
    plt.scatter(x=center_x_y[0],y = center_x_y[1], s=200, color='white',alpha=0.9,edgecolor='k',marker=markers[label])
    plt.scatter(x=center_x_y[0],y = center_x_y[1], s=70, color='k',edgecolor='k',marker='$%d$' % label)

    
plt.show()

mable_blobs()의 타깃과 kmeans_label은 ꡰ집 번호λ₯Ό μ˜λ―Έν•˜λ―€λ‘œ μ„œλ‘œ λ‹€λ₯Έ κ°’μœΌλ‘œ 맀핑될 수 μžˆλ‹€. 

 

 

 

 

 

 

print(cluster.groupby('target')['kmeans_label'].value_counts())

 

728x90

'πŸ›  Machine Learning > Clustering' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Python] DBSCAN  (0) 2022.03.04
[python] GMM(Gaussian Mixture Model)  (0) 2022.03.03
[Python] 평균 이동  (0) 2022.03.02
[Python] ꡰ집 평가(싀루엣 κ³„μˆ˜)  (0) 2022.03.01
Comments