机器学习中实现了一个简单的神经网络,但发现在验证的时候,模型对数据打的标签很随意,比如一个四分类问题,groundtruth(简称gt)是gt = [0,0,0,1,2,3,3],而模型在验证集上打的标签是lb = [3,3,3,0,1,2,2],但acc(准确度)是100%,明明标签的数字都对不上,我很好奇它使怎么识别的?
具体代码:
def clustering_acc(y_true, y_pred):
y_true = y_true.astype(np.int64)
assert y_pred.size == y_true.size
D = max(y_pred.max(), y_true.max()) + 1
w = np.zeros((D, D), dtype=np.int64)
for i in range(y_pred.size):
w[y_pred[i], y_true[i]] += 1
ind = linear_assignment(w.max() - w)
return sum([w[i, j] for i, j in ind]) * 1.0 / y_pred.size
acc = clustering_acc(gt,lb)
输出结果为: 1.0
如果在分类问题中,gt = [0,0,0,1,2,3,3]和lb = [3,3,3,0,1,2,2]的准确率是0,因为在分类问题中哪个样本属于哪个类别都是一一对应好的。而在聚类问题中,我们的目的只是把样本分成若干个簇而每个簇不一定要一一对应。
举个例子:现有三个簇A、B、C,且簇中的样本数分别为20、30、50个。
经过聚类算法聚类后得到了三个簇,样本数分别为25、40和35。那这三个簇分别对应A、B和C哪个簇呢? 这时我们就按各个簇中哪个类别的样本数最多,就把它归为哪个簇,然后计算准确率。具体的,假设上诉聚类结果详细情况为第一簇25(其中最多的20个为B)、第二个簇40(最多的28个为C)和第三个簇35(最多的18个A),因此我们就可以认为这三个簇分别对应B、C和A。
则最终准确率为:(20+28+18)/100=0.66
一个极端例子:gt = [0,0,0,0,1,1,1]和lb = [1,1,1,1,0,0,0],如果是分类的结果,那么准确率为0;但如果是聚类的结果那么准确率为1
既然机器学习的模型打标签很随机,那么ACC和NMI是怎么计算的? - 空字符的回答 - 知乎 https://www.zhihu.com/question/372713634/answer/1022964929