* "파이썬 머신러닝 완벽 가이드" 서적, 여러 개인 블로그들을 참고한 개인 공부용입니다
군집 시각화 (iris)
2차원 평면상에서 iris 데이터의 속성 4개를 모두 표현하는 것이 적합하지 않아 PCA를 이용해 4개의 속성을 2개로 차원 축소한 후 시각화.
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca_transformed = pca.fit_transform(iris.data)
pca_transformed
irisdf['pca_x'] = pca_transformed[:, 0] #x좌표
irisdf['pca_y'] = pca_transformed[:, 1] #y좌표
irisdf
# 클러스터별 인덱스 추출
marker0 = irisdf[irisdf['cluster'] == 0].index
marker1 = irisdf[irisdf['cluster'] == 1].index
marker2 = irisdf[irisdf['cluster'] == 2].index
#scatter plot
plt.scatter(x = irisdf.loc[marker0, 'pca_x'], y = irisdf.loc[marker0, 'pca_y'], marker = 'o')
plt.scatter(x = irisdf.loc[marker1, 'pca_x'], y = irisdf.loc[marker1, 'pca_y'], marker = 's')
plt.scatter(x = irisdf.loc[marker2, 'pca_x'], y = irisdf.loc[marker2, 'pca_y'], marker = '^')
plt.xlabel('PCA1')
plt.ylabel('PCA2')
plt.title('3 Clusters Visualization by 2 PCA Components')
plt.legend(['cluster0', 'cluster1', 'cluster2'])
plt.show()
군집화 가상데이터
- make_blobs(): 대표적인 군집화 데이터 생성기로 개별 군집의 중심점과 표준 편차 제어기능이 있다.
- make_classfication(): 역시 대표적인 군집화 데이터 생성기로 노이즈를 추가할 수 있다.
- make_circle(), make_moons()은 중심 기반 군집화로 해결하기 어려운 데이터를 생성.
make_blobs()를 통해 군집화 데이터 생성
from sklearn.datasets import make_blobs
import numpy as np
# n_samples : 생성할 총 데이터 개수, n_features: 데이터의 피처 개수, centers:숫자로 설정하면 군집의 개수, ndarray 형태로 표현할 경우 개별 군집 중심점의 좌표, cluster_std : 생성될 군집 데이터의 표준 편차
# 200개의 레코드, 2개의 피처, 3개의 군집
X, y = make_blobs(n_samples=200, n_features=2, centers=3, cluster_std=0.8, random_state=0)
print(X.shape, y.shape)
# target 값 분포
unique, counts = np.unique(y, return_counts=True)
print(f"군집종류: {unique}, 각 군집별 갯수: {counts}")
(200, 2) (200,)
군집종류: [0 1 2], 각 군집별 갯수: [67 67 66]
실제 데이터 시각화
make_blobs()를 통해 생성된 군집화 데이터를 'target(정답지)' 기준으로 시각화
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 프레임 생성
cluster_df = pd.DataFrame(X, columns=["ftr1","ftr2"])
cluster_df["target"] = y
# target 값 종류
target_list = np.unique(y)
# 가상 데이터 시각화
markers=['o', 's', '^']
for target in target_list:
target_cluster = cluster_df[cluster_df['target'] == target]
plt.scatter(x=target_cluster['ftr1'], y=target_cluster['ftr2'],
edgecolor='k', marker=markers[target] )
plt.show()
K-means 결과 시각화
"K-means" 군집화를 통해 'target(분류 정답지)'값을 모르는 상태에서 비지도학습 후 결과 시각화
from sklearn.cluster import KMeans
# K-Means 객체 생성
kmeans = KMeans(n_clusters=3, init="k-means++", max_iter=200, random_state=0)
# cluster label (fit 후 labels_, fit_predict의 결과가 같았다.)
cluster_labels = kmeans.fit_predict(cluster_df.iloc[:,:-1])
cluster_df["kmeans_label"] = cluster_labels
# 개별 클러스터의 중심 위치 좌표
centers = kmeans.cluster_centers_
# cluster 값 종류
unique_labels = np.unique(cluster_labels)
markers=['o', 's', '^', 'P','D','H','x']
for cluster in unique_labels:
# 각 군집 시각화
cluster_v = cluster_df[cluster_df['kmeans_label'] == cluster]
plt.scatter(x=cluster_v['ftr1'], y=cluster_v['ftr2'], edgecolor='k', marker=markers[cluster] )
# 군집별 중심 위치 시각화
center_xy = centers[cluster]
plt.scatter(x = center_xy[0], y = center_xy[1], s=300, color='white',
alpha=0.9, edgecolor='k', marker = markers[cluster])
plt.scatter(x = center_xy[0], y = center_xy[1], s=70, color='k',
edgecolor='k', marker = f"${cluster}$")
plt.show()
=> 실제 데이터 분포와 K-means 결과 비교 시 군집이 비슷하게 나온 것으로 보아, K-means 결과가 잘 나온 것을 알 수 있다.
cluster_df.groupby(['target','kmeans_label']).size()
target kmeans_label
0 0 66
1 1
1 2 67
2 1 65
2 1
dtype: int64
'머신러닝' 카테고리의 다른 글
[군집화] #6. DBSCAN (0) | 2022.07.19 |
---|---|
[군집화] #5. GMM (0) | 2022.07.19 |
[군집화] #4. 평균이동 (0) | 2022.07.19 |
[군집화] #3. 군집평가 (0) | 2022.07.15 |
[군집화] #1. K-means 알고리즘 (0) | 2022.03.22 |