六個(gè)常用的聚類評價(jià)指標(biāo)
評估聚類結(jié)果的有效性,即聚類評估或驗(yàn)證,對于聚類應(yīng)用程序的成功至關(guān)重要。它可以確保聚類算法在數(shù)據(jù)中識別出有意義的聚類,還可以用來確定哪種聚類算法最適合特定的數(shù)據(jù)集和任務(wù),并調(diào)優(yōu)這些算法的超參數(shù)(例如k-means中的聚類數(shù)量,或DBSCAN中的密度參數(shù))。
雖然監(jiān)督學(xué)習(xí)技術(shù)有明確的性能指標(biāo),如準(zhǔn)確性、精度和召回率,但評估聚類算法更具挑戰(zhàn)性:
由于聚類是一種無監(jiān)督學(xué)習(xí)方法,因此沒有可以比較聚類結(jié)果的基礎(chǔ)真值標(biāo)簽。
確定“正確”簇?cái)?shù)量或“最佳”簇通常是一個(gè)主觀的決定,即使對領(lǐng)域?qū)<乙彩侨绱?。一個(gè)人認(rèn)為是有意義的簇,另一個(gè)人可能會認(rèn)為是巧合。
在許多真實(shí)世界的數(shù)據(jù)集中,簇之間的界限并不明確。一些數(shù)據(jù)點(diǎn)可能位于兩個(gè)簇的邊界,可以合理地分配給兩個(gè)簇。
不同的應(yīng)用程序可能優(yōu)先考慮簇的不同方面。例如,在一個(gè)應(yīng)用程序中,可能必須有緊密、分離良好的簇,而在另一個(gè)應(yīng)用程序中,捕獲整體數(shù)據(jù)結(jié)構(gòu)可能更重要。
考慮到這些挑戰(zhàn),通常建議結(jié)合使用評估指標(biāo)、視覺檢查和領(lǐng)域?qū)I(yè)知識來評估簇性能。
一般來說,我們使用兩種類型的聚類評估度量(或度量):
內(nèi)部:不需要任何基礎(chǔ)事實(shí)來評估簇的質(zhì)量。它們完全基于數(shù)據(jù)和聚類結(jié)果。
外部:將聚類結(jié)果與真值標(biāo)簽進(jìn)行比較。(因?yàn)檎嬷禈?biāo)簽在數(shù)據(jù)中是沒有的,所以需要從外部引入)
通常,在實(shí)際的應(yīng)用程序中,外部信息(如真值標(biāo)簽)是不可用的,這使得內(nèi)部度量成為簇驗(yàn)證的唯一可行選擇。
在本文中,我們將探討聚類算法的各種評估指標(biāo),何時(shí)使用它們,以及如何使用Scikit-Learn計(jì)算它們。
內(nèi)部指標(biāo)
由于聚類的目標(biāo)是使同一簇中的對象相似,而不同簇中的對象不同,因此大多數(shù)內(nèi)部驗(yàn)證都基于以下兩個(gè)標(biāo)準(zhǔn):
緊湊性度量:同一簇中對象的緊密程度。緊湊性可以用不同的方法來衡量,比如使用每個(gè)簇內(nèi)點(diǎn)的方差,或者計(jì)算它們之間的平均成對距離。
分離度量:一個(gè)簇與其他簇的區(qū)別或分離程度。分離度量的例子包括簇中心之間的成對距離或不同簇中對象之間的成對最小距離。
我們將描述三種最常用的內(nèi)部度量方法,并討論它們的優(yōu)缺點(diǎn)。
1、輪廓系數(shù)
輪廓系數(shù)(或分?jǐn)?shù))通過比較每個(gè)對象與自己的聚類的相似性與與其他聚類中的對象的相似性來衡量聚類之間的分離程度[1]。
我們首先定義數(shù)據(jù)點(diǎn)x的輪廓系數(shù)為:
這里的A (x′)是x′到簇中所有其他數(shù)據(jù)點(diǎn)的平均距離?;蛘哒f 如果點(diǎn)x∈屬于簇C∈,那么
其中d(x, x?)是點(diǎn)x和x之間的距離?。我們可以將a(x ^ e)解釋為點(diǎn)x ^ e與其自身簇匹配程度的度量(值越小,匹配越好)。對于大小為1的簇,a(x′f)沒有明確定義,在這種情況下,我們設(shè)s(x′f) = 0。
B (x′)是x′與相鄰簇中點(diǎn)之間的平均距離,即點(diǎn)到x′的平均距離最小的簇:
輪廓系數(shù)的取值范圍為-1到+1,值越高表示該點(diǎn)與自己的聚類匹配得越好,與鄰近的聚類匹配得越差。
基于樣本的輪廓系數(shù),我們現(xiàn)在將輪廓指數(shù)(SI)定義為所有數(shù)據(jù)點(diǎn)上系數(shù)的平均值:
這里的n為數(shù)據(jù)點(diǎn)總數(shù)。
輪廓系數(shù)提供了對聚類質(zhì)量的整體衡量:
接近1意味著緊湊且分離良好。
在0附近表示重疊。
接近-1表示簇的簇太多或太少。
sklearn的Metrics提供了許多聚類評估指標(biāo),為了演示這些指標(biāo)的使用,我們將創(chuàng)建一個(gè)合成數(shù)據(jù)集,并使用不同的k值對其應(yīng)用k-means聚類。然后,我們將使用評估指標(biāo)來比較這些聚類的結(jié)果。
首先使用make_blobs()函數(shù)從3個(gè)正態(tài)分布的聚類中隨機(jī)選擇500個(gè)點(diǎn)生成一個(gè)數(shù)據(jù)集,然后對其進(jìn)行歸一化,以確保特征具有相同的尺度:
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)
讓我們來繪制數(shù)據(jù)集:
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運(yùn)行k-means聚類,并將聚類結(jié)果存儲在三個(gè)不同的變量中:
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)
現(xiàn)可以使用函數(shù)sklearn.metrics.silhouette_score()來計(jì)算每輪廓分?jǐn)?shù)。
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}')
結(jié)果如下:
SI(2 clusters): 0.569
SI(3 clusters): 0.659
SI(4 clusters): 0.539
可以看到當(dāng)k = 3時(shí),得分最高,并且低于1,這表明簇之間沒有完全分離。
為了計(jì)算每個(gè)樣本的輪廓系數(shù),我們可以使用函數(shù)sklearn.metrics.silhouette_samples?;谶@些系數(shù),可以建立一個(gè)輪廓圖,它提供了一種評估每個(gè)對象在其簇中的位置的方法。在這張圖中,每個(gè)點(diǎn)的輪廓系數(shù)用一條水平線表示(更長的條形表示更好的聚類)。這些條按簇排列和分組。每個(gè)聚類部分的高度表示該聚類中的點(diǎn)的數(shù)量。
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-means聚類輪廓圖為:
k = 4:
在第二張圖中,我們可以看到類0和類3中的大多數(shù)點(diǎn)的輪廓分?jǐn)?shù)低于平均分?jǐn)?shù)。這表明這些聚類可能不代表數(shù)據(jù)集中的自然分組。
讓我們總結(jié)一下輪廓分?jǐn)?shù)的利弊。
優(yōu)點(diǎn):
- 很容易解讀。它的取值范圍是-1到1,接近1的值表示分離良好的簇,接近-1的值表示聚類較差。
- 它不僅提供了對整體簇質(zhì)量的洞察,還提供了對單個(gè)簇質(zhì)量的洞察。這通常使用一個(gè)輪廓圖來可視化,它顯示了簇中的每個(gè)點(diǎn)對總體得分的貢獻(xiàn)。
- 它可以通過比較不同k值的分?jǐn)?shù)并取最大值來確定k-means等算法中的最優(yōu)簇?cái)?shù)。這種方法往往比肘部法更精確,因?yàn)橹獠糠ㄍ枰饔^判斷。
缺點(diǎn):
- 傾向于支持凸簇,而非凸或不規(guī)則形狀的簇可能表現(xiàn)不佳。
- 不考慮簇的密度,這對于評估基于密度的算法(如DBSCAN)很重要。
- 當(dāng)簇之間存在重疊時(shí),輪廓評分可能提供模糊的結(jié)果。
- 可能難以識別較大簇中的子簇。
- 計(jì)算量很大,因?yàn)樗枰?jì)算所有O(n2)個(gè)點(diǎn)之間的成對距離。這可能會使評估過程比聚類本身更昂貴(例如,當(dāng)使用k-means時(shí))。
- 對噪聲和異常值敏感,因?yàn)樗蕾囉诳赡苁墚惓V涤绊懙淖钚〕蓪嚯x。
2、方差比準(zhǔn)則(Calinski-Harabasz Index)
由于Calinski-Harabasz指數(shù)的本質(zhì)是簇間距離與簇內(nèi)距離的比值,且整體計(jì)算過程與方差計(jì)算方式類似,所以又將其稱之為方差比準(zhǔn)則。
K是簇的數(shù)量,N是數(shù)據(jù)點(diǎn)的總數(shù)BCSS (between - cluster Sum of Squares)是每個(gè)聚類質(zhì)心(mean)與整體數(shù)據(jù)質(zhì)心(mean)之間歐氏距離的加權(quán)平方和:
其中n′′是簇i中數(shù)據(jù)點(diǎn)的個(gè)數(shù),c′′是簇i的質(zhì)心(均值),c是所有數(shù)據(jù)點(diǎn)的總體質(zhì)心(均值)。BCSS衡量簇之間的分離程度(越高越好)。
WCSS (Within-Cluster Sum of Squares)是數(shù)據(jù)點(diǎn)與其各自的聚類質(zhì)心之間的歐氏距離的平方和:
WCSS度量簇的緊湊性或內(nèi)聚性(越小越好)。最小化WCSS(也稱為慣性)是基于質(zhì)心的聚類(如k-means)的目標(biāo)。
CHI的分子表示由其自由度k - 1歸一化的簇間分離(固定k - 1個(gè)簇的質(zhì)心也決定了第k個(gè)質(zhì)心,因?yàn)樗闹凳顾匈|(zhì)心的加權(quán)和與整個(gè)數(shù)據(jù)質(zhì)心匹配)。CHI的分母表示由其自由度n- k歸一化的簇內(nèi)離散度(固定每個(gè)簇的質(zhì)心會使每個(gè)簇的自由度減少1)。
將BCSS和WCSS按其自由度劃分有助于使值規(guī)范化,使它們在不同數(shù)量的簇之間具有可比性。如果沒有這種歸一化,CH指數(shù)可能會因k值較高而被人為夸大,從而很難確定指標(biāo)值的增加是由于真正更好的聚類還是僅僅由于簇?cái)?shù)量的增加。
CHI值越高,表示聚類效果越好,因?yàn)檫@意味著數(shù)據(jù)點(diǎn)在聚類之間的分布比在聚類內(nèi)部的分布更分散。
在Scikit-Learn中,我們可以使用函數(shù)sklearn.metrics.calinski_harabasz_score()來計(jì)算這個(gè)值。
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}')
結(jié)果如下:
CH(2 clusters): 734.120
CH(3 clusters): 1545.857
CH(4 clusters): 1212.066
當(dāng)k = 3時(shí),CHI得分最高,這也跟上面的輪廓系數(shù)得到的結(jié)果一樣。
Calinski-Harabasz指數(shù)的優(yōu)缺點(diǎn)如下:
優(yōu)點(diǎn):
- 計(jì)算簡單,計(jì)算效率高。
- 很容易理解。數(shù)值越高通常表示聚類效果越好。
- 像輪廓系數(shù)一樣,它可以用來找到最優(yōu)的簇?cái)?shù)。
- 有一定的理論依據(jù)(它類似于單變量分析中的f檢驗(yàn)統(tǒng)計(jì)量,它比較組間方差和組內(nèi)方差)。
缺點(diǎn):
- 傾向于支持凸簇,對于不規(guī)則形狀的簇可能表現(xiàn)不佳。
- 可能在不同大小的簇中表現(xiàn)不佳,因?yàn)榇笮痛貎?nèi)的方差會不成比例地影響B(tài)CSS和WCSS之間的平衡。
- 不適合評估像DBSCAN這樣基于密度的簇。
- 對噪聲和異常值敏感,因?yàn)檫@些會顯著影響簇內(nèi)和簇間的分散。
3、Davies-Bouldin指數(shù)(DB值)
戴維斯-博爾丁指數(shù)(Davies-Bouldin index, DBI)[3]衡量每個(gè)聚類與其最相似的聚類之間的平均相似度,其中相似度定義為聚類內(nèi)距離(聚類中點(diǎn)到聚類中心的距離)與聚類間距離(聚類中心之間的距離)之比。
S ? 是簇i中所有點(diǎn)到簇c ? 質(zhì)心的平均距離
S?衡量簇的“擴(kuò)散”或“大小”。D (c?,c?)是簇I和j的質(zhì)心之間的距離。
比值(S?+ S?)/ d(c?,c?)表示聚類i和聚類j之間的相似度,即聚類之間的距離和重疊程度。當(dāng)兩個(gè)簇都“大”(即具有較大的內(nèi)部距離)時(shí),分子(即兩個(gè)簇的擴(kuò)散之和)就很高。當(dāng)簇彼此靠近時(shí),表示簇質(zhì)心之間距離的分母較低。因此,如果分子和分母之間的比例較大,則兩個(gè)簇可能重疊或分離不好。相反如果比例很小,則表明簇相對于它們的大小是分開的。
對于每一個(gè)聚類i,DB值確定最大這個(gè)比率的聚類j,即與聚類i最相似的聚類。最終的DB值是所有聚類的這些最壞情況相似度的平均值。
因此,DB值越低,表明簇越緊湊且分離良好,其中0是可能的最低值。
在Scikit-Learn中可以使用函數(shù)sklearn.metrics.davies_bouldin_score()來計(jì)算。
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}')
結(jié)果如下:
BD(2 clusters): 0.633
BD(3 clusters): 0.480
BD(4 clusters): 0.800
當(dāng)k = 3時(shí),DBI得分最低。
優(yōu)點(diǎn):
- 易于快速計(jì)算。
- 很容易理解。該數(shù)值越小表示聚類越好,值為0表示聚類比較理想。
- 和前兩個(gè)分?jǐn)?shù)一樣,它可以用來找到最優(yōu)的簇?cái)?shù)。
缺點(diǎn):
- 傾向于支持凸簇,對于不同大小或不規(guī)則形狀的簇可能表現(xiàn)不佳。
- 對于評估基于密度的聚類算法(如DBSCAN)效率較低。
- 噪聲和異常值會顯著影響指數(shù)。
其他內(nèi)部指標(biāo)
還有許多其他內(nèi)部聚類評價(jià)方法。參見[2],詳細(xì)研究了11種內(nèi)部度量(包括上面提到的那些)及其在驗(yàn)證不同類型數(shù)據(jù)集聚類方面的有效性。
外部指標(biāo)
當(dāng)數(shù)據(jù)點(diǎn)的真實(shí)標(biāo)簽已知時(shí),則可以使用外部評價(jià)指標(biāo)。這些度量將聚類算法的結(jié)果與真值標(biāo)簽進(jìn)行比較。
1、列聯(lián)矩陣(contingency matrix)
與分類問題中的混淆矩陣類似,列聯(lián)矩陣(或表)描述了基本真值標(biāo)簽和聚類標(biāo)簽之間的關(guān)系。
矩陣的行表示真類,列表示簇。矩陣中的每個(gè)單元格,用n∈?表示,包含了類標(biāo)號為i并分配給聚類j的數(shù)據(jù)點(diǎn)的個(gè)數(shù)。
我們可以通過sklearn.metrics.cluster.contingency_matrix()構(gòu)建列聯(lián)矩陣。該函數(shù)以真值標(biāo)簽和聚類標(biāo)簽作為參數(shù)進(jìn)行評估。
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)
結(jié)果如下:
array([[2, 1, 0],
[0, 1, 2]], dtype=int64)
矩陣表示將兩個(gè)0類的數(shù)據(jù)點(diǎn)放置在簇0中,一個(gè)點(diǎn)放置在簇1中。將類1中的兩個(gè)數(shù)據(jù)點(diǎn)放置在簇2中,將一個(gè)數(shù)據(jù)點(diǎn)放置在簇1中。
很多的外部評價(jià)指標(biāo),都使用列聯(lián)矩陣作為其計(jì)算的基礎(chǔ),了解了列聯(lián)矩陣我們開始介紹一些外部指標(biāo)。
2、Adjusted Rand Index(ARI)
Rand Index (RI)[4]以William Rand命名,通過兩兩比較來衡量聚類分配與真實(shí)類標(biāo)簽之間的相似性。計(jì)算簇分配和類標(biāo)簽之間的一致數(shù)與總數(shù)據(jù)點(diǎn)對數(shù)的比值:
A是具有相同類標(biāo)簽且屬于同一聚類的點(diǎn)對的數(shù)目,B是具有不同類標(biāo)簽且屬于不同聚類的點(diǎn)對的個(gè)數(shù)。N是總點(diǎn)數(shù)。
RI的范圍從0到1,其中1表示簇分配和類標(biāo)簽完全相同。
可以使用sklearn.metrics.rand_score()進(jìn)行計(jì)算。
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
在我們的這個(gè)例子中a = 2, b = 8,因此
Rand Index的問題是,即使對于隨機(jī)的簇分配,它也可以得到很高的值,特別是當(dāng)簇?cái)?shù)量很大時(shí)。這是因?yàn)楫?dāng)聚類數(shù)量增加時(shí),隨機(jī)將不同標(biāo)簽的點(diǎn)分配給不同聚類的概率增加。因此特定的RI值可能是模糊的,因?yàn)椴磺宄謹(jǐn)?shù)中有多少是偶然的,多少是實(shí)際一致的。
而ARI通過將RI分?jǐn)?shù)標(biāo)準(zhǔn)化來糾正這一點(diǎn),考慮到隨機(jī)分配簇時(shí)的預(yù)期RI分?jǐn)?shù)。計(jì)算公式如下:
其中E[RI]為隨機(jī)聚類分配下Rand指數(shù)的期望值。該值是使用上面描述的列聯(lián)表計(jì)算的。我們首先計(jì)算表中每行和每列的和:
A?是屬于第i類的點(diǎn)的總數(shù):
B?是分配給聚類j的總點(diǎn)數(shù):
然后使用以下公式計(jì)算ARI:
分子表示如果簇分配是隨機(jī)的(E[RI]),則實(shí)際配對Rand指數(shù)與預(yù)期配對數(shù)之間的差值。分母表示最大可能的配對數(shù)(最大Rand指數(shù))與隨機(jī)情況下的期望配對數(shù)(E[RI])之差。
規(guī)范化此值,調(diào)整數(shù)據(jù)集的大小和元素跨簇的分布。
ARI值的范圍從-1到1,其中1表示簇分配和類標(biāo)簽之間完全一致,0表示隨機(jī)一致,負(fù)值表示一致性低于偶然預(yù)期。
from sklearn.metrics import adjusted_rand_score
print(f'ARI = {adjusted_rand_score(true_labels, cluster_labels):.3f}')
結(jié)果如下:
ARI = 0.242
獨(dú)立于類標(biāo)簽的聚類賦值會得到ARI比如負(fù)值或接近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}')
結(jié)果如下:
RI = 0.400
ARI = -0.364
使用我們上面創(chuàng)建的數(shù)據(jù)集,我們數(shù)據(jù)點(diǎn)有真實(shí)標(biāo)簽(存儲在y變量中),所以可以使用外部評估指標(biāo)來評估我們之前獲得的三個(gè)k-means聚類。這些聚類的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}')
結(jié)果如下:
ARI(2 clusters): 0.565
ARI(3 clusters): 1.000
ARI(4 clusters): 0.864
當(dāng)k = 3時(shí),得到一個(gè)完美的ARI分?jǐn)?shù),這意味著在這種情況下,簇分配和真實(shí)標(biāo)簽之間存在完美匹配。
優(yōu)點(diǎn):
- RI分?jǐn)?shù)的取值范圍是0到1,ARI分?jǐn)?shù)的取值范圍是-1到1。有界范圍使得比較不同算法之間的分?jǐn)?shù)變得容易。
- 對于任意數(shù)量的樣本和簇,隨機(jī)(均勻)簇分配的ARI分?jǐn)?shù)都接近于0。
- ARI對機(jī)會的調(diào)整使其更加可靠和可解釋性。
- 沒有對聚類結(jié)構(gòu)做任何假設(shè),這使得這些指標(biāo)對于比較不同的聚類算法非常有用,而不依賴于聚類形狀。
缺點(diǎn):
- 需要有真實(shí)的標(biāo)簽來確定結(jié)果
3、同質(zhì)性、完整性和v測度
這些方法通過檢查聚類分配與真實(shí)類標(biāo)簽的一致性來評估聚類的質(zhì)量。
同質(zhì)性 Homogeneity 度量每個(gè)簇是否只包含單個(gè)類的成員。
定義如下:
這里:
C代表真值類標(biāo)簽。K表示算法分配的聚類標(biāo)簽。H(C|K)是給定聚類分配的類分布的條件熵的加權(quán)平均值:
其中nc,?為分配給k簇的c類樣本數(shù),n?為k簇的樣本數(shù),n為總樣本數(shù)。H(C)為類分布的熵:
同質(zhì)性評分范圍為0 ~ 1,其中1表示完全同質(zhì)性,即每個(gè)簇只包含單個(gè)類的成員。
完整性 Completeness 度量給定類的所有成員是否被分配到同一個(gè)簇。
定義如下:
H(K|C)是給定類標(biāo)簽的聚類分布條件熵的加權(quán)平均值:
其中nc為c類的樣本數(shù)。
H(K)為聚類分布的熵:
與同質(zhì)性一樣,完整性的范圍從0到1,其中1表示完全完整,即每個(gè)類成員被分配到單個(gè)簇。
V-measure是同質(zhì)性和完備性的調(diào)和平均值,它可以提供一個(gè)單一的分?jǐn)?shù)來評估聚類性能:
通過使用調(diào)和均值,V-measure懲罰同質(zhì)性和完整性之間的不平衡,鼓勵(lì)更均勻的聚類性能。
在Scikit-Learn中可以使用sklearn.metrics中的函數(shù)homogeneity_score、completeness_score和v_measure_score來計(jì)算
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}')
結(jié)果如下:
Homogeneity = 0.667
Completeness = 0.421
V-measure = 0.516
將其應(yīng)用在我們的示例上:
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}')
結(jié)果如下:
V-measure(2 clusters): 0.711
V-measure(3 clusters): 1.000
V-measure(4 clusters): 0.895
當(dāng)k = 3時(shí),我們得到一個(gè)完美的V-measure分?jǐn)?shù)1.0,這意味著聚類標(biāo)簽與基本真值標(biāo)簽完全一致。
優(yōu)點(diǎn):
- 提供簇分配和類標(biāo)簽之間匹配的直接評估。
- 比分在0到1之間,有直觀的解釋。
- 沒有對簇結(jié)構(gòu)做任何假設(shè)。
缺點(diǎn):
- 不要考慮數(shù)據(jù)點(diǎn)在每個(gè)簇中的分布情況。
- 不針對隨機(jī)分組進(jìn)行規(guī)范化(不像ARI)。這意味著取決于樣本、簇和類的數(shù)量,樣本的完全隨機(jī)分組并不總是產(chǎn)生相同的同質(zhì)性、完備性和v度量值。因此,對于小數(shù)據(jù)集(樣本數(shù)量< 1000)或大量簇(> 10),使用ARI更安全。
4、Fowlkes-Mallows Index(FMI)
Fowlkes-Mallows Index (FMI)[5]定義為對精度(分組點(diǎn)對的準(zhǔn)確性)和召回率(正確分組在一起的對的完整性)的幾何平均值:
TP(True Positive)是具有相同類標(biāo)簽并屬于同一簇的點(diǎn)對的數(shù)量。FP (False Positive)是具有不同類標(biāo)簽但被分配到同一聚類的點(diǎn)對的數(shù)量。FN(False Negative)是具有相同類標(biāo)簽但分配給不同簇的點(diǎn)對的數(shù)量。
FMI評分范圍為0 ~ 1,其中0表示聚類結(jié)果與真實(shí)標(biāo)簽不相關(guān),1表示完全相關(guān)。
Scikit-Learn中可以使用函數(shù)sklearn.metrics. fowlkes_malallows_score()來計(jì)算這個(gè)分?jǐn)?shù)
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}')
結(jié)果:FMI = 0.471,在本例中,TP = 2, FP = 1, FN = 4,則:
將其應(yīng)用到我們的示例:
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}')
結(jié)果如下:
FMI(2 clusters): 0.711
FMI(3 clusters): 1.000
FMI(4 clusters): 0.895
當(dāng)k = 3時(shí),得到了一個(gè)完美的FMI分?jǐn)?shù),這表明聚類分配與基本真值標(biāo)簽完全一致。
優(yōu)點(diǎn):
- 同時(shí)考慮準(zhǔn)確率和召回率,提供一個(gè)平衡的聚類性能視圖。
- 比分在0到1之間。
- 對于任意數(shù)量的樣本和簇,隨機(jī)(均勻)標(biāo)簽分配的FMI得分接近于0。
- 不對簇結(jié)構(gòu)做假設(shè)。
缺點(diǎn):
- 它是基于對元素的分析,這可能無法捕捉到簇更廣泛的結(jié)構(gòu)特性,比如它們的形狀或分布。
- 當(dāng)數(shù)據(jù)集高度不平衡(即一個(gè)類主導(dǎo)數(shù)據(jù)集)時(shí),F(xiàn)MI可能無法準(zhǔn)確反映聚類的有效性。
總結(jié)
下表總結(jié)了本文討論的不同指標(biāo)和特點(diǎn):