天天看點

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

在前面兩篇文章中,筆者已經介紹了兩種聚類算法,同時還通過sklearn完成相應的示例。但是,到目前為止筆者還沒有介紹如何來聚類的經過進行評估。這接下來的這篇文章中,筆者将會介紹在聚類算法中幾種常見的評估名額,以及其中兩種相應的原理。同時,如果不用關系其具體計算過程的,可以直接閱讀第三部分即可。

如同之前介紹的其它算法模型一樣,對于聚類來講我們同樣會通過一些評價名額來衡量聚類算法的優與劣。在聚類任務中,常見的評價名額有:

準确率(Accuracy)、F值(F-score)、調整蘭德系數(Adjusted Rand Index, ARI)和标準互資訊素(Normalized Mutual Info, NMI)

,而這四種評價名額也是聚類相關論文中出現得最多的評價方法。下面,我們首先将對準去率和F值進行一個介紹,然後再對後面兩個名額進行介紹。

1 準确率與F值

準确率與F值這兩個評估名額相信大家聽起來都不會感到陌生,因為我們在第一次介紹分類算法的時候已經介紹過了這兩個名額。既然已經介紹過了為什麼這裡還要拿出來說呢?這是因為分類中的準确率和F值僅僅隻是聚類中的某種情況而已,什麼意思呢?

為了能夠更加清楚的介紹這兩種名額,我們還是以之前的貓狗圖檔識别的任務場景為例:假設我們現在有貓狗圖檔100張,其中貓又25張,狗有75張。現在我們通過某種聚類算法對其進行聚類,聚類的結果為簇A中有38張圖檔(其中20張貓18張狗),簇B中有62張圖檔(其中5張貓57張狗)。那麼請問如何計算該聚類算法的準确率與F值?

由于聚類算法隻會将原始資料樣本劃分為K個簇,但是并不會告訴我們每個簇分别對應那個類别。正如上述聚類結果一樣,聚類算法隻将這100張圖檔聚成了A、B兩個簇,但是我們并不知道到底是簇A和簇B與貓狗的對應關系。是以,我們在計算準确率的時候就要分兩種情況來考慮。

1.1 計算準确率

  • 情況一:将簇A認為是貓,将簇B認為是狗

    在這種假定情況下,我們将得到如下一個混淆矩陣:

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

是以,根據這個混淆矩陣我們便能夠計算出對應的準确率為:

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
  • 情況二:将簇A認為是狗,将簇B認為是貓

    在這種假定情況下,我們将得到另外一個混淆矩陣:

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

是以,根據這個混淆矩陣我們便能夠計算出對應的準确率為:

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

由此我們發現,在不同情況下計算得到的準确率是不一樣的,那我們最終應該選擇哪個呢?當然是選擇最高的,因為它才能真正代表聚類算法的聚類準确率。故,

對于聚類算法來說,準确率可以看作是算法對簇劃分準确度的一個評估名額

。由此可知,我們在計算聚類結果的準确率時,應該分情況進行計算,然後選擇最大值。

1.2 計算F值

有了上面計算準确率過程的鋪墊,同理可知在不同情況下也會對應有不同的準确率與召回率,是以也就會得到不同的F值。具體的,

  • 對于情況一來說,貓狗對應的精确率為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
    召回率為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
    F值為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
  • 對于情況二來說,貓狗對應的精确率為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
    召回率為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額
    F值為:
    觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

到此我們就分别計算出了兩種情況下貓狗對應的F值,那我們應該選擇哪種情況呢?自然的第一種情況對吧。但是由于不同類别都會對應有一個F值,那應該怎麼來計算得到整體的F值呢?由于不同類别的資料樣本在總樣本中的占比不同,是以我們可以根據每個類别在總樣本中的占比來權重得到F值,即:

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

是以對于本次聚類結果來說,其最終的準确率為

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

,F值為

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

2 ARI與NMI

調整蘭德系數是蘭德系數的一個改進版本,總的來說蘭德系數是通過計算兩個簇之間的相似度來對聚類結果進行評估。而調整蘭德系數是對蘭德系數基于幾率正則化的一種改進。至于标準互資訊素,它也是基于互資訊素的一種改進,總的來說互資訊素也是用來衡量兩種聚類結果(标簽)之前相似程度的一個名額。關于這兩種評價名額的具體計算方法在這裡就先不進行介紹了,因為筆者自己也并不清楚,隻是作為拿來主義直接進行使用的。下面分别是ARI和NMI的使用示例:

from sklearn.metrics.cluster import adjusted_rand_score
from sklearn.metrics.cluster import normalized_mutual_info_score

if __name__ == '__main__':
    y_true = [0, 0, 0, 1, 1, 1]
    y_pred = [0, 0, 1, 1, 2, 2]
    ARI = adjusted_rand_score(y_true,y_pred)
    NMI = normalized_mutual_info_score(y_true,y_pred)
    print("ARI: {}, NMI: {}".format(ARI,NMI))
#結果:
ARI: 0.24242424242424246, NMI: 0.5158037429793889jj
           

其中ARI的取值範圍為

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

,NMI的取值範圍為

觸發器可以劃分為幾種類别?分别是什麼_幾種常見的聚類評估名額

,兩者均為結果越接近于1聚類效果越好。

3 使用方法

由于筆者之前曾做過一些關于聚類方面的工作,用的也是上述四種評價名額。是以,在這裡就直接給大家貼出一份整合四項名額的一份代碼[2],如果有需要直接調用即可。

  • ARI與NMI

    對于這兩種評估名額,示例中的代碼也是直接調用的sklearn中的方法

    NMI = normalized_mutual_info_score(y_true, y_pred)

    ARI = adjusted_rand_score(y_true, y_pred)

  • 準确率和F值

    對于這兩種名額,很遺憾sklearn中并沒有實作。筆者當時也是參考了一份基于matlib的代碼改寫而來,但是現在找不到代碼出處了,是以也就無法加上引用了,在此表示感謝。

if __name__ == '__main__':
    y_true = [0] * 20 + [1] * 18 + [1] * 57 + [0] * 5
    y_pred = [0] * 38 + [1] * 62
    metrics = Metrics(y_true, y_pred)
    fsc, acc, nmi, ari = metrics.getFscAccNmiAri()
    print("Fscore:{} , Accuracy:{}, NMI:{}, ARI:{}".format(fsc, acc, nmi, ari))
#結果:
Fscore:0.7828177499710347 , Accuracy:0.77, NMI:0.20491462701724053, ARI:0.27600559939546343
           

如上代碼所示便是對類

Metrics

調用的示例,通過

getFscAccNmiAri()

方法我們就能夠一次得到四種名額的評估結果。

4 總結

在本篇文章中,筆者首先介紹了四種常見的聚類評價名額,包括準确率、F值、調整蘭德系數和調整互資訊素;同時筆者還就前兩種名額的原理和計算過程進行了說明;最後,筆者還對這四種名額進行了整合,通過調用類

Metrics

中的``getFscAccNmiAri()`方法即可一次得到四項評估結果。本次内容就到此結束,感謝閱讀!

若有任何疑問與見解,請發郵件至[email protected]并附上文章連結,青山不改,綠水長流,月來客棧見!

引用

[1]https://scikit-learn.org/stable/modules/clustering.html#clustering-evaluation

[2]示例代碼 : https://github.com/moon-hotel/MachineLearningWithMe

近期文章

[1]Kmeans聚類算法

[2]Kmeans聚類算法求解與實作

[3]Kmeans++聚類算法