触发器可以划分为几种类别?分别是什么_几种常见的聚类评估指标

c83b96a664a92c34b8137c17b939aa10.png

在前面两篇文章中,笔者已经介绍了两种聚类算法,同时还通过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认为是狗
    在这种假定情况下,我们将得到如下一个混淆矩阵:

01b43c344fa32509aa6fb919b30824fc.png

因此,根据这个混淆矩阵我们便能够计算出对应的准确率为:

  • 情况二:将簇A认为是狗,将簇B认为是猫
    在这种假定情况下,我们将得到另外一个混淆矩阵:

cdcc59df13d3c26ba3220fbcaf658e58.png

因此,根据这个混淆矩阵我们便能够计算出对应的准确率为:

由此我们发现,在不同情况下计算得到的准确率是不一样的,那我们最终应该选择哪个呢?当然是选择最高的,因为它才能真正代表聚类算法的聚类准确率。故,对于聚类算法来说,准确率可以看作是算法对簇划分准确度的一个评估指标。由此可知,我们在计算聚类结果的准确率时,应该分情况进行计算,然后选择最大值。

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()`方法即可一次得到四项评估结果。本次内容就到此结束,感谢阅读!

若有任何疑问与见解,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!

引用

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

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

近期文章

[1]Kmeans聚类算法

[2]Kmeans聚类算法求解与实现

[3]Kmeans++聚类算法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
聚类算法是无监督学习的一种,对于不同的数据集和问题,不同的聚类算法可能会得到不同的聚类效果。因此,需要结合多个聚类评估指标来找到聚类效果最好的算法和参数。 以下是一个结合多个聚类评估指标找到聚类效果最好的算法和参数的Python代码示例: ```python from sklearn import datasets from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score # 加载数据集 iris = datasets.load_iris() X = iris.data # 定义要尝试的参数 n_clusters = [2,3,4,5,6,7] # 初始化评估指标的最小值 best_silhouette_score = -1 best_calinski_harabasz_score = -1 best_davies_bouldin_score = 1000 # 循环尝试不同的参数 for n in n_clusters: # 定义聚类器 kmeans = KMeans(n_clusters=n, random_state=42) # 进行聚类 kmeans.fit(X) # 计算评估指标 silhouette = silhouette_score(X, kmeans.labels_) calinski_harabasz = calinski_harabasz_score(X, kmeans.labels_) davies_bouldin = davies_bouldin_score(X, kmeans.labels_) # 更新最佳评估指标 if silhouette > best_silhouette_score: best_silhouette_score = silhouette best_silhouette_params = {'n_clusters': n} if calinski_harabasz > best_calinski_harabasz_score: best_calinski_harabasz_score = calinski_harabasz best_calinski_harabasz_params = {'n_clusters': n} if davies_bouldin < best_davies_bouldin_score: best_davies_bouldin_score = davies_bouldin best_davies_bouldin_params = {'n_clusters': n} # 输出最佳评估指标和对应的参数 print('Best Silhouette Score:', best_silhouette_score) print('Best Silhouette Parameters:', best_silhouette_params) print('Best Calinski-Harabasz Score:', best_calinski_harabasz_score) print('Best Calinski-Harabasz Parameters:', best_calinski_harabasz_params) print('Best Davies-Bouldin Score:', best_davies_bouldin_score) print('Best Davies-Bouldin Parameters:', best_davies_bouldin_params) ``` 上述代码中,我们首先加载了一个经典的鸢尾花数据集,然后定义了要尝试的参数,即聚类的簇数。接着,我们循环尝试不同的参数,并计算三个聚类评估指标:轮廓系数、Calinski-Harabasz指数和Davies-Bouldin指数。在每次循环中,我们更新三个指标的最佳值和对应的参数。最后,我们输出了三个指标中的最佳值和对应的参数。 这个示例代码中使用了KMeans算法,但是你也可以将其替换为其他聚类算法,如DBSCAN、层次聚类等,以找到最优的聚类算法和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值