聚类模型ari_7.9 聚类模型评估
如果有了類別標簽,那么聚類結果也可以像分類那樣計算準確率和召回率。但是不應該將分類標簽作為聚類結果的評價指標,除非你有相關的先驗知識或某種假設,知道這種分類類內差距更小。但是它還是給出了幾種評價標準。
7.9.1 調整蘭德系數 (Adjusted Rand index)
1. 數學原理
蘭德系數(Rand index)需要給定實際類別信息C,假設K是聚類結果,a表示在C與K中都是同類別的元素對數,b表示在C與K中都是不同類別的元素對數,則蘭德指數為:
對于以上公式,
分子:屬性一致的樣本數,即同屬于這一類或都不屬于這一類。a是真實在同一類、預測也在同一類的樣本數;b是真實在不同類、預測也在不同類的樣本數;
分母:任意兩個樣本為一類有多少種組合,是數據集中可以組成的總元素對數;
RI取值范圍為[0,1],值越大意味著聚類結果與真實情況越吻合。
對于隨機結果,RI并不能保證分數接近零。為了實現“在聚類結果隨機產生的情況下,指標應該接近零”,調整蘭德系數(Adjusted rand index)被提出,它具有更高的區分度:
ARI取值范圍為[-1,1],值越大意味著聚類結果與真實情況越吻合。從廣義的角度來講,ARI衡量的是兩個數據分布的吻合程度。
2. 優缺點
優點:
對任意數量的聚類中心和樣本數,隨機聚類的ARI都非常接近于0;
取值在[-1,1]之間,負數代表結果不好,越接近于1越好;
可用于聚類算法之間的比較。
缺點:
ARI需要真實標簽
3. python代碼實現
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類使用方法
設定已知先驗知識的標簽為labels_true,利用聚類算法預測的樣本標簽為label_pred,Adjusted Rand index函數是在計算樣本預測值和真實值之間的相似度similarity:同屬于這一類或都不屬于這一類,而不考慮數據元素順序和歸一化。示例代碼:
>>> 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...
我們也可以調整預測集label_pred中元素0和1的位置,以及將數據集中為2的屬性改名為3,其結果不受影響,示例代碼:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
此外,調整adjusted_rand_score函數中labels_true和labels_pred的位置,對結果沒有影響,示例代碼:
>>> metrics.adjusted_rand_score(labels_pred, labels_true)
0.24...
利用此函數評估模型最好的值為1,示例代碼:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
1.0
評估模型最差的值(與labels_true不相關),其結果為負值或接近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 互信息評分(Mutual Information based scores)
1. 數學原理
互信息(Mutual Information)也是用來衡量兩個數據分布的吻合程度。假設U與V是對N個樣本標簽的分配情況,則兩種分布的熵(熵表示的是不確定程度)分別為:
其中:
U與V之間的互信息(MI)定義為:
其中:
標準化后的互信息(Normalized mutual information)為:
不管標簽分配之間的“互信息”的實際數量如何,互信息或者標準化后的值不會因此而調整,而會隨著標簽(簇)數量的增加而增加。
互信息的期望值可以用如下公式來計算:
其中:
ai和bj分別對應著元素屬于Ui和Vj的數量。
與ARI類似,調整互信息( Adjusted mutual information)定義為:
利用基于互信息的方法來衡量聚類效果需要實際類別信息,MI與NMI取值范圍為[0,1],AMI取值范圍為[-1,1],它們都是值越大意味著聚類結果與真實情況越吻合。
2. 優缺點
優點:除取值范圍在[0,1]之間,其他同ARI,可用于聚類模型選擇;
缺點:需要先驗知識。
3. python代碼實現
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類使用方法
設定已知先驗知識的標簽為labels_true,利用聚類算法預測的樣本標簽為label_pred,互信息是衡量兩種預測的一致性,忽略排列的順序。互信息評估有兩種方法,標準化的互信息Normalized Mutual Information(NMI) 和調整后的互信息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...
我們也可以調整預測集label_pred中元素0和1的位置,以及將數據集中為2的屬性改名為3,其結果不受影響,示例代碼:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504..
互信息評分中mutual_info_score,adjusted_mutual_info_score和normalized_mutual_info_score函數其參數都是對稱的,交換的參數位置不會改變評分值,示例代碼:
>>> metrics.adjusted_mutual_info_score(labels_pred, labels_true)
0.22504...
利用此函數評估模型最好的值為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
評估模型最差的值(與labels_true不相關),其結果為非正值,示例代碼:
>>> 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 同質性Homogeneity 完整性completeness 調和平均V-measure
1. 數學原理
同質性homogeneity:每個群集只包含單個類的成員;
完整性completeness:給定類的所有成員都分配給同一個群集。
同質性和完整性分數基于以下公式得出:
其中H(C|K)是給定給定簇賦值的類的條件熵,由以下公式求得:
H(C)是類熵,公式為:
其中,n是樣本總數,nc和nk分別屬于類c和類k的樣本數,而nc,k是從類c劃分到類k的樣本數量。
條件熵H(K|C)和類熵H(K),根據以上公式對稱求得。
V-measure是同質性homogeneity和完整性completeness的調和平均數,公式:
2. 優缺點
優點:
分數明確:從0到1反應出最差到最優的表現;
解釋直觀:差的調和平均數可以在同質性和完整性方面做定性的分析;
對簇結構不作假設:可以比較兩種聚類算法如k均值算法和譜聚類算法的結果。
缺點:
以前引入的度量在隨機標記方面沒有規范化,這意味著,根據樣本數,集群和先驗知識,完全隨機標簽并不總是產生相同的完整性和均勻性的值,所得調和平均值V-measure也不相同。特別是,隨機標記不會產生零分,特別是當簇的數量很大時。
當樣本數大于一千,聚類數小于10時,可以安全地忽略該問題。對于較小的樣本量或更大數量的集群,使用經過調整的指數(如調整蘭德指數)更為安全。
這些指標要求的先驗知識,在實踐中幾乎不可用或需要手動分配的人作注解者(如在監督學習環境中)。
3. sklearn實現方法
sklearn.metrics類的homogeneity_score和completeness_score方法分別用來求得同質性和完整性分數,示例代碼:
>>> 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...
兩者的調和平均V-measure,示例代碼:
>>> metrics.v_measure_score(labels_true, labels_pred)
0.51...
metrics類的homogeneity_completeness_v_measure融合了以上方法,分別能求得相關值,示例代碼:
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...
(0.66..., 0.42..., 0.51...)
以下預測的評分略好,體現在同質性而非完整性,示例代碼:
>>> 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指數是針對訓練集和驗證集數據之間求得的查全率和查準率的幾何平均值,其公式為:
示例代碼:
>>> 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 輪廓系數 Silhouette Coefficient
輪廓系數適用于實際類別信息未知的情況。對于單個樣本,設a是與它同類別中其他樣本的平均距離,b是與它距離最近不同類別中樣本的平均距離,其輪廓系數為:
對于一個樣本集合,它的輪廓系數是所有樣本輪廓系數的平均值。
輪廓系數的取值范圍是[-1,1],同類別樣本距離越相近不同類別樣本距離越遠,分數越高。
示例代碼:
>>> 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...
總結
以上是生活随笔為你收集整理的聚类模型ari_7.9 聚类模型评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件观念革命:交互设计精髓_2021年中
- 下一篇: 黑客们的故事(连载三) 因为好奇