如何计算分类错误率
Posted
技术标签:
【中文标题】如何计算分类错误率【英文标题】:How to calculate classification error rate 【发布时间】:2012-04-21 11:11:50 【问题描述】:好的。现在这个问题很难。我给你举个例子。
现在左边的数字是我的算法分类,右边的数字是原始的类号
177 86
177 86
177 86
177 86
177 86
177 86
177 86
177 86
177 86
177 89
177 89
177 89
177 89
177 89
177 89
177 89
所以在这里我的算法将 2 个不同的类合并为 1 个。如您所见,它将 86 和 89 类合并为一个类。那么上面例子中的错误是什么?
或者这里是另一个例子
203 7
203 7
203 7
203 7
16 7
203 7
17 7
16 7
203 7
在上面的例子中,左边的数字是我的算法分类,右边的数字是原始的类 id。如上所示,它错过了分类 3 种产品(我正在对相同的商业产品进行分类)。那么在这个例子中,错误率是多少?你会怎么计算。
这个问题非常困难和复杂。我们已经完成了分类,但我们无法找到计算成功率的正确算法:D
【问题讨论】:
【参考方案1】:如果你想评估算法的性能,你必须定义错误标准,所以我不确定你到底在问什么。在某些聚类和机器学习算法中,您可以定义错误度量并将其最小化。
看看这个 https://en.wikipedia.org/wiki/Confusion_matrix 得到一些想法
【讨论】:
【参考方案2】:您必须定义一个错误指标来衡量自己。在您的情况下,一个简单的方法应该是找到您产品的属性映射为
p = properties(id)
其中id
是产品ID,p
可能是具有不同属性的每个条目的向量。然后您可以将两个产品之间的误差函数e
(或距离)定义为
e = d(p1, p2)
当然,每个属性都必须在此函数中计算为一个数字。那么这个误差函数可以用于分类算法和学习。
在您的第二个示例中,您似乎将 (203 7) 对视为成功分类,因此我认为您自己已经有了一个指标。您可能会更具体以获得更好的答案。
【讨论】:
其实我是在问这个问题的指标。我们需要用我们的术语来定义我们的错误成功率,我在问你如何定义它的想法。 所以,我在这里只描述了大致的想法。产品的属性可能是它的类型或价格。如果人们喜欢同价位的产品,你可以简单地使用 d(price1, price2) 我认为您没有正确理解这个问题。想象一下,您有 100 种不同的产品,每种产品在 10 个不同的商家处销售,总共生产 1000 种产品。因此,您正在尝试对每个产品进行正确分组,但算法分类为上述示例。那么你将如何计算你的算法分类成功率。【参考方案3】:这是一个较长的示例,一个具有 10 个输入类别“0”-“9”的真正混淆矩阵 (手写数字), 和标记为 A - J 的 10 个输出集群。
Confusion matrix for 5620 optdigits:
True 0 - 9 down, clusters A - J across
-----------------------------------------------------
A B C D E F G H I J
-----------------------------------------------------
0: 2 4 1 546 1
1: 71 249 11 1 6 228 5
2: 13 5 64 1 13 1 460
3: 29 2 507 20 5 9
4: 33 483 4 38 5 3 2
5: 1 1 2 58 3 480 13
6: 2 1 2 294 1 1 257
7: 1 5 1 546 6 7
8: 415 15 2 5 3 12 13 87 2
9: 46 72 2 357 35 1 47 2
----------------------------------------------------
580 383 496 1002 307 670 549 557 810 266 estimates in each cluster
y class sizes: [554 571 557 572 568 558 558 566 554 562]
kmeans cluster sizes: [ 580 383 496 1002 307 670 549 557 810 266]
例如集群A有580个数据点,其中415个是“8”; 簇 B 有 383 个数据点,其中 249 个是“1”;等等。
问题在于输出类被打乱、置换; 它们按此顺序对应,计数:
A B C D E F G H I J
8 1 4 3 6 7 0 5 2 6
415 249 483 507 294 546 546 480 460 257
有人可以说“成功率”是 75 % = (415 + 249 + 483 + 507 + 294 + 546 + 546 + 480 + 460 + 257) / 5620 但这会丢掉有用的信息—— 在这里,E 和 J 都说“6”,没有集群说“9”。
所以,将混淆矩阵的每一列中的最大数字相加 并除以总数。 但是,如何计算重叠/缺失的集群, 像 2 个“6”,这里没有“9”? 我不知道一个普遍同意的方式 (怀疑Hungarian algorithm 实际使用)。
底线:不要丢弃信息;查看整个混淆矩阵。
NB这样的“成功率”对新数据来说是乐观的! 习惯上将数据分成 2/3 的“训练集”和 1/3 的“测试集”, 训练例如仅在 2/3 上的 k 均值, 然后在测试集上测量混淆/成功率——通常比单独在训练集上更差。 可以说的更多;参见例如 Cross-validation.
【讨论】:
【参考方案4】:分类错误率 (CER) 为 1 - 纯度 (http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html)
ClusterPurity <- function(clusters, classes)
sum(apply(table(classes, clusters), 2, max)) / length(clusters)
@john-colby 的代码 或者
CER <- function(clusters, classes)
1- sum(apply(table(classes, clusters), 2, max)) / length(clusters)
【讨论】:
聚类与分类不同。分类受到监督。以上是关于如何计算分类错误率的主要内容,如果未能解决你的问题,请参考以下文章