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' 파일 넣어놓기
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
'코딩으로 익히는 Python > 모델링' 카테고리의 다른 글
[Python] 24. 시계열 예측 (0) | 2021.02.01 |
---|---|
[Python] 23. PCA(차원축소),T-SNE (11) | 2021.01.26 |
[Python] 21. SVM(서포트벡터머신) (0) | 2021.01.26 |
[Python] 20. 나이브베이즈 (0) | 2021.01.26 |
[Python] 19. MLP : pima-indians 예제 (0) | 2021.01.26 |