测量排序列表之间的错误率

时间:2010-12-02 21:38:43

标签: math statistics classification

我正在尝试衡量两种不同分类系统之间的协议(其中一种基于机器学习算法,另一种基于人类地面实施),我正在寻找来自实施者的输入类似的系统。

分类模式允许每个项目在类别分类中被分类为多个不同的节点,其中每个分类带有权重系数。例如,如果某个项目可以分为四个不同的分类法节点,那么对于算法和地面实况分类器,结果可能如下所示:

                ALGO    TRUTH
CATEGORY A:     0.35     0.50
CATEGORY B:     0.30     0.30
CATEGORY C:     0.25     0.15
CATEGORY D:     0.10     0.05

对于所有选定的类别节点(在分类分类中大约有200个),权重总是精确地加1.0。

在上面的例子中,重要的是要注意两个列表都同意排名顺序(ABCD),因此它们应该被评为彼此强烈一致(即使每个类别的权重存在一些差异)相比之下,在下一个例子中,两个分类在排序方面完全不一致:

                ALGO    TRUTH
CATEGORY A:     0.40     0.10
CATEGORY B:     0.35     0.15
CATEGORY C:     0.15     0.35
CATEGORY D:     0.10     0.40

因此,这样的结果应得到非常低的分数。

最后一个例子说明了一个常见的情况,即人为生成的地面实况包含重复的权重值:

                ALGO    TRUTH
CATEGORY A:     0.40     0.50
CATEGORY B:     0.35     0.50
CATEGORY C:     0.15     0.00
CATEGORY D:     0.10     0.00

因此,重要的是该算法允许列表没有完美的排序顺序(因为基本事实可以被有效地解释为ABCD,ABDC,BACD或BADC)

我到目前为止尝试过的东西:

  • Root Mean Squared Error (RMSE):非常有问题。它不考虑排序协议,这意味着列表顶部的类别之间的严重分歧是通过关于列表底部类别的协议进行的。

  • Spearman's Rank Correlation:虽然它考虑了排名的差异,但它对列表顶部的排名协议和列表底部的排名协议给予了相同的权重。只要高级别差异导致错误度量,我就不太关心低级差异。它也不处理多个类别可以具有排位值排名的情况。

  • Kendall Tau Rank Correlation Coefficient:据我所知,具有与Spearman等级相关性相同的基本属性和限制。

我一直在考虑推广我自己的临时指标,但我不是数学家,所以我怀疑自己的小指标是否会提供非常严格的价值。如果有这种事情的标准方法,我宁愿使用它。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

好的,我决定实施加权RMSE。它不是 直接 帐户的排名关系,但加权系统会自动强调列表顶部的条目。

仅供审阅(对于不熟悉RMSE的人),方程式如下所示,假设有两个不同的分类器A和B,其结果包含在同名数组中:

RMSE Equation http://benjismith.net/images/rmse.png

在java中,实现如下所示:

double[] A = getAFromSomewhere();
double[] B = getBFromSomewhere();

// Assumes that A and B have the same length. If not, your classifier is broken.
int count = A.length;

double sumSquaredError = 0;
for (int i = 0; i < count; i++) {
   double aElement = A[i];
   double bElement = B[i];
   double error = aElement - bElement;
   double squaredError = error * error;
   sumSquaredError += squaredError;
}
double meanSquaredError = sumSquaredError / count;
double rootMeanSquaredError = Math.sqrt(meanSquaredError);

这是我修改后的实现的起点。我需要提出一个加权系统来计算这两个值的合并幅度(来自两个分类器)。所以我将每个平方误差值乘以SQRT(Ai^2 + Bi^2),这是一个普通的欧几里德距离函数。

当然,由于我在分子中使用加权误差,我还需要使用分母中所有权重的总和,以便将我的结果重新归一化为(0.0,1.0)范围。

我将新指标称为“RMWSE”,因为它是根均值 加权 平方误差。这是新等式的样子:

RMWSE Equation http://benjismith.net/images/rmwse.png

这就是java中的样子:

double[] A = getAFromSomewhere();
double[] B = getBFromSomewhere();

// Assumes that A and B have the same length. If not, your classifier is broken.
int count = A.length;

double sumWeightedSquaredError = 0;
double sumWeights = 0;
for (int i = 0; i < count; i++) {
   double aElement = A[i];
   double bElement = B[i];
   double error = aElement - bElement;
   double squaredError = error * error;
   double weight = Math.sqrt((aElement * aElement) + (bElement * bElement));
   double weightedSquaredError = weight * squaredError;
   sumWeightedSquaredError += weightedSquaredError;
   sumWeights += weight;
}
double meanWeightedSquaredError = sumWeightedSquaredError / sumWeights;
double rootMeanWeightedSquaredError = Math.sqrt(meanWeightedSquaredError);

为了让您了解这个权重在实践中如何运作,假设我的两个分类器为某些类别生成0.950.85值。这两个值之间的误差为0.10,但权重为1.2748(我使用SQRT(0.95^2 + 0.85^2)得出)。加权误差为0.12748

同样,如果分类器为其他类别生成0.450.35,则错误仍为0.10,但权重仅为0.5701,且加权因此,错误仅为0.05701

因此,来自两个分类器的具有高值的任何类别将比仅来自单个分类器的具有高值的类别或来自两个分类器的具有低值的类别的权重更重。

当我的分类值重新规范化时,这种方法效果最佳,因此A和B中的最大值都是1.0,所有其他值按比例放大。因此,对于任何给定的分类器,维度不再总和为1.0,但无论如何这并不重要,因为我没有利用该属性来获得任何有用的东西。

有趣的是,我对我在数据集中给出的结果非常满意,但如果有人有任何改进的想法,我会完全接受建议!

答案 1 :(得分:1)

我认为你不必担心这种程度的严谨性。如果你想比其他人更多地加权某些类型的协议,这是完全合法的。

例如,仅针对前k个类别计算Spearman's。我认为你应该得到完全合理的答案。

您还可以执行z变换等将所有内容映射到[0,1],同时保留您认为是数据集的“重要”部分(差异,差异等)然后您可以利用可用的大量假设检验函数。

(作为旁注,你可以修改Spearman来解释关系。请参阅Wikipedia。)