よく使われる6つのクラスタリング評価指標

よく使われる6つのクラスタリング評価指標

クラスタリング結果の妥当性を評価すること、つまりクラスタリング評価または検証は、クラスタリング アプリケーションの成功に不可欠です。これにより、クラスタリング アルゴリズムがデータ内の意味のあるクラスターを識別できるようになります。また、特定のデータセットとタスクに最適なクラスタリング アルゴリズムを決定したり、それらのアルゴリズムのハイパーパラメータ (k-means のクラスター数や DBSCAN の密度パラメータなど) を調整したりするためにも使用できます。

教師あり学習手法には、精度、適合率、再現率などの明確なパフォーマンス指標がありますが、クラスタリング アルゴリズムの評価はより困難です。

クラスタリングは教師なし学習方法であるため、クラスタリング結果を比較するためのグラウンドトゥルースラベルはありません。

クラスターの「適切な」数、または「最適な」数を決定することは、ドメインの専門家にとっても主観的な判断となることがよくあります。ある人が意味のあるクラスターと考えるものを、別の人は偶然と考えるかもしれません。

多くの現実世界のデータセットでは、クラスター間の境界は明確ではありません。一部のデータ ポイントは 2 つのクラスターの境界に位置し、両方のクラスターに合理的に割り当てることができます。

アプリケーションによって、クラスタリングの優先順位が異なる場合があります。たとえば、あるアプリケーションでは、密に分離されたクラスターが必要になる場合がありますが、別のアプリケーションでは、全体的なデータ構造をキャプチャすることがより重要になる場合があります。

これらの課題を考慮すると、クラスタリング パフォーマンスを評価するには、評価メトリック、目視検査、ドメインの専門知識を組み合わせて使用​​することが推奨されることが多いです。

一般的に、クラスタリング評価メトリック (または測定基準) には 2 種類あります。

内部: クラスターの品質を評価するためにグラウンドトゥルースは必要ありません。これらはすべてデータとクラスタリング結果に基づいています。

外部: クラスタリング結果を実際の値ラベルと比較します。 (真の値ラベルはデータ内にないため、外部から導入する必要があります)

通常、実際のアプリケーションでは、グラウンドトゥルースラベルなどの外部情報は利用できないため、クラスター検証には内部メトリックが唯一の実行可能な選択肢となります。

この記事では、クラスタリング アルゴリズムのさまざまな評価メトリック、それらを使用するタイミング、および Scikit-Learn を使用してそれらを計算する方法について説明します。

内部指標

クラスタリングの目的は、同じクラスター内のオブジェクトを類似させ、異なるクラスター内のオブジェクトを異なるものにすることであるため、ほとんどの内部検証は次の 2 つの基準に基づいています。

コンパクトネスの尺度: オブジェクトがどれだけ密集しているか。コンパクトさは、各クラスター内のポイントの分散を使用するか、クラスター間の平均ペアワイズ距離を計算するなど、さまざまな方法で測定できます。

分離度: あるクラスターが他のクラスターからどれだけ異なるか、または分離されているか。分離メトリックの例には、クラスター中心間のペアワイズ距離や、異なるクラスター内のオブジェクト間のペアワイズ最小距離などがあります。

最も一般的に使用される 3 つの内部測定方法について説明し、それぞれの長所と短所について説明します。

1. シルエット係数

シルエット係数(またはスコア)は、各オブジェクトの自身のクラスターとの類似性と他のクラスター内のオブジェクトとの類似性を比較することによって、クラスター間の分離を測定します[1]。

まず、データポイント x のシルエット係数を次のように定義します。

ここで、A(x′)はx′からクラスター内の他のすべてのデータポイントまでの平均距離です。言い換えれば、点x∈がクラスターC∈に属する場合、

ここで、d(x, xⱼ)は点xと点xⱼの間の距離です。 a(x^e) は、点 x^e がそのクラスターにどの程度一致しているかを示す尺度として解釈できます (値が小さいほど、一致度が高くなります)。サイズ1のクラスターの場合、a(x′f)は明確に定義されないため、s(x′f) = 0に設定します。

B (x′) は、x′ と隣接するクラスター内の点との平均距離、つまり点から x′ までの平均距離が最小のクラスターです。

シルエット係数の範囲は -1 から +1 で、値が高いほど、ポイントが自身のクラスターとより一致し、隣接するクラスターとより一致しなくなります。

サンプルのシルエット係数に基づいて、シルエット インデックス (SI) をすべてのデータ ポイントの係数の平均として定義します。

ここで n はデータ ポイントの合計数です。

シルエット係数は、クラスタリング品質の全体的な尺度を提供します。

1 に近いほどコンパクトで分離が良好であることを意味します。

0 に近い場合は重複を示します。

-1 に近い値は、クラスターが多すぎるか少なすぎることを示します。

sklearn のメトリックは、多くのクラスタリング評価メトリックを提供します。これらのメトリックの使用方法を示すために、合成データセットを作成し、さまざまな k 値を使用して k-means クラスタリングを適用します。次に、評価メトリックを使用してこれらのクラスタリングの結果を比較します。

まず、make_blobs() 関数を使用して 3 つの正規分布クラスターから 500 個のポイントをランダムに選択してデータセットを生成し、次にそれを正規化して特徴が同じスケールになるようにします。

 from sklearn.datasets import make_blobs from sklearn.preprocessing import StandardScaler X, y = make_blobs(n_samples=500, centers=3, cluster_std=0.6, random_state=0) X = StandardScaler().fit_transform(X)

データセットをプロットしてみましょう:

 def plot_data(X): sns.scatterplot(x=X[:, 0], y=X[:, 1], edgecolor='k', legend=False) plt.xlabel('$x_1$') plt.ylabel('$x_2$') plot_data(X)

次に、k = 2、3、4 で k-means クラスタリングを実行し、クラスタリング結果を 3 つの異なる変数に保存します。

 from sklearn.cluster import KMeans labels_k2 = KMeans(n_clusters=2, random_state=0).fit_predict(X) labels_k3 = KMeans(n_clusters=3, random_state=0).fit_predict(X) labels_k4 = KMeans(n_clusters=4, random_state=0).fit_predict(X)

これで、関数 sklearn.metrics.silhouette_score() を使用して、シルエットごとのスコアを計算できるようになりました。

 from sklearn.metrics import silhouette_score print(f'SI(2 clusters): {silhouette_score(X, labels_k2):.3f}') print(f'SI(3 clusters): {silhouette_score(X, labels_k3):.3f}') print(f'SI(4 clusters): {silhouette_score(X, labels_k4):.3f}')

結果は次のとおりです。

 SI(2 clusters): 0.569 SI(3 clusters): 0.659 SI(4 clusters): 0.539

k = 3 の場合、スコアが最も高く、1 より低いことがわかります。これは、クラスターが完全に分離されていないことを示しています。

各サンプルのシルエット係数を計算するには、関数 sklearn.metrics.silhouette_samples を使用します。これらの係数に基づいてシルエット マップを構築することができ、これによりクラスター内の各オブジェクトの位置を評価する方法が提供されます。このグラフでは、各ポイントのシルエット係数が水平線で表されます (バーが長いほどクラスタリングが優れていることを示します)。バーはクラスターに配置され、グループ化されます。各クラスター セクションの高さは、そのクラスター内のポイントの数を表します。

 import matplotlib.cm as cm from sklearn.metrics import silhouette_samples def silhouette_plot(X, cluster_labels): n_clusters = len(np.unique(cluster_labels)) silhouette_avg = silhouette_score(X, cluster_labels) # Compute the silhouette coefficient for each sample sample_silhouette_values = silhouette_samples(X, cluster_labels) y_lower = 10 for i in range(n_clusters): # Get the silhouette coefficients for samples in cluster i and sort them cluster_silhouette_values = sample_silhouette_values[cluster_labels == i] cluster_silhouette_values.sort() # Compute the height of the cluster section cluster_size = len(cluster_silhouette_values) y_upper = y_lower + cluster_size # Plot the coefficients for cluster i using horizontal bars color = cm.nipy_spectral(float(i) / n_clusters) plt.fill_betweenx(np.arange(y_lower, y_upper), 0, cluster_silhouette_values, facecolor=color, edgecolor=color, alpha=0.7) # Show the cluster numbers at the middle plt.text(-0.05, y_lower + 0.5 * cluster_size, str(i)) # Compute the new y_lower for the next cluster y_lower = y_upper + 10 # Draw a vertical line for the average silhouette score plt.axvline(x=silhouette_avg, color='red', linestyle='--') plt.yticks([]) # Clear the yaxis labels / ticks plt.xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1]) plt.xlabel('Silhouette coefficient values') plt.ylabel('Cluster label')

k = 3 の場合の k 平均法クラスタリング プロファイルは次のとおりです。

k = 4:

2 番目の画像では、クラス 0 とクラス 3 のほとんどのポイントのシルエット スコアが平均スコアよりも低いことがわかります。これは、これらのクラスターがデータセット内の自然なグループ化を表していない可能性があることを示唆しています。

シルエットスコアの長所と短所をまとめてみましょう。

アドバンテージ:

  • 非常に解釈しやすいです。値の範囲は -1 から 1 で、1 に近い値はクラスターが適切に分離されていることを示し、-1 に近い値はクラスタリングが不十分であることを示します。
  • クラスター全体の品質だけでなく、個々のクラスターの品質についても洞察が得られます。これは多くの場合、シルエット プロットを使用して視覚化され、クラスター内の各ポイントが全体のスコアにどの程度貢献しているかを示します。
  • 異なる k 値のスコアを比較し、最大値を取ることで、k-means などのアルゴリズムで最適なクラスター数を決定するために使用できます。この方法は、主観的な判断を必要とすることが多い肘法よりも正確である傾向があります。

欠点:

  • 凸型クラスターが有利になる傾向がありますが、非凸型または不規則な形状のクラスターではパフォーマンスが低下する可能性があります。
  • クラスターの密度は考慮されていません。これは、DBSCAN などの密度ベースのアルゴリズムを評価する上で重要です。
  • クラスター間に重複がある場合、シルエット スコアリングではあいまいな結果が返される可能性があります。
  • 大きなクラスター内のサブクラスターを識別するのは難しい場合があります。
  • これは、すべての O(n²) ポイント間のペアワイズ距離を計算する必要があるため、計算コストが高くなります。これにより、評価プロセスのコストがクラスタリング自体のコストよりも高くなる可能性があります (たとえば、k-means を使用する場合)。
  • 外れ値の影響を受ける可能性のある最小ペアワイズ距離に依存するため、ノイズと外れ値の影響を受けやすい。

2. 分散比基準(Calinski-Harabasz指数)

Calinski-Harabasz 指数の本質はクラスター間距離とクラスター内距離の比であり、全体的な計算プロセスは分散計算方法に似ているため、分散比基準とも呼ばれます。

K はクラスターの数、N はデータ ポイントの合計数です。BCSS (クラスター間の二乗和) は、各クラスターの重心 (平均) と全体のデータ重心 (平均) 間のユークリッド距離の二乗の加重和です。

ここで、n'' はクラスター i 内のデータ ポイントの数、c'' はクラスター i の重心 (平均)、c はすべてのデータ ポイントの全体的な重心 (平均) です。 BCSS はクラスター間の分離度を測定します (高いほど優れています)。

WCSS (クラスター内二乗和) は、データ ポイントとそれぞれのクラスター重心間のユークリッド距離の二乗の合計です。

WCSS は、クラスターのコンパクトさまたは凝集度を測定します (小さいほど優れています)。 WCSS (慣性とも呼ばれる) を最小化することが、k-means などの重心ベースのクラスタリングの目標です。

CHI の分子は、k - 1 の自由度で正規化されたクラスター間の分離を表します (k - 1 クラスターの重心を固定すると、すべての重心の加重合計がデータ全体の重心と一致するため、k 番目の重心も決定されます)。 CHI の分母は、自由度 n - k で正規化されたクラスター内の分散を表します (各クラスターの重心を固定すると、各クラスターの自由度が 1 減少します)。

BCSS と WCSS を自由度で分割すると、値を正規化し、異なる数のクラスター間で比較できるようになります。この正規化を行わないと、k の値が高い場合に CH インデックスが人為的に膨らむ可能性があり、インデックス値の増加が本当にクラスタリングが向上したためなのか、単にクラスタ数が増加したためなのかを判断することが難しくなります。

CHI 値が高いほど、データ ポイントがクラスター内よりもクラスター間で分散していることを意味するため、クラスタリングが優れていることを示します。

Scikit-Learn では、関数 sklearn.metrics.calinski_harabasz_score() を使用してこの値を計算できます。

 from sklearn.metrics import calinski_harabasz_score print(f'CH(2 clusters): {calinski_harabasz_score(X, labels_k2):.3f}') print(f'CH(3 clusters): {calinski_harabasz_score(X, labels_k3):.3f}') print(f'CH(4 clusters): {calinski_harabasz_score(X, labels_k4):.3f}')

結果は次のとおりです。

 CH(2 clusters): 734.120 CH(3 clusters): 1545.857 CH(4 clusters): 1212.066

k = 3 のとき、CHI スコアは最も高くなり、これは上記のシルエット係数によって得られた結果と同じです。

Calinski-Harabasz 指数の長所と短所は次のとおりです。

アドバンテージ:

  • 計算はシンプルで効率的です。
  • とてもわかりやすいです。一般的に、値が高いほどクラスタリングが優れていることを示します。
  • シルエット係数と同様に、最適なクラスター数を見つけるために使用できます。
  • これには理論的根拠があります (グループ間の分散とグループ内の分散を比較する単変量解析の f 検定統計量に似ています)。

欠点:

  • 凸状のクラスターが優先される傾向があり、不規則な形状のクラスターではパフォーマンスが低下する可能性があります。
  • 大規模なクラスター内の差異が BCSS と WCSS のバランスに不均衡な影響を与えるため、さまざまなサイズのクラスター全体でパフォーマンスが低下する可能性があります。
  • DBSCAN のような密度ベースのクラスタリングを評価するのには適していません。
  • ノイズや外れ値はクラスター内およびクラスター間の分散に大きな影響を与える可能性があるため、これらの影響を受けやすいです。

3. デイビス・ボールディン指数(DB値)

デイヴィス・ボールディン指数(DBI)[3]は、各クラスターと最も類似したクラスター間の平均類似度を測定します。類似度は、クラスター内距離(クラスターの中点からクラスターの中心までの距離)とクラスター間距離(クラスターの中心間の距離)の比として定義されます。

S ᵢ は、クラスター i 内のすべての点からクラスター c の重心までの平均距離です ᵢ

Sᵢはクラスターの「広がり」または「サイズ」を測定します。 D(cᵢ,cⱼ)はクラスターIとjの重心間の距離です。

比率 (Sᵢ + Sⱼ) / d(cᵢ, cⱼ) は、クラスター i とクラスター j 間の類似度、つまりクラスター間の距離と重なりを表します。両方のクラスターが「大きい」(つまり、内部距離が大きい)場合、分子(つまり、両方のクラスターの拡散の合計)は高くなります。クラスターが互いに近い場合、クラスターの重心間の距離を表す分母は低くなります。したがって、分子と分母の比率が大きい場合、2 つのクラスターが重なったり、分離が不十分になったりする可能性があります。逆に、比率が小さい場合は、クラスターがそのサイズに比べて分離されていることを示します。

各クラスター i について、DB 値によって比率が最大となるクラスター j、つまりクラスター i に最も類似するクラスターが決定されます。最終的な DB 値は、すべてのクラスターにわたるこれらの最悪の類似性の平均です。

したがって、DB 値が低いほど、クラスターがよりコンパクトで適切に分離されていることを示し、0 が最低値となります。

Scikit-Learn では、関数 sklearn.metrics.davies_bouldin_score() を使用してこれを計算できます。

 from sklearn.metrics import davies_bouldin_score print(f'BD(2 clusters): {davies_bouldin_score(X, labels_k2):.3f}') print(f'BD(3 clusters): {davies_bouldin_score(X, labels_k3):.3f}') print(f'BD(4 clusters): {davies_bouldin_score(X, labels_k4):.3f}')

結果は次のとおりです。

 BD(2 clusters): 0.633 BD(3 clusters): 0.480 BD(4 clusters): 0.800

k = 3 の場合、DBI スコアは最低になります。

アドバンテージ:

  • 計算が簡単で速いです。
  • とてもわかりやすいです。値が小さいほどクラスタリングは良好であり、値 0 は理想的なクラスタリングを示します。
  • 前の 2 つのスコアと同様に、最適なクラスターの数を見つけるために使用できます。

欠点:

  • 凸型クラスターが優先される傾向があり、さまざまなサイズや不規則な形状のクラスターではパフォーマンスが低下する可能性があります。
  • DBSCAN などの密度ベースのクラスタリング アルゴリズムを評価するのにはあまり効率的ではありません。
  • ノイズや外れ値はインデックスに大きな影響を与える可能性があります。

その他の内部指標

内部クラスタリング評価方法は他にも多数あります。 11の内部メトリクス(上記のものを含む)の詳細な研究と、異なるタイプのデータセットのクラスタリングを検証する際のそれらの有効性については、[2]を参照してください。

外部指標

データ ポイントの実際のラベルがわかっている場合は、外部評価メトリックを使用できます。これらのメトリックは、クラスタリング アルゴリズムの結果を実際の値ラベルと比較します。

1. コンティンジェンシーマトリックス

分類問題における混同行列と同様に、コンティンジェンシー行列 (または表) は、グラウンド トゥルース ラベルとクラスター ラベル間の関係を表します。

行列の行は真のクラスを表し、列はクラスターを表します。 n∈ⱼで表される行列の各セルには、クラスター j に割り当てられたクラス ラベル i を持つデータ ポイントの数が含まれます。

sklearn.metrics.cluster.contingency_matrix() を通じてコン​​ティンジェンシー マトリックスを構築できます。関数は、グラウンド トゥルース ラベルとクラスター ラベルを引数として評価されます。

 from sklearn.metrics.cluster import contingency_matrix true_labels = [0, 0, 0, 1, 1, 1] cluster_labels = [0, 0, 1, 1, 2, 2] contingency_matrix(true_labels, cluster_labels)

結果は次のとおりです。

 array([[2, 1, 0], [0, 1, 2]], dtype=int64)

マトリックス表現では、クラス 0 のデータ ポイント 2 つがクラスター 0 に配置され、1 つのポイントがクラスター 1 に配置されます。クラス 1 の 2 つのデータ ポイントはクラスター 2 に配置され、1 つのデータ ポイントはクラスター 1 に配置されます。

多くの外部評価指標は、コンティンジェンシーマトリックスを計算の基礎として使用します。コンティンジェンシーマトリックスを理解した後、いくつかの外部指標を導入し始めます。

2. 調整ランド指数(ARI)

ランド指数(RI)[4]はウィリアム・ランドにちなんで名付けられ、クラスター割り当てと真のクラスラベル間の類似性を一対比較によって測定します。クラスター割り当てとクラスラベル間の一致数とデータポイントペアの合計数の比率を計算します。

A は同じクラス ラベルを持ち、同じクラスターに属するポイント ペアの数であり、B は異なるクラス ラベルを持ち、異なるクラスターに属するポイント ペアの数です。 N はポイントの合計数です。

RI の範囲は 0 ~ 1 で、1 はクラスターの割り当てとクラス ラベルがまったく同じであることを示します。

sklearn.metrics.rand_score() を使用して計算できます。

 from sklearn.metrics import rand_score true_labels = [0, 0, 0, 1, 1, 1] cluster_labels = [0, 0, 1, 1, 2, 2] print(f'RI = {rand_score(true_labels, cluster_labels):.3f}')

得る:

 RI = 0.667

この例ではa = 2、b = 8なので、

Rand インデックスの問題は、特にクラスターの数が多い場合に、ランダムなクラスター割り当ての場合でも非常に高い値が得られる可能性があることです。これは、クラスターの数が増えると、異なるラベルを持つポイントが異なるクラスターにランダムに割り当てられる確率が高くなるためです。したがって、スコアのうちどれだけが偶然によるもので、どれだけが実際に一貫しているかが不明瞭であるため、特定の RI 値は曖昧になる可能性があります。

ARI は、クラスターをランダムに割り当てるときに予想される RI スコアを考慮して RI スコアを正規化することでこれを修正します。計算式は以下のとおりです。

ここで、E[RI]はランダムクラスタリング割り当てにおけるRand指数の期待値です。この値は、上記の分割表を使用して計算されました。まず、表の各行と列の合計を計算します。

Aᵢはi番目のクラスに属する点の総数である。

Bⱼはクラスターjに割り当てられたポイントの合計数です。

ARI は次の式を使用して計算されます。

分子は、実際のペアワイズRandインデックスと、クラスター割り当てがランダムであった場合のペアワイズマッチの予想数(E[RI])との差を表します。分母は、可能な最大ペアリング数(最大ランド指数)とランダムな状況下での予想されるペアリング数(E[RI])の差を表します。

この値を正規化すると、データセットのサイズとクラスター間の要素の分布が調整されます。

ARI 値の範囲は -1 から 1 で、1 はクラスター割り当てとクラス ラベルが完全に一致していることを示し、0 はランダムに一致していることを示し、負の値は偶然により予想されるよりも一致が低いことを示します。

 from sklearn.metrics import adjusted_rand_score print(f'ARI = {adjusted_rand_score(true_labels, cluster_labels):.3f}')

結果は次のとおりです。

 ARI = 0.242

クラスラベルとは独立してクラスターを割り当てると、ARI 値は負または 0 に近くなります。

 true_labels = [0, 0, 0, 1, 1, 1] cluster_labels = [0, 1, 2, 0, 1, 2] print(f'RI = {rand_score(true_labels, cluster_labels):.3f}') print(f'ARI = {adjusted_rand_score(true_labels, cluster_labels):.3f}')

結果は次のとおりです。

 RI = 0.400 ARI = -0.364

上記で作成したデータセットを使用すると、データ ポイントの実際のラベル (y 変数に格納) が得られるため、外部評価メトリックを使用して、以前に取得した 3 つの k 平均法クラスタリングを評価できます。これらのクラスターの ARI スコアは次のとおりです。

 print(f'ARI(2 clusters): {adjusted_rand_score(y, labels_k2):.3f}') print(f'ARI(3 clusters): {adjusted_rand_score(y, labels_k3):.3f}') print(f'ARI(4 clusters): {adjusted_rand_score(y, labels_k4):.3f}')

結果は次のとおりです。

 ARI(2 clusters): 0.565 ARI(3 clusters): 1.000 ARI(4 clusters): 0.864

k = 3 の場合、完全な ARI スコアが得られます。つまり、この場合、クラスターの割り当てと実際のラベルが完全に一致することになります。

アドバンテージ:

  • RI スコアの範囲は 0 ~ 1、ARI スコアの範囲は -1 ~ 1 です。範囲を限定すると、異なるアルゴリズム間のスコアを簡単に比較できるようになります。
  • サンプルとクラスターの数に関係なく、ランダム (均一) なクラスター割り当ての ARI スコアは 0 に近くなります。
  • ARI の偶然性調整により、信頼性と解釈可能性が向上します。
  • クラスター構造については何も仮定されていないため、これらのメトリックはクラスターの形状に依存せずにさまざまなクラスタリング アルゴリズムを比較するのに非常に役立ちます。

欠点:

  • 結果を決定するには実際のラベルが必要です

3. 均質性、完全性、v 尺度

これらの方法は、クラスターの割り当てと実際のクラス ラベルとの一貫性をチェックすることで、クラスタリングの品質を評価します。

均質性は、各クラスターに単一のクラスのメンバーのみが含まれているかどうかを測定します。

定義は次のとおりです。

ここ:

C は真のクラス ラベルを表します。 K はアルゴリズムによって割り当てられたクラスター ラベルを表します。 H(C|K)は、クラスター割り当てを与えられたクラス分布の条件付きエントロピーの加重平均です。

ここで、nc,ₖはクラスターkに割り当てられたクラスcのサンプル数、nₖはクラスターk内のサンプル数、nはサンプルの合計数です。 H(C)はクラス分布のエントロピーです。

均質性スコアの範囲は 0 から 1 です。1 は完全な均質性を示します。つまり、各クラスターには 1 つのクラスのメンバーのみが含まれます。

完全性は、特定のクラスのすべてのメンバーが同じクラスターに割り当てられているかどうかを測定します。

定義は次のとおりです。

H(K|C)は、クラスラベルが与えられたクラスター分布の条件付きエントロピーの加重平均です。

ここで、nc はクラス c のサンプル数です。

H(K)はクラスター分布のエントロピーです。

同質性と同様に、完全性の範囲は 0 から 1 までで、1 は完全な完全性、つまり各クラス メンバーが 1 つのクラスターに割り当てられていることを示します。

V 尺度は、均質性と完全性の調和平均であり、クラスタリング パフォーマンスを評価するための単一のスコアを提供します。

V メジャーは調和平均を使用することで、均質性と完全性の間の不均衡をペナルティ化し、より均一なクラスタリング パフォーマンスを促進します。

Scikit-Learnでは、sklearn.metricsのhomogeneity_score、completeness_score、v_measure_score関数を使用して計算できます。

 from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score true_labels = [0, 0, 0, 1, 1, 1] cluster_labels = [0, 0, 1, 1, 2, 2] print(f'Homogeneity = {homogeneity_score(true_labels, cluster_labels):.3f}') print(f'Completeness = {completeness_score(true_labels, cluster_labels):.3f}') print(f'V-measure = {v_measure_score(true_labels, cluster_labels):.3f}')

結果は次のとおりです。

 Homogeneity = 0.667 Completeness = 0.421 V-measure = 0.516

これを例に当てはめると次のようになります。

 print(f'V-measure(2 clusters): {v_measure_score(y, labels_k2):.3f}') print(f'V-measure(3 clusters): {v_measure_score(y, labels_k3):.3f}') print(f'V-measure(4 clusters): {v_measure_score(y, labels_k4):.3f}')

結果は次のとおりです。

 V-measure(2 clusters): 0.711 V-measure(3 clusters): 1.000 V-measure(4 clusters): 0.895

k = 3 の場合、完全な V 測定スコア 1.0 が得られます。これは、クラスター ラベルがグラウンド トゥルース ラベルと完全に一致していることを意味します。

アドバンテージ:

  • クラスター割り当てとクラス ラベルの一致を直接評価します。
  • スコアは 0 ~ 1 の間で、直感的に解釈できます。
  • クラスター構造については何も想定されていません。

欠点:

  • 各クラスター内でデータ ポイントがどのように分散されているかを考慮しません。
  • ランダム化グループに対して正規化されていません (ARI とは異なります)。つまり、サンプル、クラスター、クラスの数によっては、サンプルを完全にランダムにグループ化しても、必ずしも同じ均質性、完全性、v 測定値が生成されるわけではありません。したがって、データセットが小さい場合 (サンプル数 < 1000) やクラスター数が多い場合 (> 10) は、ARI を使用する方が安全です。

4. フォークス・マローズ指数(FMI)

フォークス・マローズ指数(FMI)[5]は、精度(ポイントペアをグループ化する正確さ)と再現率(正しくグループ化されたペアの完全性)の幾何平均として定義されます。

TP (True Positive) は、同じクラス ラベルを持ち、同じクラスターに属するポイント ペアの数です。 FP (False Positive) は、クラス ラベルは異なるが同じクラスターに割り当てられているポイント ペアの数です。 FN (False Negative) は、同じクラス ラベルを持つが異なるクラスターに割り当てられているポイント ペアの数です。

FMI スコアの範囲は 0 ~ 1 です。0 はクラスタリング結果が実際のラベルと無関係であることを意味し、1 は完全に関連していることを意味します。

Scikit-Learn では、関数 sklearn.metrics.fowlkes_malallows_score() を使用してこのスコアを計算できます。

 from sklearn.metrics import fowlkes_mallows_score true_labels = [0, 0, 0, 1, 1, 1] cluster_labels = [0, 0, 1, 1, 2, 2] print(f'FMI = {fowlkes_mallows_score(true_labels, cluster_labels):.3f}')

結果: FMI = 0.471。この例では、TP = 2、FP = 1、FN = 4 なので、次のようになります。

これを例に当てはめると次のようになります。

 print(f'FMI(2 clusters): {v_measure_score(y, labels_k2):.3f}') print(f'FMI(3 clusters): {v_measure_score(y, labels_k3):.3f}') print(f'FMI(4 clusters): {v_measure_score(y, labels_k4):.3f}')

結果は次のとおりです。

 FMI(2 clusters): 0.711 FMI(3 clusters): 1.000 FMI(4 clusters): 0.895

k = 3 の場合、完全な FMI スコアが得られ、これはクラスターの割り当てが真のラベルと完全に一致していることを示します。

アドバンテージ:

  • 精度と再現率の両方を同時に考慮すると、クラスタリング パフォーマンスのバランスの取れたビューが得られます。
  • スコアは0~1です。
  • サンプル数とクラスター数に関係なく、ランダム (均一) ラベル割り当ての FMI スコアは 0 に近くなります。
  • クラスター構造については何も想定されていません。

欠点:

  • これは要素の分析に基づいており、クラスターの形状や分布などのより広範な構造特性を捉えられない可能性があります。
  • データセットが非常に不均衡な場合(つまり、1 つのクラスがデータセットを支配している場合)、FMI はクラスタリングの効果を正確に反映しない可能性があります。

要約する

次の表は、この記事で説明したさまざまなメトリックと機能をまとめたものです。

<<:  AutoGPTオープンソースAIエージェントを理解する

>>: 

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

[文字列処理アルゴリズム] 文字列を整数に変換するアルゴリズム設計とCコード実装

1. 要件の説明数字の文字列を入力し、その文字列を整数に変換して出力するプログラムを作成します。たと...

AI バイアス: なぜ起こるのか、そして企業はどのように修正できるのか

ビジネスや社会で AI の利用が広まるにつれ、企業は機械モデルに現れる人間の偏見に注意を払う必要があ...

ペアデータなしで学習!浙江大学らは、マルチモーダルコントラスト表現C-MCRの接続を提案した。

マルチモーダル対照表現 (MCR) の目標は、異なるモダリティからの入力を意味的に整合された共有空間...

Redis に基づく分散ロックと Redlock アルゴリズム

[[403381]]この記事はWeChatの公開アカウント「UP Technology Contro...

OpenAI が ChatGPT にマルチモーダル入力機能を追加しました。ご存知ですか?

OpenAIのCEO、サム・アルトマン氏は昨夜Twitterで、ChatGPTに音声と画像の機能が...

AI の力: Docker による機械学習アプリケーションの導入とスケーラビリティの簡素化

翻訳者 |李睿レビュー | Chonglou近年、機械学習の応用が爆発的に増加しており、堅牢でスケー...

AI チップ: なぜそれほど重要なのか?

周りを見渡せば、人工知能がいかに重要になっているかがわかるでしょう。顔認識カメラでも音声アシスタント...

モザイクも安全ではないのですか? 「ブロックバスター」のモザイクはAIによってワンクリックで削除可能

知っていましたか?モザイクはもう安全ではありません!こんにちは、友人の皆さん。私は Jiguo.co...

海外の専門家による人工知能の発展見通しに関する衝撃的な4つの予測

人工知能技術が成熟するにつれ、この技術のより広範な社会的、倫理的影響に十分な注意が払われていないので...

GoogleのオープンソースAIは92%の精度で音を区別できる

[[249335]] VentureBeatによると、Googleの人工知能研究部門は音声認識におい...

...

...

AI業界の「第2の成長曲線」を牽引する清華大学傘下のRealAIが第3世代のAI製品をリリース

12月9日、清華大学人工知能研究所、北京市知源人工知能研究所、北京市瑞来スマートテクノロジー株式会社...

ディープラーニング Pytorch フレームワーク Tensor

[[433522]] 1 テンソル刈り込み操作テンソル内の要素を範囲でフィルタリングする勾配クリッ...

将来的には映画の吹き替えにも人工知能が使われるようになるのでしょうか?

英国人映画監督が人工知能(AI)を使って外国映画の鑑賞方法に革命をもたらそうとしている。俳優の顔をデ...