赞
踩
对应于https://web.stanford.edu/~jurafsky/slp3/4.pdf的4.7到4.10
当评估文本分类系统时,通常使用混淆矩阵,混淆矩阵是一个二维表格,用于可视化算法在与人工标签(即金标签)的关系中的性能表现。混淆矩阵有两个维度:系统输出和金标签,每个单元格表示一组可能的结果。在垃圾邮件检测的情况下,例如,真正例(True Positives)是指系统正确地将确实是垃圾邮件的文档(由人工金标签指示)标记为垃圾邮件。假反例(False Negatives)是指确实是垃圾邮件的文档,但我们的系统错误地标记为非垃圾邮件。
在混淆矩阵的右下角是准确度(Accuracy)的公式,它用来衡量系统正确标记的所有观察值的百分比。尽管准确度可能看起来是一个自然的度量标准,但在文本分类任务中,通常不使用它。这是因为当类别不平衡时,准确度不适用,而在垃圾邮件检测这类任务中,类别通常不平衡,因为垃圾邮件占绝大多数,而与之相反的情况较少。
准确度(Accuracy)不是一个好的评估指标,以及为什么我们更倾向于使用精确率(Precision)和召回率(Recall)来评估性能。
首先,假设有一百万条推特,其中只有100条是关于美味馅饼的。如果一个愚蠢的分类器简单地将所有推特都标记为“不是关于馅饼”,那么这个分类器会有999,900个真负例和100个假负例,从而得到了99.99%的准确度。看起来准确度非常高,但这个“没有馅饼”分类器实际上是毫无用处的,因为它无法找到任何我们正在寻找的与顾客评论相关的推文。这说明在目标是发现罕见事物或至少在频率上不平衡的情况下,准确度不是一个好的指标。
因此,我们通常转向两个其他度量标准,即精确率和召回率。精确率(Precision)衡量系统正确检测到的项目中,实际上是正类别的百分比(根据人工金标签定义)。
精确率和召回率有助于解决“没有馅饼”分类器的问题。尽管这个分类器具有99.99%的准确度,但召回率却为0(因为没有真正例,而有100个假反例,所以召回率为0/100)。你应该明白找到相关推文的精确率同样有问题。因此,与准确度不同,精确率和召回率强调真正例,即找到我们要寻找的内容。
为了综合精确率和召回率的影响,可以使用F1分数(F-measure),它是这两者的加权调和均值
为了更全面地评估文本分类系统,我们引入了以下三个关键度量标准:
1. **精确率(Precision)**:精确率衡量系统标记为正类别(例如垃圾邮件或美味馅饼相关的文本)的文档中,有多少是真正的正类别。精确率的计算公式如下:
2. **召回率(Recall)**:召回率衡量了系统能够正确识别的真正正类别文档的比例。召回率的计算公式如下:
3. **F1分数(F-measure)**:F1分数综合考虑了精确率和召回率,它是精确率和召回率的调和均值,用于平衡这两个度量标准。F1分数的计算公式如下:
这三个度量标准一起提供了对文本分类系统性能的更全面评估。精确率强调了系统的准确性,召回率强调了系统的全面性,而F1分数在二者之间取得平衡。在不平衡类别的情况下,这些度量标准通常比准确度更有实际意义。
此外,还可以引入参数β,根据应用程序的需要不同加权召回率和精确率。当β>1时,更注重召回率,当β<1时,更注重精确率。当β=1时,精确率和召回率平衡,这也是最常使用的度量标准,通常被称为F1分数。 F1分数来源于精确率和召回率的加权调和平均。
在文本分类中,训练和测试的过程类似于我们在语言建模中看到的过程。首先,我们使用训练集来训练模型,然后使用开发测试集(也称为开发集)来调整一些参数,以确定最佳的模型。一旦我们确定了我们认为是最佳模型,就会在(迄今为止未见过的)测试集上运行它,以报告其性能。使用开发测试集可以避免过拟合测试集的问题。
然而,固定的训练集、开发集和测试集也会引入另一个问题:为了节省数据用于训练,测试集(或开发集)可能不足以具有代表性。那么,如果我们能够在训练时使用所有数据,同时在测试时仍然使用交叉验证,是否会更好呢?这可以通过交叉验证来实现。
在交叉验证中,我们选择一个数字k,并将数据分成k个不相交的子集,称为折叠(folds)。现在,我们选择其中一个折叠作为测试集,在其余的k - 1个折叠上训练我们的分类器,然后计算测试集上的错误率。然后,我们再选择另一个折叠作为测试集,再次在其余的k - 1个折叠上训练。我们重复这个抽样过程k次,并对这k次运行的测试集错误率进行平均,以获得平均错误率。如果我们选择k = 10,那么我们将训练10个不同的模型(每个模型使用90%的数据),测试模型10次,并对这10个值进行平均。这被称为10折交叉验证。
交叉验证的唯一问题是,因为所有数据都用于测试,整个语料库必须是盲目的;我们不能检查任何数据以提出可能的特征,了解发生了什么,因为那样就会窥探测试集,这种作弊会导致我们高估系统性能。然而,观察语料库以理解发生了什么在设计自然语言处理系统中很重要!那么应该怎么办呢?因此,通常会创建一个固定的训练集和测试集,然后在训练集内执行10折交叉验证,但在测试集中以正常方式计算错误率,如图所示。这样可以在测试集中获得真实的性能评估,同时允许在训练集内进行交叉验证以更好地理解数据。
统计显著性测试是用于比较两个系统性能的方法,尤其是在自然语言处理(NLP)中。
在构建系统时,我们经常需要比较两个系统的性能。我们如何知道我们刚刚构建的新系统是否比旧系统更好?或者是否比文献中描述的其他系统更好?这涉及到统计假设检验的领域,在本节中,我们介绍了NLP分类器的统计显著性测试
当我们需要比较两个系统的性能时,我们想知道新系统是否比旧系统更好。为了回答这个问题,我们使用统计假设检验,其中我们将性能指标(比如F1分数或准确度)称为M。我们想知道系统A在某个测试集x上的M值是否比系统B更高。
假设我们发现A在x上的M值比B高了0.04,我们是否可以确定A更好?不一定,因为这可能只是因为偶然性造成的。我们需要知道A是否在不同的测试集或不同的情况下仍然更好。为了回答这个问题,我们使用了统计假设检验。
在假设检验中,我们有两个假设:零假设(H0)和备择假设(H1)。零假设假设A不比B好,而备择假设假设A更好。
我们想知道,如果零假设H0成立,那么在所有可能的测试集中,我们会看到我们找到的δ(x)值的概率有多大。这个概率被称为p-值,它是在零假设H0为真的情况下,观察到我们找到的δ(x)值或更大值的概率。如果p-值很小,意味着我们观察到的差异在零假设下是非常不太可能发生的,我们可以拒绝零假设,认为A确实比B更好。
通常,我们使用阈值(如0.05或0.01)来判断p-值是否小于阈值。如果p-值小于阈值,我们认为结果是具有统计显著性的,即A确实比B更好。
为了计算p-值,通常在NLP中使用非参数检验,如自助法检验。这种方法不依赖于数据的分布,而是通过多次随机抽样来估计概率。我们创建多个不同版本的实验设置,计算各个版本下的δ(x)值,然后观察这些值的分布。如果观察到的差异在分布中是非常不寻常的,即p-值很小,我们就可以拒绝零假设,认为A确实比B更好。这种方法通常在NLP中用于比较两个系统在相同测试集上的性能。
Bootstrap测试是一种用于比较两个系统性能的方法,可以适用于任何性能度量,如准确度、精确度、召回率或F1分数等。它的基本思想是通过多次随机抽样创建虚拟测试集,然后对这些虚拟测试集进行统计分析。
以一个小的文本分类示例为例,假设我们有一个包含10个文档的测试集x,对其进行分类并计算两个分类器(A和B)的性能。每个文档都可以被标记为以下四种情况之一:A和B都正确、A和B都错误、A正确B错误、A错误B正确。我们使用某个性能度量(例如准确度)来计算A和B的性能差异,即δ(x)。
接下来,我们创建大量b个虚拟测试集x(i),每个虚拟测试集的大小都是n = 10。为了创建每个虚拟测试集x(i),我们从原始测试集x中进行有放回的随机抽样,重复n = 10次。换句话说,我们从原始测试集x中多次随机选择一个单元格,并将其复制到新的虚拟测试集x(i)中。
创建了这些虚拟测试集后,我们可以对A是否具有偶然优势进行统计分析。我们使用估算的p-value来衡量观察到的差异有多大概率是偶然的。p-value表示,在假设A不比B好的情况下,我们观察到的δ(x)值或更大的概率。
p-value的计算方式是在许多虚拟测试集中计算δ(x(i))是否大于等于2δ(x)的次数,并将满足条件的次数占总次数的比例作为p-value。如果p-value小于事先设定的阈值(如0.01),则我们可以拒绝零假设,认为A确实比B更好。
在文本分类中,需要避免可能导致伤害的问题,这些伤害不仅存在于朴素贝叶斯分类器中,也存在于后续章节中介绍的其他分类算法中。
一类伤害是表征性伤害(Crawford 2017,Blodgett et al. 2020),这种伤害是由系统造成的,它通过贬低一个社会群体来产生,例如通过持续传播关于他们的负面刻板印象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。