機器學習:聚類算法的模型評估指標:輪廓係數

不同於分類模型和迴歸,聚類算法的模型評估不是一件簡單的事。
在分類中,有直接結果(標籤)的輸出,並且分類的結果有正誤之分,所以使用預測的準確度,混淆矩陣,ROC曲線等指標來進行評估。但無論如何評估,都是在”模型找到正確答案“的能力。而回歸中,由於要擬合數據,我們有MSE均方誤差,有損失函數來衡量模型的擬合程度。但這些衡量指標都不適用於聚類。

如何衡量聚類算法的效果

聚類模型的結果不是某種標籤輸出,並且聚類的結果是不確定的,其優劣由業務需求或者算法需求來決定,並且沒有永遠的正確答案。如何衡量聚類的效果呢?
K-Means的目標是確保“簇內差異小,簇外差異大”,可以通過衡量簇內差異來衡量聚類的效果。
SSE是用距離來衡量簇內差異的指標,因此,是否可以用SSE來作爲聚類的衡量指標呢?SSE越小模型越好嘛。
可以,但是這個指標的缺點和侷限太大。
首先,它不是有界的。我們只知道,SSE越小越好,是0最好,但不知道,一個較小的SSE究竟有沒有達到模型的極限,能否繼續提高。
第二,它的計算太容易受到特徵數目的影響,數據維度很大的時候,SSE的計算量會陷入維度詛咒之中,計算量會爆炸,不適合用來一次次評估模型。
第三,它會受到超參數K的影響,隨着K越大,SSE註定會越來越小,但這並不代表模型的效果越來越好了。
第四,SSE對數據的分佈有假設,它假設數據滿足凸分佈(即數據在二維平面圖像上看起來是一個凸函數的樣子),並且它假設數據是各向同性的(isotropic),即是說數據的屬性在不同方向上代表着相同的含義。但是現實中的數據往往不是這樣。所以使用Inertia作爲評估指標,會讓聚類算法在一些細長簇,環形簇,或者不規則形狀的流形時表現不佳:
在這裏插入圖片描述
那我們可以使用什麼指標呢?聚類沒有標籤,即不知道真實答案的預測算法,我們必須完全依賴評價簇內的稠密程度(簇內差異小)和簇間的離散程度(簇外差異大)來評估聚類的效果。其中,輪廓係數是最常用的聚類算法的評價指標。它是對每個樣本來定義的,它能夠同時衡量:
1)樣本與其自身所在的簇中的其他樣本的相似度a,等於樣本與同一簇中所有其他點之間的平均距離;
2)樣本與其他簇中的樣本的相似度b,等於樣本與下一個最近的簇中的所有點之間的平均距離;
根據聚類的要求 ”簇內差異小,簇外差異大“,我們希望b永遠大於a,並且大得越多越好。
單個樣本的輪廓係數計算爲:
s=bamax(a,b)s=\frac{b-a}{max(a,b)}
這個公式可以被解析爲:
在這裏插入圖片描述
很容易理解輪廓係數範圍是(-1,1),其中值越接近1表示樣本與自己所在的簇中的樣本很相似,並且與其他簇中的樣本不相似,當樣本點與簇外的樣本更更相似的時候,輪廓係數就爲負。當輪廓係數爲0時,則代表兩個簇中的樣本相似度一致,兩個簇本應該是一個簇。
如果一個簇中的大多數樣本具有比較高的輪廓係數,則簇會有較高的總輪廓係數,則整個數據集的平均輪廓係數越高,則聚類是合適的。如果許多樣本點具有低輪廓係數甚至負值,則聚類是不合適的,聚類的超參數K可能設定得太大或者太小。
在sklearn中,我們使用模塊metrics中的類silhouette_score來計算輪廓係數,它返回的是一個數據集中,所有樣本的輪廓係數的均值。但我們還有同在metrics模塊中的silhouette_sample,它的參數與輪廓係數一致,但返回的是數據集中每個樣本自己的輪廓係數。
我們來看看輪廓係數在我們自建的數據集上表現如何:
在上篇博文《sklearn機器學習:K-Means》中,我們自己建了一個有4箇中心的各向同性高斯團簇的數據點集,數據點分佈如下
在這裏插入圖片描述
下面分別以k=3,4,5來驗證一下輪廓係數的篩選效果:

n_clusters = 3
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
silhouette_score(X,cluster_.labels_)
0.5882004012129721
n_clusters = 4
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
silhouette_score(X,cluster_.labels_)
0.6505186632729437
n_clusters = 5
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
silhouette_score(X,cluster_.labels_)
0.5746932321727457

可見,在k=4時,輪廓係數的值最大,符合我們建立的數據集屬性,可見輪廓係數的篩選性是值得肯定的。

silhouette_samples(X,y_pred)
array([ 0.62982017,  0.5034877 ,  0.56148795,  0.84881844,  0.56034142,
        0.78740319,  0.39254042,  0.4424015 ,  0.48582704,  0.41586457,
        0.62497924,  0.75540751,  0.50080674,  0.8452256 ,  0.54730432,
        ...
        0.5748237 ,  0.74655924,  0.57403918,  0.69733646,  0.52992071])

輪廓係數有很多優點,它在有限空間中取值,使得我們對模型的聚類效果有一個“參考”。並且,輪廓係數對數據的分佈沒有假設,因此在很多數據集上都表現良好。但它在每個簇的分割比較清洗時表現最好。但輪廓係數也有缺陷,它在凸型的類上表現會虛高,比如基於密度進行的聚類,或通過DBSCAN獲得的聚類結果,如果使用輪廓係數來衡量,則會表現出比真實聚類效果更高的分數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章