본문 바로가기

코딩으로 익히는 Python/모델링

[Python] 22. Kmeans

728x90
반응형
SMALL
from sklearn.cluster import KMeans 
import numpy as np 
import pandas as pd 
import seaborn as sns
import matplotlib.pyplot as plt
import mglearn
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV


import warnings
warnings.simplefilter('ignore')

 

Kmeans

 

mglearn.plots.plot_kmeans_algorithm() # 랜덤하게 점 찍은 후 가까운 점들 분류하고 센터로 이동 분류 이동 ...


데이터 불러오기 (pd.read_csv)

python 파일 경로에 만든 후 data5폴더에 다음의 'kmeans.csv' 파일 넣어놓기

kmeans.csv
0.00MB

 

df = pd.read_csv('data5/kmeans.csv',index_col = 'Unnamed: 0')
df

 

plt.scatter(df['x'],df['y'],s=100)
plt.show()


비지도학습(군집분류)

 

  • 라벨이 없음
  • 전부 피쳐로만 이루어져 있음

 

k = KMeans(n_clusters=4) # 몇 개로 분류하는 것이 좋을지 알아내야함
km = k.fit(df) # 비지도기 때문에 x_data, y_data 이런식으로 나눌수가 없음

 

type(km)
[OUT] :

sklearn.cluster._kmeans.KMeans

 

cen = km.cluster_centers_ # 4개로 분류했을 때의 센터 값
cen
[OUT] :

array([[14.4       ,  8.        ],
       [ 7.        ,  9.5       ],
       [ 8.        , 17.25      ],
       [ 6.18181818,  4.45454545]])

 

plt.scatter(df['x'],df['y'],s=100)
plt.scatter(cen[:,0],cen[:,1],marker='s',c=['r','g','m','y'],s=120)
plt.show()

 

km.labels_
[OUT] :

array([3, 1, 2, 3, 3, 3, 2, 3, 1, 1, 3, 3, 3, 2, 2, 3, 3, 1, 1, 2, 2, 3,
       1, 2, 0, 0, 0, 0, 2, 0])

 

df['label'] = km.labels_
df

 

sns.pairplot(df,hue='label')
plt.show()

 

sns.lmplot(x='x',y='y',data=df, fit_reg=False, hue='label',
          scatter_kws={"s":150})
plt.show()


연습문제

 

iris data를 이용하여 최적의 분류개수(n_clusters)를 찾고 kmeans로 군집분류를 수행하시오
주의) 비지도는 그리드써치를 쓸 수 없음 (정답이 없기 때문에)


Solution

 

iris = load_iris()
x_data = pd.DataFrame( iris['data'] , columns=iris['feature_names'])
model = KMeans(n_clusters=3)
km = model.fit(iris['data'])

 

km.labels_
[OUT] :

array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 0, 0, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2,
       2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2,
       2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0])

 

irisDF = pd.DataFrame(iris['data'])
irisDF['label'] = km.labels_
irisDF

 

sns.pairplot( irisDF, hue='label')
plt.show( )

 

km.inertia_ 
# 각 데이터로부터 자신이 속한 군집의 중심까지의 거리 총합의 평균 
# 이 값이 작을 수록 응집도가 높게 군집화가 잘되었다
[OUT] :

78.85144142614601

 

data  = []
for n in range(1,11):
    model = KMeans(n_clusters=n)
    km = model.fit(iris['data'])
    data.append(km.inertia_)
data
[OUT] :

[681.3706,
 152.34795176035792,
 78.85144142614601,
 57.255523809523815,
 46.44618205128205,
 39.62838526383526,
 34.56651068134764,
 30.283654761904767,
 28.02497681266103,
 26.47396115288221]

 

plt.plot(range(1,11),data,'ro--') # 최적의 개수는 3 (평평해지기 바로 전까지)
plt.show()


728x90
반응형
LIST