機器學習評估標準彙總以及在python中的函數調用


python環境

聚類性能度量

外部指標

聚類結果與某個參考模型進行比較

\quad首先,先定義計算用到的數據集。對於數據集D={x1,x2,...,xn}D=\{x_1,x_2,...,x_n\},假定通過聚類得出的聚類結果爲C={c1,c2,...ck}C=\{c_1,c_2,...c_k\} ,每一類的類別標籤爲λ\lambda;參考模型的聚類結果爲C={c1,c2,...,cs}C^*=\{c^*_1, c^*_2,...,c^*_s\},類別標籤爲λ\lambda^*
定義四個集合:
a=SS,SS={(xi,xj)λi=λj,λi=λj,i<j}a=|SS|, SS=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda^*_i=\lambda^*_j,i<j\}
b=SD,SD={(xi,xj)λi=λj,λiλj,i<j}b=|SD|, SD=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda^*_i \neq \lambda^*_j,i<j\}
c=DS,DS={(xi,xj)λiλj,λi=λj,i<j}c=|DS|, DS=\{(x_i,x_j)|\lambda_i \neq \lambda_j,\lambda^*_i=\lambda^*_j,i<j\}
d=DD,DD={(xi,xj)λiλj,λiλj,i<j}d=|DD|, DD=\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda^*_i\neq\lambda^*_j,i<j\}
\quad也就是說隨便從數據集中拿出兩個樣本來,那麼這兩個樣本要麼在同一類,要麼不同類,只有這兩種情況。那麼在兩個模型下,就會產生上面的那四種集合。且a+b+c+d=n*(n-1)/2,即無向完全圖邊的數目。

Jaccard係數

JC=b+ca+b+cJC=\dfrac{b+c}{a+b+c}
上述公式是python3.7中實現的公式,表明兩個集合的不相似度。

#python=3.7
import scipy.spatial.distance as dist
a=[1,0,1]                 #將上述集合轉換爲布爾集合,相同爲1,不同爲0
b=[0,1,1]
print(dist.jaccard(a,b))  #結果爲0.6666666666666666

FM指數

FMI=aa+baa+cFMI=\sqrt{\dfrac{a}{a+b}\cdot\dfrac{a}{a+c}}
表示兩個集合的相似度
取值[0,1],越接近1相似度越大

#python=3.7
from sklearn.metrics.cluster import fowlkes_mallows_score
#輸入分別爲參照模型標籤集合和預測模型標籤集合
fowlkes_mallows_score([2, 2, 1, 1], [1, 1, 2, 2])#1.0
fowlkes_mallows_score([2, 2, 2, 1], [1, 1, 2, 2])#0.408248290463863

內部指標

直接進行聚類評估,不利用任何參考模型

\quad同樣先定義一些函數:

  • 類C內樣本間的平均距離:avg(C)=2C(C1)1i<jCdist(xi,xj)avg(C)=\dfrac{2}{|C|(|C|-1)}\sum_{1\le i \lt j \le|C|}dist(x_i,x_j)
  • 類內最遠距離:diam(C)=max1i<jCdist(xi,xj)diam(C)=max_{1\le i\lt j \le|C|}dist(x_i, x_j)
  • 兩類的最近樣本間距離:dmin(Ci,Cj)=minxiCi,xjCjdist(xi,xj)d_{min}(C_i, C_j)=min_{x_i\in C_i,x_j \in C_j }dist(x_i,x_j)
  • 兩類中心點的距離:dcen(Ci,Cj)=dist(μi,μj)d_{cen}(C_i,C_j)=dist(\mu_i,\mu_j)

DB指數

DBI=1ki=1kmaxji(avg(Ci)+avg(Cj)dcen(μi,μj))DBI=\dfrac{1}{k}\sum\limits^k_{i=1}max_{j\ne i}(\dfrac{avg(C_i)+avg(C_j)}{d_{cen}(\mu_i,\mu_j)})
\quad當聚類中心未給出時,DB指數可以評估模型聚類的優劣。DB指數反映了類間相似度,所以DBI越接近0,說明聚類效果越好

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import davies_bouldin_score

iris = datasets.load_iris()
X = iris.data       #(150,4) 有四個特徵
kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans.labels_ #(150,)
davies_bouldin_score(X, labels)#0.6619715465007528

Dunn指數

DI=min1ik{minji(dmin(Ci,Cj)max1lkdiam(Cl))}DI=min_{1\le i \le k}\{min_{j\ne i}(\dfrac{d_{min}(C_i,C_j)}{\max_{1\le l \le k}diam(C_l)})\}
\quadpython中沒有現成的DI代碼,需要自己造輪子
\quadDI代表了類間的距離關係,值越大越好。

參考資料

[1] : https://scikit-learn.org/stable/modules/classes.html?highlight=ri#module-sklearn.metrics
[2] : 周志華 機器學習 西瓜書

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