【Python】正解ラベルありのクラスタリングに対する評価方法を解説

  • URLをコピーしました!

今回は、クラスタリングを評価する指標について紹介します。

また、実際にPythonを使用し、クラスタリングを評価する方法を解説します。

動画で詳しく学習したい方はこちらもおすすめ

目次

クラスタリングを評価する指標

クラスタリングを評価する指標は大きく2つに分類されます。

  1. 外部評価指数
    正解ラベルありのデータに使用
  2. 内部評価指数
    正解ラベルなしのデータに使用

今回は、正解ラベルありのデータに使用する「外部評価指数」について詳しく紹介していきます。

外部評価指標

外部評価指標には、いくつか指標があります。その中でも主要なものを紹介します。

調整ランド指数(ARI)

調整ランド指数(Adjusted Rand Index, ARI)は、ランド指数(Rand Index, RI)を調整し、偶然による一致を考慮した指標です。

ランド指数とは、データのペアが同じクラスタに属するかを基準に評価する指標のことです。

調整ランド指数の値は、-1から1の範囲であり、1に近いほど性能が良いクラスタリングであることを意味します。

正規化相互情報量(NMI)

正規化相互情報量(Normalized Mutual Information, NMI)は、クラスタリング結果とラベルの情報量を測定します。

正規化相互情報量の値は、0から1の範囲であり、ARI同様に1に近いほど性能が良いクラスタリングであることを意味します。

Python実践 調整ランド指数(ARI)

それでは、Pythonを使用し、ARIを実装する方法を紹介していきます!

scikit-learnライブラリのmetricsをインポートして使用します。

PythonでARIを実装する方法は以下の通りです。

from sklearn.metrics import adjusted_rand_score

ARI = adjusted_rand_score(ラベル, クラスタリング結果)

実際にARIを使用し、k-means/DBSCANでクラスタリングした結果を評価してます。

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans, DBSCAN
from sklearn.metrics import adjusted_rand_score

# サンプルデータの生成
X, y = make_moons(n_samples=300, noise=0.05, random_state=42)

# k-meansクラスタリング
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_

# DBSCAN
dbscan = DBSCAN(eps=0.2, min_samples=5)
clusters = dbscan.fit_predict(X)

# 結果の可視化
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)
axes[0].set_title("k-means Clustering ARI {:.2f}".format(adjusted_rand_score(y, labels)))
axes[0].set_xlabel("Feature 1")
axes[0].set_ylabel("Feature 2")

axes[1].scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', s=50)
axes[1].set_title("DBSCAN Clustering ARI {:.2f}".format(adjusted_rand_score(y, clusters)))
axes[1].set_xlabel("Feature 1")
axes[1].set_ylabel("Feature 2")

plt.show()

実行結果

k-meansのARIが0.29なのに対し、DBSCANは1.00であり、今回のデータではDBSCANのほうがクラスタリングの精度が良いことがわかります。

Python実践 正規化相互情報量(NMI)

それでは、Pythonを使用し、NMIを実装する方法を紹介していきます!

scikit-learnライブラリのmetricsをインポートして使用します。

PythonでNMIを実装する方法は以下の通りです。

from sklearn.metrics import normalized_mutual_info_score

NMI = normalized_mutual_info_score(ラベル, クラスタリング結果)

実際にNMIを使用し、k-means/DBSCANでクラスタリングした結果を評価してます。

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans, DBSCAN
from sklearn.metrics import normalized_mutual_info_score

# サンプルデータの生成
X, y = make_moons(n_samples=300, noise=0.05, random_state=42)

# k-meansクラスタリング
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_

# DBSCAN
dbscan = DBSCAN(eps=0.2, min_samples=5)
clusters = dbscan.fit_predict(X)

# 結果の可視化
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
axes[0].scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50)
axes[0].set_title("k-means Clustering NMI {:.2f}".format(normalized_mutual_info_score(y, labels)))
axes[0].set_xlabel("Feature 1")
axes[0].set_ylabel("Feature 2")

axes[1].scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', s=50)
axes[1].set_title("DBSCAN Clustering NMI {:.2f}".format(normalized_mutual_info_score(y, clusters)))
axes[1].set_xlabel("Feature 1")
axes[1].set_ylabel("Feature 2")

plt.show()

実行結果

k-meansのNMIが0.37なのに対し、DBSCANは1.00であり、今回のデータではARI同様にDBSCANのほうがクラスタリングの精度が良いことがわかります。

まとめ

クラスタリング結果を評価する方法を紹介しました。

今回は、正解ラベルありのクラスタリングを評価する指標である「外部評価指標」に焦点を当てて説明しました。

また、外部評価指標である「調整ランド指数(ARI)」、「正規化相互情報量(NMI)」について、概要とPythonで実装する方法も合わせて紹介しました。

ここまで読んでくださりありがとうございます。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

エンジニア。20代。組み込みエンジニアとして働き始めるも、働き方や業務内容に限界を感じ、 AI,Web3エンジニアを目指して勉強中。 エンジニアとして思うことや、学んだことを発信します。

目次