반응형
K-means 클러스터링
sklearn의 kmeans클러스터링을 이용하여 군집분석을 수행한다.
데이터는 iris데이터를 사용한다.
코드
- 필요한 패키지 설치
# 필요한 패키지 설치
import pandas as pd
import numpy as np
from sklearn import datasets
import seaborn as sns
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import proj3d
- 본 데이터 업로드 및 산점도 그리기
# skearn.datasets에 포함된 iris(붓꽃) 데이터 가져오기
iris = datasets.load_iris()
data= pd.DataFrame(iris.data).iloc[:,:3]
data.columns = iris.feature_names[:3]
X = data.copy()
X["target"] = iris.target
display(X)
# 3d scatterplot 그리기
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(X.iloc[:,0],
X.iloc[:,1],
X.iloc[:,2],
s=10, #사이즈
c=X.target,
cmap="rainbow",
alpha=1, #투명도
)
# 축표시
ax.set_xlabel(X.columns[0])
ax.set_ylabel(X.columns[1])
ax.set_zlabel(X.columns[2])
# 범례표시
legend1 = ax.legend(*scatter.legend_elements(), title="Classes")
ax.add_artist(legend1)
plt.show()
- k-means로 군집분석 한 후 산점도 그리기
원래 데이터를 이용하여 지도학습 시킨것이 아닌,
붓꽃 데이터를 이용하여 군집분석한 후 원래 분류와 차이를 보는 것이므로 class는 다를 수 있다.
(즉 원래 붓꽃 데이터를 분류하는 모델이 아닌, 군집분석을 하기위해 붓꽃데이터를 써봤을 뿐)
from sklearn.cluster import KMeans
# [inertia를 통해서 최적 분류 개수 찾기]
X = data.copy()
inertias = []
num=10
for k in range(1,num):
model = KMeans(n_clusters=k)
model.fit(X)
inertias.append(model.inertia_)
plt.figure(figsize=(4, 4))
plt.plot([i for i in range(1,num)], inertias, '-o')
plt.xlabel('number of clusters, k')
plt.ylabel('inertia')
plt.xticks([i for i in range(1,num)])
plt.show()
# [모델생성 및 학습]
clust_model = KMeans(n_clusters = 3 # 클러스터 갯수
# , n_init=10 # initial centroid를 몇번 샘플링한건지, 데이터가 많으면 많이 돌릴수록안정화된 결과가 나옴
# , max_iter=500 # KMeans를 몇번 반복 수행할건지, K가 큰 경우 1000정도로 높여준다
# , random_state = 42
# , algorithm='auto'
)
clust_model.fit(X)
# [예측값과 군집중심값]
centers = clust_model.cluster_centers_ # 각 군집의 중심점
pred = clust_model.predict(X) # 각 예측군집
# [3d scatterplot 그리기]
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
X["pred"] = pred
display(X)
ax.scatter(centers[:,0],centers[:,1],centers[:,2] ,c='black', s=200, marker='*')
scatter = ax.scatter(X.iloc[:,0],
X.iloc[:,1],
X.iloc[:,2],
s=10, #사이즈
c=X.pred,
cmap="rainbow",
alpha=1, #투명도
)
# 축표시
ax.set_xlabel(X.columns[0])
ax.set_ylabel(X.columns[1])
ax.set_zlabel(X.columns[2])
# 범례표시
legend1 = ax.legend(*scatter.legend_elements(), title="Classes")
ax.add_artist(legend1)
plt.show()
반응형