클러스터링 성능 평가에서 우연성 조정

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실험실에서는 균일 분포 랜덤 레이블링이 일부 클러스터링 평가 지표의 동작에 미치는 영향을 탐구합니다. 클러스터링 알고리즘은 근본적으로 지도 학습이 아닌 방법이며, 평가 지표는 "지도" 기준 정보를 활용하여 생성된 클러스터의 품질을 정량화합니다. 그러나 조정되지 않은 클러스터링 평가 지표는 세분화된 레이블링에 대해 큰 값을 출력하여 완전히 랜덤일 수 있으므로 오해의 소지가 있습니다. 따라서, 조정된 지표만이 주어진 k 값에 대해 데이터 세트의 다양한 중첩된 하위 샘플에 대한 클러스터링 알고리즘의 평균 안정성을 평가하는 합의 지표로 안전하게 사용될 수 있습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 고급 레벨의 실험이며 완료율은 31%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

평가할 지표 목록 정의

먼저 클러스터링 알고리즘을 평가하는 데 사용할 지표 목록을 정의합니다. 이러한 지표의 예로는 V-측도, 랜드 지수, 조정된 랜드 지수 (ARI), 상호 정보 (MI), 정규화된 상호 정보 (NMI), 조정된 상호 정보 (AMI) 가 있습니다.

from sklearn import metrics

score_funcs = [
    ("V-측도", metrics.v_measure_score),
    ("랜드 지수", metrics.rand_score),
    ("ARI", metrics.adjusted_rand_score),
    ("MI", metrics.mutual_info_score),
    ("NMI", metrics.normalized_mutual_info_score),
    ("AMI", metrics.adjusted_mutual_info_score),
]

실험 1 - 고정된 기준 레이블과 증가하는 클러스터 수

균일 분포 랜덤 레이블링을 생성하고 random_labels 함수를 사용하여 n_classes에 분포된 고정된 기준 레이블 집합 (labels_a) 을 만듭니다. 그리고 여러 개의 랜덤하게 "예측된" 레이블 집합 (labels_b) 을 평가하여 주어진 n_clusters에서 특정 지표의 변동성을 평가합니다.

rng = np.random.RandomState(0)

def random_labels(n_samples, n_classes):
    return rng.randint(low=0, high=n_classes, size=n_samples)

def fixed_classes_uniform_labelings_scores(
    score_func, n_samples, n_clusters_range, n_classes, n_runs=5
):
    scores = np.zeros((len(n_clusters_range), n_runs))
    labels_a = random_labels(n_samples=n_samples, n_classes=n_classes)

    for i, n_clusters in enumerate(n_clusters_range):
        for j in range(n_runs):
            labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
            scores[i, j] = score_func(labels_a, labels_b)
    return scores

실험 1 결과 시각화

matplotlibseaborn 라이브러리를 사용하여 첫 번째 실험 결과를 시각화합니다. 랜드 지수는 n_clustersn_classes보다 클 경우 포화됩니다. V-측도와 같은 다른 조정되지 않은 측정값은 클러스터 수와 샘플 수 사이에 선형적인 의존성을 보여줍니다. 기회에 대한 조정 측정값 (예: ARI 및 AMI) 은 샘플 수와 클러스터 수에 관계없이 평균 점수 0.0 주변에 중심을 둔 일부 랜덤 변동을 보입니다.

import matplotlib.pyplot as plt
import seaborn as sns

n_samples = 1000
n_classes = 10
n_clusters_range = np.linspace(2, 100, 10).astype(int)
plots = []
names = []

sns.color_palette("colorblind")
plt.figure(1)

for marker, (score_name, score_func) in zip("d^vx.,", score_funcs):
    scores = fixed_classes_uniform_labelings_scores(
        score_func, n_samples, n_clusters_range, n_classes=n_classes
    )
    plots.append(
        plt.errorbar(
            n_clusters_range,
            scores.mean(axis=1),
            scores.std(axis=1),
            alpha=0.8,
            linewidth=1,
            marker=marker,
        )[0]
    )
    names.append(score_name)

plt.title(
    "랜덤 균일 레이블링에 대한 클러스터링 측정값\n"
    f"{n_classes}개 클래스를 가진 참조 할당과 비교"
)
plt.xlabel(f"클러스터 수 (샘플 수는 {n_samples}로 고정)")
plt.ylabel("점수 값")
plt.ylim(bottom=-0.05, top=1.05)
plt.legend(plots, names, bbox_to_anchor=(0.5, 0.5))
plt.show()

실험 2 - 클래스 수와 클러스터 수 변화

이 섹션에서는 여러 지표를 사용하여 2 개의 균일 분포 랜덤 레이블링을 평가하는 유사한 함수를 정의합니다. 이 경우 각 가능한 값에 대해 클래스 수와 할당된 클러스터 수가 n_clusters_range 내에서 일치합니다.

def uniform_labelings_scores(score_func, n_samples, n_clusters_range, n_runs=5):
    scores = np.zeros((len(n_clusters_range), n_runs))

    for i, n_clusters in enumerate(n_clusters_range):
        for j in range(n_runs):
            labels_a = random_labels(n_samples=n_samples, n_classes=n_clusters)
            labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
            scores[i, j] = score_func(labels_a, labels_b)
    return scores

실험 2 결과 시각화

matplotlib 라이브러리를 사용하여 두 번째 실험 결과를 시각화합니다. 첫 번째 실험과 유사한 결과를 관찰합니다. 기회에 대한 조정된 지표는 0 에 가깝게 유지되는 반면, 다른 지표는 레이블링이 더 세분화됨에 따라 증가하는 경향이 있습니다. 측정에 사용된 총 샘플 수에 클러스터 수가 가까워질수록 랜덤 레이블링의 평균 V-측정값이 상당히 증가합니다.

n_samples = 100
n_clusters_range = np.linspace(2, n_samples, 10).astype(int)

plt.figure(2)

plots = []
names = []

for marker, (score_name, score_func) in zip("d^vx.,", score_funcs):
    scores = uniform_labelings_scores(score_func, n_samples, n_clusters_range)
    plots.append(
        plt.errorbar(
            n_clusters_range,
            np.median(scores, axis=1),
            scores.std(axis=1),
            alpha=0.8,
            linewidth=2,
            marker=marker,
        )[0]
    )
    names.append(score_name)

plt.title(
    "2 개의 랜덤 균일 레이블링에 대한 클러스터링 측정값\n클러스터 수가 동일한 경우"
)
plt.xlabel(f"클러스터 수 (샘플 수는 {n_samples}로 고정)")
plt.ylabel("점수 값")
plt.legend(plots, names)
plt.ylim(bottom=-0.05, top=1.05)
plt.show()

요약

이 실험에서는 균일 분포된 랜덤 레이블링이 일부 클러스터링 평가 지표의 동작에 미치는 영향을 탐구했습니다. 결과는 조정되지 않은 클러스터링 평가 지표가 오해의 소지가 있음을 보여주며, 오직 조정된 측정값만이 데이터 세트의 다양한 중첩된 하위 샘플에 대해 주어진 k 값에 대한 클러스터링 알고리즘의 평균 안정성을 평가하는 합의 지표로 안전하게 사용될 수 있음을 시사합니다.