本节书摘来自华章计算机《大数据架构和算法实现之路:电商系统的技术实战》一书中的第1章,第1.4节,作者 黄 申,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.4 分类效果评估
到了这一步,你可能会产生几个疑问:机器的分类准确吗?是否会存在错误?不同的分类算法相比较,孰优孰劣呢?这是个很好的问题,确实,我们无法保证分类算法都是准确有效的。不同的应用场景,不同的数据集合都有可能会影响到算法最终的精准度。为了更加客观地衡量其效果,需要采用一些评估的手段。对于分类问题而言,我们最常用的是离线评估。也就是在系统没有上线之前,使用现有的标注数据集合来进行评测。其优势在于,上线之前的测试更便于设计者发现问题。万一发现了可以改进之处,技术调整后也可以再次进行评估,反复测试的效率非常之高。
值得一提的是,分类有两大类型:二分类和多分类。二分类是指判断数据对象属于或不属于一个给定的分类,而多分类则是指将数据对象判定为多个分类中的一个。多分类的评估策略会更复杂一些,不过,可以将其转化为多个二分类问题来对待。所以,让我们从二分类的评估入手,先了解一下表1-1中的混淆矩阵(Confusion Matrix)这个核心概念。
下面就来逐个解释一下这个矩阵中的元素,假设有一组标注好的数据集d,并将其认定为标准答案。其中属于A类的数据称为正例(Positive),不属于A类的另外一部分数据称为负例(Negative),d是正例和负例的并集,而且正例和负例没有交集。这时,可以通过一个分类算法c来判定在这些数据中,是否有一组数据对象属于A类。若c判断属于A类的则称为预测正例(Positive’),而不属于A类的则称为预测负例(Negative’)。如果d标注为正例,c也预测为正例,那么就称为真正例(True Positive,TP)。如果d标注为正例,c预测为负例,那么就称为假负例(False Negative,FN)。如果d标注为负例,c也预测为负例,那么就称为真负例(True Negative,TN)。如果d标注为负例,c预测为正例,那么就称为假正例(False Positive,FP)。
根据混淆矩阵,我们可以依次定义这些指标:精度(Precision)p、召回率(Recall)r、准确率(Accuracy)a和错误率(Error Rate)e。
除了定义评估的指标之外,还需要考虑一个很实际的问题:我们该如何选择训练数据集和测试数据集?进行离线评估的时候,并不需要将全部的标注样本都作为训练集,而是可以预留一部分作为测试集。然而,训练和测试的不同划分方式,可能会对最终评测的结论产生很大的影响,主要原因具体如下。
- 训练样本的数量决定了模型的效果。如果不考虑过拟合的情况,那么对于同一个模型而言,一般情况下训练数据越多,精度就会越高。例如,方案A选择90%的数据作为训练样本来训练模型,剩下10%的数据作为测试样本;而方案B则正好颠倒,只用10%的数据作为训练样本,测试剩下90%的数据。那方案A测试下的模型准确率很可能会比方案B测出的模型准确率要好很多。虽然模型是一样的,但训练和测试的数据比例导致了结论的偏差。
- 不同的样本有不同的数据分布。假设方案A和B都取90%作为训练样本,但是A取的是前90%的部分,而B取的是后90%的部分,二者的数据分布不同,对于模型的训练效果可能也会不同。同理,这时剩下10%的测试数据其分布也会不相同,这些都会导致评测结果不一致。
鉴于此,人们发明了一种称为交叉验证(Cross Validation)的划分和测试方式。其核心思想是每一轮都拿出大部分数据实例进行建模,然后用建立的模型对留下的小部分实例进行预测,最终对本次预测结果进行评估。这个过程反复进行若干轮,直到所有的标注样本都被预测一次而且仅预测一次。用交叉验证的目的是为了得到可靠稳定的模型,其最常见的形式是留一验证和K折交叉。留一验证(Leave One Out)是交叉验证的特殊形式,意指只使用标注数据中的一个数据实例来当作验证资料,而剩余的则全部当作训练数据。这个步骤一直持续到每个实例都被当作一次验证资料。而K折交叉验证(K-fold Cross Validation)是指训练集被随机地划分为K等分,每次都是采用(K – 1)份样本用来训练,最后1份被保留作为验证模型的测试数据。如此交叉验证重复K次,每个1/K子样本验证一次,通过平均K次的结果可以得到整体的评估值。假设有数据集D被切分为K份(d1, d2, …, dk),则交叉过程可按如下形式表示:
如果标注样本的数量足够多,K的值一般取5到30,其中10最为常见。随着K值的增大,训练的成本就会变高,但是模型可能会更精准。当标注集的数据规模很大时,K值可以适当小一些,反之则建议K值适当取值大一些。