聚类模型ari_7.9 聚类模型评估
如果有了類(lèi)別標(biāo)簽,那么聚類(lèi)結(jié)果也可以像分類(lèi)那樣計(jì)算準(zhǔn)確率和召回率。但是不應(yīng)該將分類(lèi)標(biāo)簽作為聚類(lèi)結(jié)果的評(píng)價(jià)指標(biāo),除非你有相關(guān)的先驗(yàn)知識(shí)或某種假設(shè),知道這種分類(lèi)類(lèi)內(nèi)差距更小。但是它還是給出了幾種評(píng)價(jià)標(biāo)準(zhǔn)。
7.9.1 調(diào)整蘭德系數(shù) (Adjusted Rand index)
1. 數(shù)學(xué)原理
蘭德系數(shù)(Rand index)需要給定實(shí)際類(lèi)別信息C,假設(shè)K是聚類(lèi)結(jié)果,a表示在C與K中都是同類(lèi)別的元素對(duì)數(shù),b表示在C與K中都是不同類(lèi)別的元素對(duì)數(shù),則蘭德指數(shù)為:
對(duì)于以上公式,
分子:屬性一致的樣本數(shù),即同屬于這一類(lèi)或都不屬于這一類(lèi)。a是真實(shí)在同一類(lèi)、預(yù)測(cè)也在同一類(lèi)的樣本數(shù);b是真實(shí)在不同類(lèi)、預(yù)測(cè)也在不同類(lèi)的樣本數(shù);
分母:任意兩個(gè)樣本為一類(lèi)有多少種組合,是數(shù)據(jù)集中可以組成的總元素對(duì)數(shù);
RI取值范圍為[0,1],值越大意味著聚類(lèi)結(jié)果與真實(shí)情況越吻合。
對(duì)于隨機(jī)結(jié)果,RI并不能保證分?jǐn)?shù)接近零。為了實(shí)現(xiàn)“在聚類(lèi)結(jié)果隨機(jī)產(chǎn)生的情況下,指標(biāo)應(yīng)該接近零”,調(diào)整蘭德系數(shù)(Adjusted rand index)被提出,它具有更高的區(qū)分度:
ARI取值范圍為[-1,1],值越大意味著聚類(lèi)結(jié)果與真實(shí)情況越吻合。從廣義的角度來(lái)講,ARI衡量的是兩個(gè)數(shù)據(jù)分布的吻合程度。
2. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
對(duì)任意數(shù)量的聚類(lèi)中心和樣本數(shù),隨機(jī)聚類(lèi)的ARI都非常接近于0;
取值在[-1,1]之間,負(fù)數(shù)代表結(jié)果不好,越接近于1越好;
可用于聚類(lèi)算法之間的比較。
缺點(diǎn):
ARI需要真實(shí)標(biāo)簽
3. python代碼實(shí)現(xiàn)
labels_true, labels_pred = check_clusterings(labels_true, labels_pred)
n_samples = labels_true.shape[0]
classes = np.unique(labels_true)
clusters = np.unique(labels_pred)
# Special limit cases: no clustering since the data is not split;
# or trivial clustering where each document is assigned a unique cluster.
# These are perfect matches hence return 1.0.
if (classes.shape[0] == clusters.shape[0] == 1 or classes.shape[0] == clusters.shape[0] == 0 or classes.shape[0] == clusters.shape[0] == len(labels_true)):
return 1.0
contingency = contingency_matrix(labels_true, labels_pred)
# Compute the ARI using the contingency data
sum_comb_c = sum(comb2(n_c) for n_c in contingency.sum(axis=1))
sum_comb_k = sum(comb2(n_k) for n_k in contingency.sum(axis=0))
sum_comb = sum(comb2(n_ij) for n_ij in contingency.flatten())
prod_comb = (sum_comb_c * sum_comb_k) / float(comb(n_samples, 2))
mean_comb = (sum_comb_k + sum_comb_c) / 2.
return ((sum_comb - prod_comb) / (mean_comb - prod_comb))
4. metrics類(lèi)使用方法
設(shè)定已知先驗(yàn)知識(shí)的標(biāo)簽為labels_true,利用聚類(lèi)算法預(yù)測(cè)的樣本標(biāo)簽為label_pred,Adjusted Rand index函數(shù)是在計(jì)算樣本預(yù)測(cè)值和真實(shí)值之間的相似度similarity:同屬于這一類(lèi)或都不屬于這一類(lèi),而不考慮數(shù)據(jù)元素順序和歸一化。示例代碼:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
我們也可以調(diào)整預(yù)測(cè)集label_pred中元素0和1的位置,以及將數(shù)據(jù)集中為2的屬性改名為3,其結(jié)果不受影響,示例代碼:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
此外,調(diào)整adjusted_rand_score函數(shù)中l(wèi)abels_true和labels_pred的位置,對(duì)結(jié)果沒(méi)有影響,示例代碼:
>>> metrics.adjusted_rand_score(labels_pred, labels_true)
0.24...
利用此函數(shù)評(píng)估模型最好的值為1,示例代碼:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
1.0
評(píng)估模型最差的值(與labels_true不相關(guān)),其結(jié)果為負(fù)值或接近0值,示例代碼:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
-0.12...
7.9.2 互信息評(píng)分(Mutual Information based scores)
1. 數(shù)學(xué)原理
互信息(Mutual Information)也是用來(lái)衡量?jī)蓚€(gè)數(shù)據(jù)分布的吻合程度。假設(shè)U與V是對(duì)N個(gè)樣本標(biāo)簽的分配情況,則兩種分布的熵(熵表示的是不確定程度)分別為:
其中:
U與V之間的互信息(MI)定義為:
其中:
標(biāo)準(zhǔn)化后的互信息(Normalized mutual information)為:
不管標(biāo)簽分配之間的“互信息”的實(shí)際數(shù)量如何,互信息或者標(biāo)準(zhǔn)化后的值不會(huì)因此而調(diào)整,而會(huì)隨著標(biāo)簽(簇)數(shù)量的增加而增加。
互信息的期望值可以用如下公式來(lái)計(jì)算:
其中:
ai和bj分別對(duì)應(yīng)著元素屬于Ui和Vj的數(shù)量。
與ARI類(lèi)似,調(diào)整互信息( Adjusted mutual information)定義為:
利用基于互信息的方法來(lái)衡量聚類(lèi)效果需要實(shí)際類(lèi)別信息,MI與NMI取值范圍為[0,1],AMI取值范圍為[-1,1],它們都是值越大意味著聚類(lèi)結(jié)果與真實(shí)情況越吻合。
2. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):除取值范圍在[0,1]之間,其他同ARI,可用于聚類(lèi)模型選擇;
缺點(diǎn):需要先驗(yàn)知識(shí)。
3. python代碼實(shí)現(xiàn)
if contingency is None:
labels_true, labels_pred = check_clusterings(labels_true, labels_pred)
contingency = contingency_matrix(labels_true, labels_pred)
contingency = np.array(contingency, dtype='float')
contingency_sum = np.sum(contingency)
pi = np.sum(contingency, axis=1)
pj = np.sum(contingency, axis=0)
outer = np.outer(pi, pj)
nnz = contingency != 0.0
# normalized contingency
contingency_nm = contingency[nnz]
log_contingency_nm = np.log(contingency_nm)
contingency_nm /= contingency_sum
# log(a / b) should be calculated as log(a) - log(b) for
# possible loss of precision
log_outer = -np.log(outer[nnz]) + log(pi.sum()) + log(pj.sum())
mi = (contingency_nm * (log_contingency_nm - log(contingency_sum))+ contingency_nm * log_outer)
return mi.sum()
4. metrics類(lèi)使用方法
設(shè)定已知先驗(yàn)知識(shí)的標(biāo)簽為labels_true,利用聚類(lèi)算法預(yù)測(cè)的樣本標(biāo)簽為label_pred,互信息是衡量?jī)煞N預(yù)測(cè)的一致性,忽略排列的順序。互信息評(píng)估有兩種方法,標(biāo)準(zhǔn)化的互信息Normalized Mutual Information(NMI) 和調(diào)整后的互信息Adjusted Mutual Information(AMI)。示例代碼:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504...
我們也可以調(diào)整預(yù)測(cè)集label_pred中元素0和1的位置,以及將數(shù)據(jù)集中為2的屬性改名為3,其結(jié)果不受影響,示例代碼:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504..
互信息評(píng)分中mutual_info_score,adjusted_mutual_info_score和normalized_mutual_info_score函數(shù)其參數(shù)都是對(duì)稱(chēng)的,交換的參數(shù)位置不會(huì)改變?cè)u(píng)分值,示例代碼:
>>> metrics.adjusted_mutual_info_score(labels_pred, labels_true)
0.22504...
利用此函數(shù)評(píng)估模型最好的值為1,示例代碼:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
1.0
>>> metrics.normalized_mutual_info_score(labels_true, labels_pred)
1.0
評(píng)估模型最差的值(與labels_true不相關(guān)),其結(jié)果為非正值,示例代碼:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
-0.10526...
7.9.3 同質(zhì)性Homogeneity 完整性completeness 調(diào)和平均V-measure
1. 數(shù)學(xué)原理
同質(zhì)性homogeneity:每個(gè)群集只包含單個(gè)類(lèi)的成員;
完整性completeness:給定類(lèi)的所有成員都分配給同一個(gè)群集。
同質(zhì)性和完整性分?jǐn)?shù)基于以下公式得出:
其中H(C|K)是給定給定簇賦值的類(lèi)的條件熵,由以下公式求得:
H(C)是類(lèi)熵,公式為:
其中,n是樣本總數(shù),nc和nk分別屬于類(lèi)c和類(lèi)k的樣本數(shù),而nc,k是從類(lèi)c劃分到類(lèi)k的樣本數(shù)量。
條件熵H(K|C)和類(lèi)熵H(K),根據(jù)以上公式對(duì)稱(chēng)求得。
V-measure是同質(zhì)性homogeneity和完整性completeness的調(diào)和平均數(shù),公式:
2. 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
分?jǐn)?shù)明確:從0到1反應(yīng)出最差到最優(yōu)的表現(xiàn);
解釋直觀:差的調(diào)和平均數(shù)可以在同質(zhì)性和完整性方面做定性的分析;
對(duì)簇結(jié)構(gòu)不作假設(shè):可以比較兩種聚類(lèi)算法如k均值算法和譜聚類(lèi)算法的結(jié)果。
缺點(diǎn):
以前引入的度量在隨機(jī)標(biāo)記方面沒(méi)有規(guī)范化,這意味著,根據(jù)樣本數(shù),集群和先驗(yàn)知識(shí),完全隨機(jī)標(biāo)簽并不總是產(chǎn)生相同的完整性和均勻性的值,所得調(diào)和平均值V-measure也不相同。特別是,隨機(jī)標(biāo)記不會(huì)產(chǎn)生零分,特別是當(dāng)簇的數(shù)量很大時(shí)。
當(dāng)樣本數(shù)大于一千,聚類(lèi)數(shù)小于10時(shí),可以安全地忽略該問(wèn)題。對(duì)于較小的樣本量或更大數(shù)量的集群,使用經(jīng)過(guò)調(diào)整的指數(shù)(如調(diào)整蘭德指數(shù))更為安全。
這些指標(biāo)要求的先驗(yàn)知識(shí),在實(shí)踐中幾乎不可用或需要手動(dòng)分配的人作注解者(如在監(jiān)督學(xué)習(xí)環(huán)境中)。
3. sklearn實(shí)現(xiàn)方法
sklearn.metrics類(lèi)的homogeneity_score和completeness_score方法分別用來(lái)求得同質(zhì)性和完整性分?jǐn)?shù),示例代碼:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.homogeneity_score(labels_true, labels_pred)
0.66...
>>> metrics.completeness_score(labels_true, labels_pred)
0.42...
兩者的調(diào)和平均V-measure,示例代碼:
>>> metrics.v_measure_score(labels_true, labels_pred)
0.51...
metrics類(lèi)的homogeneity_completeness_v_measure融合了以上方法,分別能求得相關(guān)值,示例代碼:
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...
(0.66..., 0.42..., 0.51...)
以下預(yù)測(cè)的評(píng)分略好,體現(xiàn)在同質(zhì)性而非完整性,示例代碼:
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 0, 1, 2, 2]
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...
(1.0, 0.68..., 0.81...)
7.9.4 Fowlkes-Mallows scores
Fowlkes-Mallows指數(shù)是針對(duì)訓(xùn)練集和驗(yàn)證集數(shù)據(jù)之間求得的查全率和查準(zhǔn)率的幾何平均值,其公式為:
示例代碼:
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>>
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.47140...
7.9.5 輪廓系數(shù) Silhouette Coefficient
輪廓系數(shù)適用于實(shí)際類(lèi)別信息未知的情況。對(duì)于單個(gè)樣本,設(shè)a是與它同類(lèi)別中其他樣本的平均距離,b是與它距離最近不同類(lèi)別中樣本的平均距離,其輪廓系數(shù)為:
對(duì)于一個(gè)樣本集合,它的輪廓系數(shù)是所有樣本輪廓系數(shù)的平均值。
輪廓系數(shù)的取值范圍是[-1,1],同類(lèi)別樣本距離越相近不同類(lèi)別樣本距離越遠(yuǎn),分?jǐn)?shù)越高。
示例代碼:
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> dataset = datasets.load_iris()
>>> X = dataset.data
>>> y = dataset.target
>>> import numpy as np
>>> from sklearn.cluster import KMeans
>>> kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans_model.labels_
>>> metrics.silhouette_score(X, labels, metric='euclidean')
...
0.55...
總結(jié)
以上是生活随笔為你收集整理的聚类模型ari_7.9 聚类模型评估的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软件观念革命:交互设计精髓_2021年中
- 下一篇: ubuntu下命令安装与卸载软件方法