预测肯定能出结果,至于这个预测结果是否是你想要的,就不一定了。一般来说,没有任何模型能百分百保证尽如人意,但我们总是追求尽量好。
什么样的模型算好呢?当然需要测试。当我们训练出了一个模型以后,为了确定它的质量,需要用一些知道预期预测结果的数据来对其进行测试。
三个集合
这些用于测试的数据的集合,叫做测试集。一般而言,除了训练集和测试集,还会需要验证集:
训练集(Train Set)用来训练数据。
验证集(Validation Set)用来在训练的过程中优化模型(模型优化在下面也会单独讲)。
测试集(Test Set)用来检验最终得出的模型的性能。
训练集必须是独立的,和验证集、测试集都无关。验证集和测试集在个别情况下只有一份,不过当然最好还是分开。这三个集合可以从同一份标注数据中随机选取。三者的比例可以是训练集:验证集:测试集=2:1:1,也可以是7:1:2。总之,测试集占大头。
评价指标
在用测试集做测试时,我们需要一些具体的评价指标来评判结果的优劣。不同类型的模型需要不同的测试指标。
不过因为当前用途最广的是分类模型(分类器),今天我们介绍的就是针对分类模型的指标。这个评价指标也可以应用到对seq2seq识别评价上。
最简单也是最常见的验证指标:精准率(Precision)和召回率(Recall),为了综合这两个指标并得出量化结果,又发明了F1Score。
对一个分类模型而言,给它一个输入,它就会输出一个标签,这个标签就是它预测的当前输入的类别。假设数据data1被模型预测的类别是ClassA。那么,对于data1就有两种可能性:data1本来就是ClassA(预测正确),data1本来不是Class_A(预测错误)。
当一个测试集全部被预测完之后,相对于ClassA,会有一些实际是ClassA的数据被预测为其他类,也会有一些其实不是ClassA的,被预测成ClassA,这样的话就导致了下面这个结果:
实际/预测 | 预测类为Class_A | 预测类为其他类 |
---|---|---|
实际类为Class_A | TP:实际为Class_A,也被正确预测的测试数据条数 | FN:实际为Class_A,但被预测为其他类的测试数据条数 |
实际类为其他类 | FP:实际不是ClassA,但被预测为ClassA的数据条数 | TN:实际不是ClassA,也没有被测试为ClassA的数据条数 |
精准率:Precision=TP/(TP+FP),即在所有被预测为Class_A的测试数据中,预测正确的比率。
召回率:Recall=TP/(TP+FN),即在所有实际为Class_A的测试数据中,预测正确的比率。
F1Score = 2*(Precision * Recall)/(Precision + Recall)。
显然上面三个值都是越大越好,但往往在实际当中P和R是矛盾的,很难保证双高。
此处需要注意,P,R,F1Score在分类问题中都是对某一个类而言的。也就是说假设这个模型总共可以分10个类,那么对于每一个类都有一套独立的P,R,F1Score的值。衡量模型整体质量,要综合看所有10套指标,而不是只看一套。
同时,这套指标还和测试数据有关。同样的模型,换一套测试数据后,很可能P,R,F1Score会有变化,如果这种变化超过了一定幅度,就要考虑是否存在bias或者overfitting的情况。
seq2seq识别实际上可以看作是一种位置相关的分类。每一种实体类型都可以被看作一个类别,因此也就同样适用P,R,F1Score指标。
此外还有ROC曲线,PR曲线,AUC等评价指标,大家可以自行查询参考。