关于数学:测量排名列表之间的错误率

Measuring Error Rates Between Rank-Order Lists

我正在尝试衡量两个不同分类系统之间的一致性(其中一个基于机器学习算法,另一个基于人为??基础),我正在寻找实施者的输入类似的系统。

分类方案允许将每个项目分类到类别分类法中的多个不同节点中,其中每个分类都带有权重系数。例如,如果某个项目可以分为四个不同的分类法节点,那么对于算法分类器和真实分类器而言,结果可能如下所示:

1
2
3
4
5
                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),因此应将它们评分为彼此非常一致(即使分配给每个类别的权重也有所不同)相比之下,在下一个示例中,两种分类在等级顺序方面完全不同:

1
2
3
4
5
                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

因此,这样的结果得分会非常低。

最后一个示例演示了一种常见情况,其中人为产生的地面真相包含重复的重量值:

1
2
3
4
5
                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)

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

  • 均方根误差(RMSE):非常有问题。它不考虑等级顺序协议,这意味着列表顶部的类别之间的总分歧已通过关于列表底部的类别的协定而被彻底清除。

  • Spearman的排名相关性:尽管它考虑了排名差异,但它给予同等的权重以将排名最高的协议和排名最低的协议进行排名。我不太在乎低级差异,只要高级差异有助于错误度量即可。它还不能处理多个类别可以具有联系值等级的情况。

  • Kendall Tau等级相关系数:据我所知,具有与Spearman等级相关性相同的基本属性和局限性。

我一直在考虑推出自己的即席指标,但我不是数学家,因此我怀疑自己的小指标是否会提供更严格的价值。如果对于这种事情有某种标准的方法论,我宁愿使用它。

有什么想法吗?


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

仅供参考(对于不熟悉RMSE的任何人),该公式看起来像这样,假设两个不同的分类器A和B,其结果包含在同名数组中:

RMSE公式http://benjismith.net/images/rmse.png

在Java中,实现如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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公式http://benjismith.net/images/rmwse.png

这是Java中的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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,但这并不重要,因为我没有利用该属性获得任何有用的信息。

有趣的是,我对我在数据集中得到的结果感到非常满意,但是如果有人有任何其他改进的想法,我将完全乐意接受建议!


我认为您不必担心如此严格。如果您想对某些类型的协议比其他类型更权重,那是完全合理的。

例如,仅计算前k个类别的Spearman \\。我认为您应该得到完全合法的答案。

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

(作为附带说明,您可以修改Spearman's以解决关系问题。请参阅Wikipedia。)