소개
이 실습에서는 파이썬의 scikit-learn 라이브러리를 사용하여 몇 가지 예제 데이터셋에 계층적 군집화를 수행할 것입니다. 계층적 군집화는 상향식 또는 하향식 방식으로 클러스터의 계층 구조를 만드는 군집화 방법입니다. 계층적 군집화의 목표는 서로 유사하고 다른 클러스터의 점들과는 다른 점들의 클러스터를 찾는 것입니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 로드되는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
라이브러리 가져오기 및 데이터 로드
계층적 군집화 예제에 사용할 필요한 라이브러리를 가져오고 예제 데이터셋을 로드하는 것으로 시작합니다.
import time
import warnings
import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler
from itertools import cycle, islice
np.random.seed(0)
## %%
## 알고리즘의 확장성을 확인하기 위해 충분히 큰 크기의 데이터셋을 선택하지만, 너무 큰 크기로 인해 실행 시간이 너무 길어지지 않도록 합니다.
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.5, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
no_structure = np.random.rand(n_samples, 2), None
## 이방성 분포 데이터
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
transformation = [[0.6, -0.6], [-0.4, 0.8]]
X_aniso = np.dot(X, transformation)
aniso = (X_aniso, y)
## 분산이 다른 blob 데이터
varied = datasets.make_blobs(
n_samples=n_samples, cluster_std=[1.0, 2.5, 0.5], random_state=random_state
)
계층적 군집화 수행
이제 1 단계에서 로드한 예제 데이터셋에 계층적 군집화를 수행합니다. single, average, complete, ward 와 같은 다양한 연결 방법을 사용하여 클러스터를 생성합니다.
## 클러스터 매개변수 설정
plt.figure(figsize=(9 * 1.3 + 2, 14.5))
plt.subplots_adjust(
left=0.02, right=0.98, bottom=0.001, top=0.96, wspace=0.05, hspace=0.01
)
plot_num = 1
default_base = {"n_neighbors": 10, "n_clusters": 3}
datasets = [
(noisy_circles, {"n_clusters": 2}),
(noisy_moons, {"n_clusters": 2}),
(varied, {"n_neighbors": 2}),
(aniso, {"n_neighbors": 2}),
(blobs, {}),
(no_structure, {}),
]
for i_dataset, (dataset, algo_params) in enumerate(datasets):
## 데이터셋별 값으로 매개변수 업데이트
params = default_base.copy()
params.update(algo_params)
X, y = dataset
## 매개변수 선택을 쉽게 하기 위해 데이터셋 정규화
X = StandardScaler().fit_transform(X)
## ============
## 클러스터 객체 생성
## ============
ward = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="ward"
)
complete = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="complete"
)
average = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="average"
)
single = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="single"
)
clustering_algorithms = (
("Single Linkage", single),
("Average Linkage", average),
("Complete Linkage", complete),
("Ward Linkage", ward),
)
for name, algorithm in clustering_algorithms:
t0 = time.time()
## kneighbors_graph 관련 경고 처리
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore",
message="the number of connected components of the "
+ "connectivity matrix is [0-9]{1,2}"
+ " > 1. Completing it to avoid stopping the tree early.",
category=UserWarning,
)
algorithm.fit(X)
t1 = time.time()
if hasattr(algorithm, "labels_"):
y_pred = algorithm.labels_.astype(int)
else:
y_pred = algorithm.predict(X)
plt.subplot(len(datasets), len(clustering_algorithms), plot_num)
if i_dataset == 0:
plt.title(name, size=18)
colors = np.array(
list(
islice(
cycle(
[
"#377eb8",
"#ff7f00",
"#4daf4a",
"#f781bf",
"#a65628",
"#984ea3",
"#999999",
"#e41a1c",
"#dede00",
]
),
int(max(y_pred) + 1),
)
)
)
plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])
plt.xlim(-2.5, 2.5)
plt.ylim(-2.5, 2.5)
plt.xticks(())
plt.yticks(())
plt.text(
0.99,
0.01,
("%.2fs" % (t1 - t0)).lstrip("0"),
transform=plt.gca().transAxes,
size=15,
horizontalalignment="right",
)
plot_num += 1
plt.show()
결과 분석
이제 계층적 군집화 결과를 분석해 보겠습니다. 사용한 예제 데이터셋을 기반으로 다음과 같은 관찰을 할 수 있습니다.
- Single linkage 는 빠르며 비구형 데이터에 대해 잘 수행될 수 있지만, 노이즈가 있는 경우 성능이 저하됩니다.
- Average linkage 와 complete linkage 는 명확하게 분리된 구형 클러스터에 대해 잘 수행되지만, 그렇지 않은 경우에는 결과가 혼재됩니다.
- Ward 는 노이즈가 많은 데이터에 대해 가장 효과적인 방법입니다.
이러한 관찰은 알고리즘에 대한 직관적인 이해를 제공하지만, 이러한 직관은 매우 고차원 데이터에는 적용되지 않을 수 있다는 점에 유의해야 합니다.
요약
이 실습에서는 파이썬의 scikit-learn 라이브러리를 사용하여 계층적 군집화를 수행하는 방법을 배웠습니다. single, average, complete, ward 와 같은 다양한 연결 방법을 사용하여 클러스터를 생성하고, 몇 가지 예제 데이터셋을 기반으로 결과를 분석했습니다. 계층적 군집화는 유사한 데이터 포인트의 클러스터를 식별하는 강력한 기술이며, 생물학, 마케팅, 금융 등 다양한 분야에서 유용하게 활용될 수 있습니다.