一维数据中的阈值

0 投票
1 回答
564 浏览
提问于 2025-04-18 08:29

我有一组相似度分数 similarity_scores,是通过某种字符串匹配方法计算出来的,目的是比较两段文本之间的相似性。我手动添加了 actual_value,用来表示这些文本是否真的相似。请问有没有什么统计方法可以帮助我找到一个相似度分数的阈值?

similarity_scores   actual_value
1.0 1
1.0 1
1.0 1
1.0 1
0.99    1
0.99    1
0.99    1
0.989   1
0.944   1
0.944   1
0.941   1
0.941   1
0.941   1
0.941   1
0.941   0
0.934   0
0.933   0
0.933   1
0.88    1
0.784   0
0.727   0
0.727   0
0.714   0
0.714   1
0.714   0
0.714   0
0.711   0
0.711   0
0.707   0
0.707   0
0.696   0
0.696   0
0.696   0
0.696   0

1 个回答

2

在文档检索中,评估分类效果的常用方法是使用 精准率和召回率。在你的例子中,对于给定的阈值 [1]

精准率告诉你,超过这个阈值的文档中,有多少百分比是被手动标记为 1 的,或者说,

number of documents above the threshold tagged 1
------------------------------------------------
    number of documents above the threshold

召回率则告诉你,被标记为 1 的文档中,有多少百分比是超过这个阈值的:

number of documents above the threshold tagged 1
------------------------------------------------
         number of documents tagged 1

在你给出的例子中,你可以计算每个可能的阈值的这些值,但只有在零和一之间有变化的阈值才是相关的,所以我只会关注这些点:

1.0 1
1.0 1
1.0 1
1.0 1
0.99    1
0.99    1
0.99    1
0.989   1
0.944   1
0.944   1 TH=0.944 #1's=10; #0's=0
0.941   1
0.941   1
0.941   1
0.941   1
0.941   0 TH=0.941 #1's=14; #0's=1
0.934   0
0.933   0
0.933   1 TH=0.933 #1's=15; #0's=3
0.88    1 TH=0.880 #1's=16; #0's=3
0.784   0
0.727   0
0.727   0
0.714   0
0.714   1
0.714   0
0.714   0 TH=0.714 #1's=17; #0's=9
0.711   0
0.711   0
0.707   0
0.707   0
0.696   0
0.696   0
0.696   0
0.696   0

而被标记为 1 的文档总数是 17

因此,对于这5个可能的阈值 TH,我们得到的 精准率召回率 如下:

TH = 0.944
    precision = 10/10       = 1.000
    recall = 10/17          = 0.588
TH = 0.941
    precision = 14/15       = 0.933
    recall = 14/17          = 0.824
TH = 0.933
    precision = 15/18       = 0.833
    recall = 15/17          = 0.882
TH = 0.880
    precision = 16/19       = 0.842
    recall = 16/17          = 0.941
TH = 0.714
    precision = 17/26       = 0.654
    recall = 17/17          = 1.000

接下来你如何使用这些值,主要取决于你的数据以及对假阴性或假阳性结果的敏感程度。例如,如果你想确保假阳性尽可能少,你可能会选择 TH = 0.941 或者 TH = 0.944

如果你想在精准率和召回率之间取得平衡,可能会选择 TH = 0.880,因为在这个阈值以上,两者都在增加,而在这个阈值以下,精准率要差很多。这种选择方式有点主观,但我们可以通过使用 F值 来在一定程度上自动化这个过程。具体来说,我会使用 F1值,但你可以找到适合你数据的其他方法。

F1值的定义是:

F1 = 2 * precision * recall
         ------------------
         precision + recall

使用上面的数字,我们得到:

TH = 0.944   F1 = 2*1.000*0.588/1.000+0.588 = 0.741
TH = 0.941   F1 = 2*0.933*0.824/0.933+0.824 = 0.875
TH = 0.933   F1 = 2*0.833*0.882/0.833+0.882 = 0.857
TH = 0.880   F1 = 2*0.842*0.941/0.842+0.941 = 0.889
TH = 0.714   F1 = 2*0.654*1.000/0.654+1.000 = 0.791

如你所见,根据 F1 值,TH=0.880 的表现最好,而 TH=0.941 也紧随其后,给出的结果与手动检查可能的阈值非常相似。

[1] 为了澄清,我定义的 阈值 是这样的:相似度分数 大于或等于 阈值的被认为是 高于 阈值,而相似度分数 严格小于 阈值的被认为是 低于 阈值。

撰写回答