机器学习评估标准汇总以及在python中的函数调用

机器学习评估标准汇总(未完)

  • 聚类性能度量
    • 外部指标
      • Jaccard系数
      • FM指数
    • 内部指标
      • DB指数
      • Dunn指数
  • 参考资料

python环境

聚类性能度量

外部指标

聚类结果与某个参考模型进行比较

\quad 首先,先定义计算用到的数据集。对于数据集 D = { x 1 , x 2 , . . . , x n } D=\{x_1,x_2,...,x_n\} D={x1,x2,...,xn},假定通过聚类得出的聚类结果为 C = { c 1 , c 2 , . . . c k } C=\{c_1,c_2,...c_k\} C={c1,c2,...ck} ,每一类的类别标签为 λ \lambda λ;参考模型的聚类结果为 C ∗ = { c 1 ∗ , c 2 ∗ , . . . , c s ∗ } C^*=\{c^*_1, c^*_2,...,c^*_s\} C={c1,c2,...,cs},类别标签为 λ ∗ \lambda^* λ
定义四个集合:
a = ∣ S S ∣ , S S = { ( x i , x j ) ∣ λ i = λ j , λ i ∗ = λ j ∗ , i < j } a=|SS|, SS=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda^*_i=\lambda^*_j,ia=SS,SS={(xi,xj)λi=λj,λi=λj,i<j}
b = ∣ S D ∣ , S D = { ( x i , x j ) ∣ λ i = λ j , λ i ∗ ≠ λ j ∗ , i < j } b=|SD|, SD=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda^*_i \neq \lambda^*_j,ib=SD,SD={(xi,xj)λi=λj,λi=λj,i<j}
c = ∣ D S ∣ , D S = { ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ = λ j ∗ , i < j } c=|DS|, DS=\{(x_i,x_j)|\lambda_i \neq \lambda_j,\lambda^*_i=\lambda^*_j,ic=DS,DS={(xi,xj)λi=λj,λi=λj,i<j}
d = ∣ D D ∣ , D D = { ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ ≠ λ j ∗ , i < j } d=|DD|, DD=\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda^*_i\neq\lambda^*_j,id=DD,DD={(xi,xj)λi=λj,λi=λj,i<j}
\quad 也就是说随便从数据集中拿出两个样本来,那么这两个样本要么在同一类,要么不同类,只有这两种情况。那么在两个模型下,就会产生上面的那四种集合。且a+b+c+d=n*(n-1)/2,即无向完全图边的数目。

Jaccard系数

J C = b + c a + b + c JC=\dfrac{b+c}{a+b+c} JC=a+b+cb+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指数

F M I = a a + b ⋅ a a + c FMI=\sqrt{\dfrac{a}{a+b}\cdot\dfrac{a}{a+c}} FMI=a+baa+ca
表示两个集合的相似度
取值[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内样本间的平均距离: a v g ( C ) = 2 ∣ C ∣ ( ∣ C ∣ − 1 ) ∑ 1 ≤ i < j ≤ ∣ C ∣ d i s t ( x i , x j ) avg(C)=\dfrac{2}{|C|(|C|-1)}\sum_{1\le i \lt j \le|C|}dist(x_i,x_j) avg(C)=C(C1)21i<jCdist(xi,xj)
  • 类内最远距离: d i a m ( C ) = m a x 1 ≤ i < j ≤ ∣ C ∣ d i s t ( x i , x j ) diam(C)=max_{1\le i\lt j \le|C|}dist(x_i, x_j) diam(C)=max1i<jCdist(xi,xj)
  • 两类的最近样本间距离: d m i n ( C i , C j ) = m i n x i ∈ C i , x j ∈ C j d i s t ( x i , x j ) d_{min}(C_i, C_j)=min_{x_i\in C_i,x_j \in C_j }dist(x_i,x_j) dmin(Ci,Cj)=minxiCi,xjCjdist(xi,xj)
  • 两类中心点的距离: d c e n ( C i , C j ) = d i s t ( μ i , μ j ) d_{cen}(C_i,C_j)=dist(\mu_i,\mu_j) dcen(Ci,Cj)=dist(μi,μj)

DB指数

D B I = 1 k ∑ i = 1 k m a x j ≠ i ( a v g ( C i ) + a v g ( C j ) d c e n ( μ 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)}) DBI=k1i=1kmaxj=i(dcen(μi,μj)avg(Ci)+avg(Cj))
\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指数

D I = m i n 1 ≤ i ≤ k { m i n j ≠ i ( d m i n ( C i , C j ) max ⁡ 1 ≤ l ≤ k d i a m ( C l ) ) } 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)})\} DI=min1ik{minj=i(max1lkdiam(Cl)dmin(Ci,Cj))}
\quad python中没有现成的DI代码,需要自己造轮子
\quad DI代表了类间的距离关系,值越大越好。

参考资料

[1] : https://scikit-learn.org/stable/modules/classes.html?highlight=ri#module-sklearn.metrics
[2] : 周志华 机器学习 西瓜书

你可能感兴趣的:(数据挖掘,机器学习)